您的位置:首页 > 编程语言 > Python开发

python编写MSN机器人

2008-10-23 01:04 246 查看
网上有一个包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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: