我想制作一个机器人,它允许我定义来自irc的函数,并像Python解释器一样对待我的机器人。Python IRC机器人问题
例如,我想打一个机器人,可以做类似如下:
<mynick> py print "test"
<bot> test
<mynick> define hi(): print "hi"
<mynick> hi()
<bot> hi
我的问题是如何做到这一点
我想制作一个机器人,它允许我定义来自irc的函数,并像Python解释器一样对待我的机器人。Python IRC机器人问题
例如,我想打一个机器人,可以做类似如下:
<mynick> py print "test"
<bot> test
<mynick> define hi(): print "hi"
<mynick> hi()
<bot> hi
我的问题是如何做到这一点
如果你不担心安全问题(如果这是一个个人项目,那么这是一个有效的假设),那么Python有几个函数(compile
,exec
,eval
),可以在这里帮助。请注意,有Python的2和Python 3之间的差异,但下面的例子既适用于:
>>> s = "print('hello world')"
>>> code = compile(s, "<string>", "exec")
>>> exec(code)
hello world
如果你打算让其他人使用此漫游,你将要付出非常小心注意你让别人打电话的功能。例如,os
模块中的大部分内容都有可能在irc bot上下文中做不希望的事情。
我写了skybot,它的功能接近你想要的。
<rmmh> .py print "hello %03d, %s" % (5, "blah")
<skybot> Scaevolus: hello 005, blah
Python解释器在GAE上运行,是修改为不存储状态,以防止有人打破了机器人的http://shell.appspot.com/克隆。
你可以钩住你的代码这样:http://tumbolia.appspot.com/py/
import urllib, urllib2
uri = 'http://tumbolia.appspot.com/py/'
response = urllib2.urlopen(uri + urllib.quote("print 'hello world!'")).read()
print response
这个解决方案的好处是,你不必担心代码在服务器上执行。这就是IRC bot phenny如何执行'.py'命令的python代码。
我希望它是沙盒或只允许**你**运行Python代码。 (不要这样做:)'py __import __(“subprocess”)。call(['rm -rf /'])' – icktoofay 2011-04-02 03:34:25
这太好了。你有什么问题? – 2011-04-02 03:34:41
显然我想知道如何做到这一点。 – Colin 2011-04-02 03:35:26