利用msnp编写MSN机器人.doc_第1页
利用msnp编写MSN机器人.doc_第2页
利用msnp编写MSN机器人.doc_第3页
利用msnp编写MSN机器人.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网上有一个包msnp,不过很久没更新了,有点问题,修改这个文件就可以用了:/msnp/command.py在Command类的parse函数里面最前面加一句:str = re.sub(NOTIFICATION.*?, , str)就可以用了。注:或者可以:def parse(self, str): if str0=: return #我们要做的MSN机器人有两件事情要做,一个是处理好友发过来的命令,另外一个要定时做点事情然后主动给好友发消息。所以需要两个线程:线程A,线程B# encoding=utf8import msnpimport timeimport sysfrom threading import *help = 帮助:XXXXXXXdef process_command(passport_id, text):args = text.split()if len(args) = 0: return 说话!if args0 = h or args0 = help: return helpreturn 不懂,输入h获取帮助def log(urlid, result, uid):cur = conn.cursor()sql = insert into log (check_url, user_id, result) values (+str(urlid)+, +str(uid)+, +result+)cur.execute(sql)class Checker(Thread):def _init_(self, condition, sleeptime=300): Thread._init_(self) self.cond = condition self.sleeptime = sleeptimedef run(self): global need, msn, CheckFlag cond = self.cond while (True): cond.acquire() do_something() #做任何你想做的事情。默认5分钟一次 friends = msn.friend_list.get_friends() for friend in friends: friend_id = friend.get_passport_id() msn.start_chat(friend_id) #对每一个好友启动对话,启动成功后MsnChatListener.friend_joined会被调用 time.sleep(self.sleeptime)class MsnChatListener(msnp.ChatCallbacks):def message_received(self, passport_id, display_name, text, charset): #收到消息的时候调用 print %s: %s % (passport_id, text) res = process_command(passport_id, text) self.chat.send_message(res, charset)def friend_joined(self, passport_id, display_name): #好友进入对话时调用 try: self.chat.send_message(哈哈哈) except: print error when send message passclass MsnListener(msnp.SessionCallbacks):def chat_started(self, chat): #这个回调函数,会在对话开始的时候调用 callbacks=MsnChatListener() #对话相关的回调函数 chat.callbacks = callbacks callbacks.chat = chatdef state_changed(self, state): #这个回调函数,会在机器人状态发生变化的时候调用 global flag if state = msnp.States.ONLINE: #机器人上线了 print You are now online. if flag = 0: print Start checker checker.start() #启动线程B,由于可能因为不稳定重复登陆,所以需要一个flag,保证线程B只启动一次 flag = 1if _name_ = _main_:global msn, checker, flagcond = Condition() #多线程需要checker = Checker(cond) #线程B的类,在机器人上线之后启动flag = 0#由于MSN不是很稳定,时间长了会自动掉线,所以做了个循环,出错就重新登陆,除了217错误之外while True: try: msn = msnp.Session(MsnListener() #MsnListener里面是回调函数 #输入你的Msn帐号密码 msn.login(, *) #msn.change_display_name(机器人输入h获得帮助) msn.sync_friend_list() while True: try: cess(chats = True) time.sleep(1) except msnp.error.Error, e:#217 错误表示对方不在线,由于这个包判断好友状态不太准,所以我们不能先判断好友是否在线,然后再发消息,我的做法是不管在线离线,统统启动会话,如果对方不 在线,MSN服务器会发217错误,msnp包会抛异常,不管就好了。其他的异常没有处理,出现了之后跳出内部循环,重新登陆。 if e.code = 217: print cess error, e.code, e.message pass else: print cess error, e.code, e.message break except: passCommand类的parse函数的异常从异常信息来看, 是在msnp项目的command.py文件中出现了异常. 异常发生在一个类型转换语句上. 于是开始跟踪, 调试结果被我发现了问题的所在!首先从程序的表征上来看. 程序的异常是紧接着登录发生的, 而从msn上的帐号A来看, B是有成功登录的(当然, 异常发生后帐号B就掉线了). 所以可以大致断定异常发生在登录操作之后, 而且离的比较近. 这个推断可以缩短我们的调试时间:)然后是通用的跟踪调试了! 根据异常信息, 在报错的语句前加print来打印中间结果. 令人惊讶的时候print出来的结果竟然没有一点异常, 但是异常还是在那个地方发生了! 这是个费解的情况, 看来print中间结果这条路是不好走了. 于是我又祭起了Winpdb这个家伙, 开始单步执行我的程序, 并跟踪到command.py中. 终于, 在其中的一步中, 我从cmd窗口中看到了print的异常结果一个XML格式的Notification消息. 问题就是这里了!一般来说, msn登录时候的往返协议消息都是有一定格式的, msnp就是按照这个格式来解析往返的消息. 而根据推断, 这个XML格式的Notification消息应该是在登录过程中没有按照这个格式来发的消息. 从Notification消息的内容来看, 这个消息应该是用来显示msn登录后弹出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论