原文:https://www.jianshu.com/p/7aeadca0c9bd#python
看到了該網址有基於itchat的微信消息同步機器人,轉過來繼續研究。如下是轉過來的:數據庫
最近 全棧數據工程師養成攻略
的微信羣已經將近500人,開了二羣以後爲了打通不一樣微信羣之間的消息,花了點時間作了個消息同步機器人,在任意羣收到消息時同步到其餘羣,而且將聊天內容上傳至數據庫,以供進一步分析、統計和展現。安全
基本思路是,用 Python
模擬微信網頁版登錄,接收到羣裏消息後,對文本、圖片、分享等各種消息類型分別處理,並轉發至其餘羣。服務器
前期準備
首先得有一個微信號,用於代碼模擬登錄。因爲個人微信號得本身留着用,現階段註冊微信又必需要手機號,因而只好特地辦了個電信號,用來申請了一個新的微信,微信號是 honlanbot
。雖然說彷佛能夠用阿里小號來註冊微信,不過據說存在反覆回收和安全隱患問題,故不採用。微信
其次,須要用到一個Python庫 itchat
,這個庫已經作好了用代碼調用微信的大多數功能,很是好用,官方文檔在這裏,安裝的時候使用 pip
便可。ide
pip install itchat
個人手機支持雙卡雙待,因而把兩張卡都裝手機裏,再雙開微信,同時保持兩個微信號手機在線,差很少就能夠開始寫代碼了。用 itchat
調用微信主要是模擬微信網頁版登錄,因此必須保持微信號手機在線,由於手機端微信一旦退出,其在網頁、PC、MAC、IPAD等相應終端認證的帳號也會隨之退出。函數
初步嘗試
itchat
提供了一些官方代碼,讓咱們在本身的本本或電腦上新建一個 py
文件,初步嘗試一下。url
運行如下代碼,會出現出現一張二維碼,掃碼登錄以後將會給「文件傳輸助手」發送一條消息。spa
# 加載包 import itchat # 登錄 itchat.auto_login() # 發送文本消息,發送目標是「文件傳輸助手」 itchat.send('Hello, filehelper', toUserName='filehelper')
如下代碼則註冊了一個消息響應事件,用來定義接收到文本消息後如何處理。在 itchat
裏能夠定義文本、圖片、名片、位置、通知、分享、文件等多種消息類型,從而分別執行不一樣的處理。.net
import itchat # 註冊消息響應事件,消息類型爲itchat.content.TEXT,即文本消息 @itchat.msg_register(itchat.content.TEXT) def text_reply(msg): # 返回一樣的文本消息 return msg['Text'] itchat.auto_login() # 綁定消息響應事件後,讓itchat運行起來,監聽消息 itchat.run()
再來看看如何處理其餘類型消息,能夠把在消息響應事件裏把 msg
打印出來,是一個字典,看看有哪些感興趣的字段。
import itchat # import所有消息類型 from itchat.content import * # 處理文本類消息 # 包括文本、位置、名片、通知、分享 @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING]) def text_reply(msg): # 微信裏,每一個用戶和羣聊,都使用很長的ID來區分 # msg['FromUserName']就是發送者的ID # 將消息的類型和文本內容返回給發送者 itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName']) # 處理多媒體類消息 # 包括圖片、錄音、文件、視頻 @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO]) def download_files(msg): # msg['Text']是一個文件下載函數 # 傳入文件名,將文件下載下來 msg['Text'](msg['FileName']) # 把下載好的文件再發回給發送者 return '@%s@%s' % ({'Picture': 'img', 'Video': 'vid'}.get(msg['Type'], 'fil'), msg['FileName']) # 處理好友添加請求 @itchat.msg_register(FRIENDS) def add_friend(msg): # 該操做會自動將新好友的消息錄入,不須要重載通信錄 itchat.add_friend(**msg['Text']) # 加無缺友後,給好友打個招呼 itchat.send_msg('Nice to meet you!', msg['RecommendInfo']['UserName']) # 處理羣聊消息 @itchat.msg_register(TEXT, isGroupChat=True) def text_reply(msg): if msg['isAt']: itchat.send(u'@%s\u2005I received: %s' % (msg['ActualNickName'], msg['Content']), msg['FromUserName']) # 在auto_login()裏面提供一個True,即hotReload=True # 便可保留登錄狀態 # 即便程序關閉,必定時間內從新開啓也能夠不用從新掃碼 itchat.auto_login(True) itchat.run()
開發消息同步機器人
通過以上示例代碼,能夠總結出消息同步機器人的開發思路:
- 登錄後使用
get_chatrooms()
獲取所有羣聊的數據,包括每一個羣聊的ID和暱稱,能夠將須要同步消息的羣聊保存至通信錄; - 接收到羣聊消息時,若是消息來自於須要同步消息的羣聊,就根據消息類型進行處理,同時轉發到其餘須要同步的羣聊。
直接上代碼好了,首先定義一個消息響應函數,文本類消息我感興趣的是 TEXT
和 SHARING
兩類,使用 isGroupChat=True
指定消息來自於羣聊,這個參數默認爲 False
。
# 自動回覆文本等類別的羣聊消息 # isGroupChat=True表示爲羣聊消息 @itchat.msg_register([TEXT, SHARING], isGroupChat=True) def group_reply_text(msg): # 消息來自於哪一個羣聊 chatroom_id = msg['FromUserName'] # 發送者的暱稱 username = msg['ActualNickName'] # 消息並非來自於須要同步的羣 if not chatroom_id in chatroom_ids: return if msg['Type'] == TEXT: content = msg['Content'] elif msg['Type'] == SHARING: content = msg['Text'] # 根據消息類型轉發至其餘羣 if msg['Type'] == TEXT: for item in chatrooms: if not item['UserName'] == chatroom_id: itchat.send('%s\n%s' % (username, msg['Content']), item['UserName']) elif msg['Type'] == SHARING: for item in chatrooms: if not item['UserName'] == chatroom_id: itchat.send('%s\n%s\n%s' % (username, msg['Text'], msg['Url']), item['UserName'])
再來處理下圖片等多媒體類消息。
# 自動回覆圖片等類別的羣聊消息 # isGroupChat=True表示爲羣聊消息 @itchat.msg_register([PICTURE, ATTACHMENT, VIDEO], isGroupChat=True) def group_reply_media(msg): # 消息來自於哪一個羣聊 chatroom_id = msg['FromUserName'] # 發送者的暱稱 username = msg['ActualNickName'] # 消息並非來自於須要同步的羣 if not chatroom_id in chatroom_ids: return # 若是爲gif圖片則不轉發 if msg['FileName'][-4:] == '.gif': return # 下載圖片等文件 msg['Text'](msg['FileName']) # 轉發至其餘須要同步消息的羣聊 for item in chatrooms: if not item['UserName'] == chatroom_id: itchat.send('@%s@%s' % ({'Picture': 'img', 'Video': 'vid'}.get(msg['Type'], 'fil'), msg['FileName']), item['UserName'])
以上代碼實現了對文本、分享、圖片、視頻四類消息的處理,若是對其餘類型的消息也感興趣,進行相應的處理便可。在前面補上 import
的代碼,在後面補上登錄、獲取羣聊數據和開始監測的代碼,就大功告成了。
完整代碼在這裏:https://pan.baidu.com/s/1bpAJk0B
成果展現
目前兩個羣之間能夠進行消息同步了,一羣和二羣的小夥伴終於能夠暢快地聊了起來(當羣主不容易,常常要發不少紅包 = =)。
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
進一步工做
固然,我不可能一直在筆記本上運行這麼個 py
代碼,因此把它部署到服務器上運行就行了,開個 screen
或者用 IPython
均可以。若是帳號偶爾下線了,再運行一下就好。
另外,我還寫了個 API
,響應消息的時候會把相應的數據 POST
到個人服務器並存到數據庫,以供進一步的分析、統計和展現,這也是我身爲一個羣主應盡的職責~