Python evaluator via Javascript

Seo Sanghyeon unendliche at hanmail.net
Fri Sep 13 15:44:19 CEST 2002


Python FAQ Entry
4.15. Is it possible to write obfuscated one-liners in Python?
(http://www.python.org/cgi-bin/faqw.py?req=show&file=faq04.015.htp)

As we know from the FAQ, Python is a nice language for writing
obfuscated one-liners. (wink)

Now you can test your one-liners on the web -- using 'Python
evaluator via Javascript'. Since it is for one-liners, you should
type a expression. No statement allowed.

Try the following: (taken from the FAQ)

# without newline
filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0,
map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))

Mysteriously, it works. I couldn't believe it.

Copy the following 116 lines (2825 bytes) and execute. It took about
3 hours for me to write. Perhaps I have too much free time in my hands.

Tested on Win 98, Python 2.2.1, MSIE 6.0.

---- Python evaluator via Javascript ----

def prepare():
    import os
    if not os.path.exists('httpd'):
        os.mkdir('httpd')
    if not os.path.exists('httpd/cgi-bin'):
        os.mkdir('httpd/cgi-bin')
    fp = open('httpd/eval.htm', 'w')
    fp.write(dhtml)
    fp.close()
    fp = open('httpd/cgi-bin/eval.py', 'w')
    fp.write(pycgi)
    fp.close()

def server():
    import os
    os.chdir('httpd')
    from BaseHTTPServer import HTTPServer
    from CGIHTTPServer import CGIHTTPRequestHandler
    serv = HTTPServer(('', 1234), CGIHTTPRequestHandler)
    serv.serve_forever()

def main():
    import thread
    thread.start_new_thread(server, ())
    import time
    time.sleep(10)
    import webbrowser
    webbrowser.open('http://localhost:1234/eval.htm')

def idle():
    while 1:
        pass

dhtml = '''
<html>
<head>
<title>Python Evaluator via Javascript</title>
<script>
function run() {
  line = document.getElementById('expr').value;
  document.getElementById('console').value += '>>> '+line+'\\n';
  document.getElementById('expr').value = '';
  eline = escape(line).replace('+', '%2B');
  addr = 'cgi-bin/eval.py?expr='+eline;
  document.getElementById('cgi').src = addr;
}
function cls() {
  document.getElementById('console').value = '';
}
</script>
</head>
<body>
<div style="font-family: Lucida Console; position: absolute;
 left: 10px; top: 10px; width: 500px; height: 300px;">
 <textarea id="console" style="width: 500px; height: 300px;"
  disabled></textarea>
</div>
<div style="font-family: Lucida Console; position: absolute;
 left: 10px; top: 310px; width: 40px; height: 30px;">
 &gt;&gt;&gt;
</div>
<div style="position: absolute;
 left: 50px; top: 310px; width: 340px; height: 30px;">
 <input type="text" id="expr" style="width: 340px;">
</div>
<div style="position: absolute;
 left: 390px; top: 310px; width: 60px; height: 30px;">
 <input type="button" style="width: 60px;" value="Eval"
  onClick="run();">
</div>
<div style="position: absolute;
 left: 450px; top: 310px; width: 60px; height: 30px;">
 <input type="button" style="width: 60px;" value="Clear"
  onClick="cls();">
</div>
<iframe id="cgi" width="0" height="0">
</body>
</html>
'''

pycgi = '''
import cgi
form = cgi.FieldStorage()

from math import *

try:
    expr = form['expr'].value
    val = str(eval(expr))
except:
    val = ''

print 'Content-Type: text/html'
print
print \'\'\'
<html>
<head>
<title>Python Evaluator via Javascript</title>
<script language="JavaScript">
function run() {
  ret = document.getElementById('val').value;
  parent.document.getElementById('console').value += ret+'\\\\n';
}
</script>
</head>
<body onLoad="run();">
<input type="hidden" id="val" value="%s">
</body>
</html>
\'\'\' % val
'''

prepare()
main()
idle()

---- Python evaluator via Javascript ----

Quiz: Why line 102 has four backslashes?

-- Seo Sanghyeon



More information about the Python-list mailing list