2.轉發。基於itchat的微信消息同步機器人

原文:https://www.jianshu.com/p/7aeadca0c9bd#python

看到了該網址有基於itchat的微信消息同步機器人,轉過來繼續研究。如下是轉過來的:數據庫

 

最近 全棧數據工程師養成攻略 的微信羣已經將近500人,開了二羣以後爲了打通不一樣微信羣之間的消息,花了點時間作了個消息同步機器人,在任意羣收到消息時同步到其餘羣,而且將聊天內容上傳至數據庫,以供進一步分析、統計和展現。安全

基本思路是,用 Python 模擬微信網頁版登錄,接收到羣裏消息後,對文本、圖片、分享等各種消息類型分別處理,並轉發至其餘羣。服務器

前期準備

首先得有一個微信號,用於代碼模擬登錄。因爲個人微信號得本身留着用,現階段註冊微信又必需要手機號,因而只好特地辦了個電信號,用來申請了一個新的微信,微信號是 honlanbot。雖然說彷佛能夠用阿里小號來註冊微信,不過據說存在反覆回收和安全隱患問題,故不採用。微信

其次,須要用到一個Python庫 itchat,這個庫已經作好了用代碼調用微信的大多數功能,很是好用,官方文檔在這裏,安裝的時候使用 pip 便可。ide

pip install itchat

個人手機支持雙卡雙待,因而把兩張卡都裝手機裏,再雙開微信,同時保持兩個微信號手機在線,差很少就能夠開始寫代碼了。用 itchat 調用微信主要是模擬微信網頁版登錄,因此必須保持微信號手機在線,由於手機端微信一旦退出,其在網頁、PC、MAC、IPAD等相應終端認證的帳號也會隨之退出。函數

初步嘗試

itchat 提供了一些官方代碼,讓咱們在本身的本本或電腦上新建一個 py 文件,初步嘗試一下。spa

運行如下代碼,會出現出現一張二維碼,掃碼登錄以後將會給「文件傳輸助手」發送一條消息。code

# 加載包 import itchat # 登錄 itchat.auto_login() # 發送文本消息,發送目標是「文件傳輸助手」 itchat.send('Hello, filehelper', toUserName='filehelper') 

如下代碼則註冊了一個消息響應事件,用來定義接收到文本消息後如何處理。在 itchat 裏能夠定義文本、圖片、名片、位置、通知、分享、文件等多種消息類型,從而分別執行不一樣的處理。orm

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和暱稱,能夠將須要同步消息的羣聊保存至通信錄;
  • 接收到羣聊消息時,若是消息來自於須要同步消息的羣聊,就根據消息類型進行處理,同時轉發到其餘須要同步的羣聊。

直接上代碼好了,首先定義一個消息響應函數,文本類消息我感興趣的是 TEXTSHARING 兩類,使用 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

成果展現

目前兩個羣之間能夠進行消息同步了,一羣和二羣的小夥伴終於能夠暢快地聊了起來(當羣主不容易,常常要發不少紅包 = =)。

進一步工做

固然,我不可能一直在筆記本上運行這麼個 py 代碼,因此把它部署到服務器上運行就行了,開個 screen 或者用 IPython 均可以。若是帳號偶爾下線了,再運行一下就好。

另外,我還寫了個 API,響應消息的時候會把相應的數據 POST 到個人服務器並存到數據庫,以供進一步的分析、統計和展現,這也是我身爲一個羣主應盡的職責~

做者:宏倫工做室 連接:https://www.jianshu.com/p/7aeadca0c9bd# 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索