參考
- 手把手教你擴展個人微信號(1)
- 手把手教你擴展個人微信號(2)
-
微信實現(xiàn)圖靈機器人自動回復(fù)
以上前兩篇為itchat作者寫的關(guān)于原理和使用的教程,第三篇為官方提供的教程。主要參照第三篇文章實現(xiàn)。
代碼及結(jié)果
#!/usr/bin/env python
# encoding: utf-8
import requests
import itchat
import time
from threading import Timer
KEY = '8edce3ce905a4c1dbb965e6b35c3834d'
def get_response(msg):
# 構(gòu)造發(fā)送給圖靈機器人服務(wù)器的數(shù)據(jù)
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')
# 為了防止服務(wù)器沒有正常響應(yīng)導(dǎo)致程序異常退出,這里用try-except捕獲了異常
# 如果服務(wù)器沒能正常交互(返回非json或無法連接),那么就會進(jìn)入下面的return
except:
# 將會返回一個None
return
def isMsgFromMyself(msgFromUserName):
# 檢查消息發(fā)送方是否為自己
global myName
return myName == msgFromUserName
# 注冊文本消息回復(fù)函數(shù)
@itchat.msg_register(itchat.content.TEXT)
def tuling_reply(msg):
global autoReplyFlag, timerSet, noReply, t # 狀態(tài)標(biāo)志位
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出現(xiàn)問題的時候仍舊可以回復(fù),這里設(shè)置一個默認(rèn)回復(fù)
defaultReply = 'I received: ' + msg['Text']
# 如果圖靈Key出現(xiàn)問題,那么reply將會是None
reply = get_response(msg['Text'])
# a or b的意思是,如果a有內(nèi)容,那么返回a,否則返回b
# 有內(nèi)容一般就是指非空或者非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("我的主人在認(rèn)真地熵減!讓我先陪你聊一會吧", UserName)
autoReplyFlag = True
timerSet = False
# 為了讓實驗過程更加方便(修改程序不用多次掃碼),我們使用熱啟動
itchat.auto_login()
autoReplyFlag, timerSet, noReply = False, False, False
t = 0 # 定義全局變量t, 用作觸發(fā)器使用,此行甚是丑陋;怎么才能更優(yōu)雅呢?請大神指點。
myName = itchat.get_friends(update=True)[0]['UserName']
itchat.run()
相比于原教程,此處添加了一定時間內(nèi)不回復(fù)即開啟自動回復(fù)的功能,大致原理是檢測消息發(fā)送方,如果不是自己的話就開啟就設(shè)置一個時間觸發(fā)器(學(xué)到了觸發(fā)器的用法),在規(guī)定時間內(nèi)向?qū)Ψ桨l(fā)送消息。在這期間如果自己在手機上回復(fù),那么就撤銷觸發(fā)器。整個程序的流程圖如下:

程序流程圖
聊天截圖:

聊天Demo
后期可以考慮程序監(jiān)聽日常的聊天內(nèi)容形成數(shù)據(jù),然后利用數(shù)據(jù)訓(xùn)練遞歸神經(jīng)網(wǎng)絡(luò)以形成更加智能和個性化的回復(fù)。