微信自動回復機器人是怎麼做的 ?

  • 2019 年 11 月 13 日
  • 筆記

一、寫在前面

本文轉載自讀者的公號 Ahab雜貨鋪 。簡單粗暴,分享一種有趣的玩法—微信自動回復機器人。

程式很簡單僅僅三十行程式碼左右,實現了機器人自動與你的微信好友聊天,下面是我的機器人小籠包跟自己微信好友聊天的截圖。

二、程式介紹

本程式通過itchat獲取微信的相關消息,將微信消息傳輸到機器人介面(本程式使用的是圖靈),獲取機器人的返回消息。將返回消息返回給微信消息的發送人。以此實現將微信個人號變身為聊天機器人。

三、具體實現

安裝 itchat的安裝可以通過下面這行程式碼

1pip install itchat

登錄 itchat.auto_login() 這種方法將會通過微信掃描二維碼登錄,但是這種登錄的方式確實短時間的登錄,並不會保留登錄的狀態,也就是下次登錄時還是需要掃描二維碼。

1# 掃描二維碼登陸微信,實際上就是通過網頁版微信登陸 2 itchat.auto_login()

如果加上hotReload==True,那麼就會保留登錄的狀態,至少在後面的幾次登錄過程中不會再次掃描二維碼,該參數生成一個靜態文件itchat.pkl用於存儲登錄狀態

1itchat.auto_login(hotReload=True)

微信資訊的發送 微信可以發送各類消息,文本、圖片、文件等,下面是具體的方法的介紹。

1itchat.send('Message Content', 'toUserName')

該發送消息的函數需要兩個參數,消息的內容與接受者的UserName,即標識符。 用下面的程式碼舉一個小栗子,實現向文件助手發送資訊。

1import itchat 2 3itchat.auto_login(hotReload=True) 4itchat.send(u'測試消息發送', 'filehelper')

微信消息的獲取

itchat 將根據接受到的消息類型尋找對應的已註冊的方法。如果一個消息類型沒有對應的註冊方法, 該消息將會被捨棄。在運行過程中也可以動態註冊方法, 註冊方式與結果不變。 註冊方法 不帶具體對象註冊, 將註冊為普通消息的回復方法.

1 import itchat 2 from itchat.content import * 3 @itchat.msg_register(TEXT) #這裡的TEXT表示如果有人發送文本消息,那麼就會調用下面的方法 4 def simple_reply(msg): 5 #這個是向發送者發送消息 6 itchat.send_msg('已經收到了文本消息,消息內容為%s'%msg['Text'],toUserName=msg['FromUserName']) 7 return "T reveived: %s" % msg["Text"] #返回的給對方的消息,msg["Text"]表示消息的內容

帶對象參數註冊, 對應消息對象將調用該方法,其中isFriendChat表示好友之間,isGroupChat表示群聊,isMapChat表示公眾號。

1import itchat 2from itchat.content import * 3 [email protected]_register(TEXT, isFriendChat=True, isGroupChat=True,isMpChat=True) 5def text_reply(msg): 6 msg.user.send("%s : %s" % (mst.type, msg.text))

消息類型 向註冊方法傳入的 msg 包含微信返回的字典的所有內容.itchat 增加 Text, Type(也就是參數) 鍵值, 方便操作。

itcaht.content 中包含所有的消息類型參數例如圖片、語音、名片、分享等,也對應不同的註冊參數:

  • 圖片對應 itchat.content.PICTURE
  • 語音對應 itchat.content.RECORDING
  • 名片對應 itchat.content.CARD

其餘的可以參考官方API https://pypi.org/project/itchat/

1import itchat 2 [email protected]_register(itchat.content.TEXT) 4def print_content(msg): 5 print(msg['Text']) 6 7itchat.auto_login() 8itchat.run()

通過運行上面的程式碼,實現基礎的文本資訊的接收。

實現與圖靈機器人的交互

實現機器人有很多種方法,最簡單的就是使用他人提供的介面。這裡以圖靈機器人為例,演示這一功能。圖靈機器人簡單而言就是以一定的規則給圖靈的伺服器發送數據包(包含你對他說的話)圖靈的伺服器會以一定的規則給你返回數據包(包含他回復你的話)

你需要一個Tuling Key來告訴圖靈伺服器你有權和他對話。

18edce3ce905a4c1dbb965e6b35c3834d 2eb720a8970964f3f855d863d24406576 31107d5601866433dba9599fac1bc0083 471f28bf79c820df10d39b4074345ef8c

接下來需配置圖靈機器人

1{ 2 'key' : 'TULING_KEY', 3 'info' : 'YOUR_MSG', 4 'userid' : 'USERID', 5}

下面使用圖靈機器人向好友發送了hello

1#coding=utf8 2import requests 3 4apiUrl = 'http://www.tuling123.com/openapi/api' 5data = { 6 'key' : '8edce3ce905a4c1dbb965e6b35c3834d', # 如果這個Tuling Key不能用,那就換一個 7 'info' : 'hello', # 這是我們發出去的消息 8 'userid' : 'wechat-robot', # 這裡你想改什麼都可以 9} 10# 我們通過如下命令發送一個post請求 11r = requests.post(apiUrl, data=data).json() 12 13# 讓我們列印一下返回的值,看一下我們拿到了什麼 14print(r)

完整程式碼:

1import requests 2import itchat 3 4KEY = '8edce3ce905a4c1dbb965e6b35c3834d' 5 6def get_response(msg): 7 # 這裡實現與圖靈機器人的交互 8 # 構造了要發送給伺服器的數據 9 apiUrl = 'http://www.tuling123.com/openapi/api' 10 data = { 11 'key' : KEY, 12 'info' : msg, 13 'userid' : 'wechat-robot', 14 } 15 try: 16 r = requests.post(apiUrl, data=data).json() 17 # 字典的get方法在字典沒有'text'值的時候會返回None而不會拋出異常 18 return r.get('text') 19 # 為了防止伺服器沒有正常響應導致程式異常退出,這裡用try-except捕獲了異常 20 # 如果伺服器沒能正常交互(返回非json或無法連接),那麼就會進入下面的return 21 except: 22 # 將會返回一個None 23 return 24 25# 這裡實現微信消息的獲取 [email protected]_register(itchat.content.TEXT) 27def tuling_reply(msg): 28 # 為了保證在圖靈Key出現問題的時候仍舊可以回復,這裡設置一個默認回復 29 defaultReply = 'I received: ' + msg['Text'] 30 # 如果圖靈Key出現問題,那麼reply將會是None 31 reply = get_response(msg['Text']) 32 # a or b的意思是,如果a有內容,那麼返回a,否則返回b 33 # 有內容一般就是指非空或者非None,你可以用`if a: print('True')`來測試 34 return reply or defaultReply 35 36# 為了讓實驗過程更加方便(修改程式不用多次掃碼),我們使用熱啟動 37itchat.auto_login(hotReload=True) 38itchat.run()

itchat不僅僅能夠實現自動回復,還有其他的相關功能比如群發助手,好友單刪檢測,獲取微信好友資訊等功能,後續會慢慢去體驗各種玩法。