其实就是08年,设想的,针对上班族,开发一个MSN机器人,通过对MSN机器人发送指令,来玩策略类网页游戏。 当初已经完成了MSN机器人的所有程序部分。通过MSN发送指令,可以完成游戏中几乎所有的建设、军事、消息指令…..
当继续想完善时候,发现完全使用中文是实现,目前缺少完善的AIML中文语料库,这个很难有现有资源利用……
# -*- coding: utf-8 -*- import aiml import sys import time import os.path import thread import re from datetime import datetime import marshal loginemail="xinze@live.cn" # that robot will login to loginpassword="11111" # account password botname="Xinze...." # Robot's nickname admin_email="xinze@live.cn" # emailaddress for admin the robot # ==== normally nothing needs to be changed below ==== rootdir=os.getcwd() configfile="%s/chatbot.ini" % rootdir sessiondir="%s/sessions/%s" % (rootdir,loginemail) os.system("mkdir -p %s" % sessiondir) logfilename="%s/log" % sessiondir sessionfilename="%s/session" % sessiondir os.system("mkdir -p %s/tmp/" % rootdir) msn_fortune="%s/tmp/msn-fortune" % rootdir msn_fortune_zh="%s/tmp/msn-fortune-zh" % rootdir blacklist=['sample@blacklist.org' ] # put here email addresses you want to block blacklist=set(blacklist) adminlist=[admin_email] # the 'admin' account's email address from which you send admin command adminlist=set(adminlist) dlist=[] talkedto=[] use_brain=True def config(configfile, k): # setup bot properties such name, birthplace etc f=open(configfile) g=f.readlines() f.close() for i in g: h=i.split('=') if len(h)==2: k.setBotPredicate(h[0].strip(), h[1].strip()) print sessionfilename # load session if os.path.exists(sessionfilename): f=open(sessionfilename) g=f.read() f.close() g=g.split('\n') for i in g: if i!='': talkedto.append(i) sessionFile = file("%s/%s.ses" %(sessiondir, i), "rb") session = marshal.load(sessionFile) sessionFile.close() for pred,value in session.items(): k.setPredicate(pred, value, i) def dolog(message): global logfile logfile.write(message) logfile.flush() def filter(message): message=message.replace("ALICE", botname) return message def test_msg(senderemail, message): global dlist sender=senderemail.split("@") if senderemail in blacklist: return dlist=[] if not senderemail in set(talkedto): talkedto.append(senderemail) logtime='%s/%s/%s %s:%s:%s' %( datetime.now().month, datetime.now().year, datetime.now().day, datetime.now().hour, datetime.now().minute, datetime.now().second) if not senderemail in adminlist: dolog('=== %s === Recv from %s < %s> ===\n%s\n' % (logtime, sender[0], senderemail, message)) if message=='admquit' and senderemail in adminlist: message="%s is offline!" % botname #quit() if message=='admlist' and senderemail in adminlist: return if k.getPredicate("name", senderemail) =='': dispname=senderemail.split("@") if len(dispname) ==2: k.setPredicate("name", dispname[0], senderemail) remsg=k.respond(message, senderemail) remsg=filter(remsg) logtime='%s/%s/%s %s:%s:%s' %( datetime.now().month, datetime.now().year, datetime.now().day, datetime.now().hour, datetime.now().minute, datetime.now().second) if not senderemail in adminlist: dolog('=== %s === Send to %s < %s>===\n%s\n\n' % (logtime, sender[0], senderemail, remsg)) print remsg def savesession(): # =========== save session f=open(sessionfilename, 'w') for i in talkedto: session = k.getSessionData(i) sessionFile = file("%s/%s.ses" % (sessiondir, i), "wb") marshal.dump(session, sessionFile) sessionFile.close() f.write("%s\n"% i) f.close() def do_work(): time.sleep(5) savesession() # save session data every 10 min thread.start_new_thread(do_work, ()) thread.start_new_thread(do_work, ()) # ================== Initialization if __name__ == '__main__': k = aiml.Kernel() config(configfile, k) #k.verbose(False) # ================== load brain if use_brain and os.path.isfile("standard.brn"): k.bootstrap(brainFile = "standard.brn") else: k.bootstrap(learnFiles = "startup.xml", commands = "load aiml b") k.saveBrain("standard.brn") if os.path.exists(logfilename): logfile=open(logfilename, "a") else: logfile=open(logfilename, "w") player_email="alex@live.cn" while True: message = raw_input('>') test_msg(player_email, message)