注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

没有想法

乱写乱画

 
 
 

日志

 
 

python编写MSN机器人(使用MSNP包)  

2008-03-14 22:14:36|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
网上有一个包msnp,不过很久没更新了,不能很好支持最新版的MSN。下载后修改这个文件:
/msnp/command.py
在Command类的parse函数里面最前面加一句:
str = re.sub('<NOTIFICATION.*?</NOTIFICATION>', '', str)
然后读一下README,用下面的命令安装
python setup.py build
python setup.py install

我们要做的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

  评论这张
 
阅读(1420)| 评论(4)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017