现在的位置: 首页 > 综合 > 正文

python编写MSN机器人

2018年04月30日 ⁄ 综合 ⁄ 共 2771字 ⁄ 字号 评论关闭
网上有一个包msnp,不过很久没更新了,有点问题,修改这个文件就可以用了:
/msnp/command.py
在Command类的parse函数里面最前面加一句:
str = re.sub('<NOTIFICATION.*?</NOTIFICATION>', '', str)
就可以用了。
注:或者可以:
def parse(self, str):
        if str[0]=='<': return #~

我们要做的MSN机器人有两件事情要做,一个是处理好友发过来的命令,另外一个要定时做点事情然后主动给好友发消息。所以需要两个线程:线程A,线程B

# encoding=utf8
import msnp
import time
import sys
from threading import *

help = '帮助:XXXXXXX'

def process_command(passport_id, text):
args = text.split()
if len(args) == 0:
    return '说话!'
if args[0] == 'h' or args[0] == 'help':
    return help
return '不懂,输入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 = sleeptime

def 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'
        pass

class MsnListener(msnp.SessionCallbacks):
def chat_started(self, chat): #这个回调函数,会在对话开始的时候调用
    callbacks=MsnChatListener() #对话相关的回调函数
    chat.callbacks = callbacks
    callbacks.chat = chat
def 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 = 1

if __name__ == '__main__':
global msn, checker, flag
cond = Condition()       #多线程需要
checker = Checker(cond)      #线程B的类,在机器人上线之后启动
flag = 0
#由于MSN不是很稳定,时间长了会自动掉线,所以做了个循环,出错就重新登陆,除了217错误之外
while True:
    try:
      msn = msnp.Session(MsnListener()) #MsnListener里面是回调函数
      #输入你的Msn帐号密码
      msn.login('ouku.com@live.cn', '****************')
      #msn.change_display_name('机器人-输入h获得帮助')
      msn.sync_friend_list()
      while True:
        try:
          msn.process(chats = True)
          time.sleep(1)
        except msnp.error.Error, e:
#217 错误表示对方不在线,由于这个包判断好友状态不太准,所以我们不能先判断好友是否在线,然后再发消息,我的做法是不管在线离线,统统启动会话,如果对方不 在线,MSN服务器会发217错误,msnp包会抛异常,不管就好了。其他的异常没有处理,出现了之后跳出内部循环,重新登陆。
          if e.code == 217:  
            print 'msn.process error', e.code, e.message
            pass
          else:
            print 'msn.process error', e.code, e.message
            break
    except:
      pass

抱歉!评论已关闭.