參考
- 手把手教你擴展個人微信號(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()
相比于原教程,此處添加了一定時間內不回復即開啟自動回復的功能,大致原理是檢測消息發送方,如果不是自己的話就開啟就設置一個時間觸發器(學到了觸發器的用法),在規定時間內向對方發送消息。在這期間如果自己在手機上回復,那么就撤銷觸發器。整個程序的流程圖如下:
程序流程圖
聊天截圖:
聊天Demo
后期可以考慮程序監聽日常的聊天內容形成數據,然后利用數據訓練遞歸神經網絡以形成更加智能和個性化的回復。