参考
- 手把手教你扩展个人微信号(1)
- 手把手教你扩展个人微信号(2)
-
微信实现图灵机器人自动回复
以上前两篇为itchat
作者写的关于原理和使用的教程,第三篇为官方提供的教程。主要参照第三篇文章实现。
代码及结果
#!/usr/bin/env python
# encoding: utf-8
import requests
import itchat
import time
from threading import Timer
KEY = '8edce3ce905a4c1dbb965e6b35c3834d'
def get_response(msg):
# 构造发送给图灵机器人服务器的数据
apiUrl = 'http://www.tuling123.com/openapi/api'
data = {
'key' : KEY,
'info' : msg,
'userid' : 'wechat-robot',
}
try:
r = requests.post(apiUrl, data=data).json()
# 字典的get方法在字典没有'text'值的时候会返回None而不会抛出异常
return r.get('text')
# 为了防止服务器没有正常响应导致程序异常退出,这里用try-except捕获了异常
# 如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return
except:
# 将会返回一个None
return
def isMsgFromMyself(msgFromUserName):
# 检查消息发送方是否为自己
global myName
return myName == msgFromUserName
# 注册文本消息回复函数
@itchat.msg_register(itchat.content.TEXT)
def tuling_reply(msg):
global autoReplyFlag, timerSet, noReply, t # 状态标志位
print(msg['Text'])
if isMsgFromMyself(msg['FromUserName']):
print("Replied!!")
autoReplyFlag = False
noReply = False
try:
t.cancel()
print("Timer Canceled")
timerSet = False
except:
pass
return None
if autoReplyFlag:
# 为了保证在图灵Key出现问题的时候仍旧可以回复,这里设置一个默认回复
defaultReply = 'I received: ' + msg['Text']
# 如果图灵Key出现问题,那么reply将会是None
reply = get_response(msg['Text'])
# a or b的意思是,如果a有内容,那么返回a,否则返回b
# 有内容一般就是指非空或者非None,你可以用`if a: print('True')`来测试
return reply or defaultReply
else:
noReply = True
if not timerSet:
# if time.time()-noReplyStartTime >= 120:
print("Timer setting")
t = Timer(12, sendBusyStatus, [msg['FromUserName']])
t.start()
timerSet = True
def sendBusyStatus(UserName):
global noReply, autoReplyFlag, timerSet
print("Timer Working!")
if noReply:
itchat.send("我的主人在认真地熵减!让我先陪你聊一会吧", UserName)
autoReplyFlag = True
timerSet = False
# 为了让实验过程更加方便(修改程序不用多次扫码),我们使用热启动
itchat.auto_login()
autoReplyFlag, timerSet, noReply = False, False, False
t = 0 # 定义全局变量t, 用作触发器使用,此行甚是丑陋;怎么才能更优雅呢?请大神指点。
myName = itchat.get_friends(update=True)[0]['UserName']
itchat.run()
相比于原教程,此处添加了一定时间内不回复即开启自动回复的功能,大致原理是检测消息发送方,如果不是自己的话就开启就设置一个时间触发器(学到了触发器的用法),在规定时间内向对方发送消息。在这期间如果自己在手机上回复,那么就撤销触发器。整个程序的流程图如下:
聊天截图:
后期可以考虑程序监听日常的聊天内容形成数据,然后利用数据训练递归神经网络以形成更加智能和个性化的回复。