最近全端資料工程師養成攻略的微信群已經將近500人,開了二群之後為了打通不同微信群之間的消息,花了點時間做了個訊息同步機器人,在任意群收到訊息時同步到其他群,並將聊天內容上傳至資料庫,以便進一步分析、統計和展示。
基本想法是,用 Python 模擬微信登陸,接收群組裡訊息後,分別對文字、圖片、分享等各類別訊息類型進行處理,並轉發至其他群組。
前期準備
首先得有一個微訊號,用於程式碼模擬登陸。由於我的微訊號得自己留著用,現階段註冊微信又必須要手機號,於是只好特意辦了個電訊號,用來申請了一個新的微信,微訊號是 honlanbot。雖說似乎可以用阿里小號來註冊微信,不過聽說有反覆回收和安全隱患問題,故不採用。
其次,需要用到一個Python庫 itchat,這個函式庫已經做好了用程式碼呼叫微信的大多數功能,非常好用,官方文件在這裡,安裝的時候使用 pip 即可。
pip install itchat
我的手機支援雙卡雙待,於是把兩張卡都裝手機裡,再雙開微信,同時保持兩個微訊號手機在線,差不多就可以開始寫程式了。用 itchat 呼叫微信主要是模擬微信網頁版登陸,所以必須保持微訊號手機在線,因為手機端微信一旦退出,其在網頁、PC、MAC、IPAD等相應終端認證的帳號也會隨之退出。
初步嘗試
itchat 提供了一些官方程式碼,讓我們在自己的本本或電腦上新建一個 py 文件,初步嘗試一下。
執行以下程式碼,會出現一張二維碼,在掃碼登陸之後會傳送訊息給「檔案傳輸助理」。
# 加载包 import itchat # 登陆 itchat.auto_login() # 发送文本消息,发送目标是“文件传输助手” itchat.send('Hello, filehelper', toUserName='filehelper')
以下程式碼則註冊了一個訊息回應事件,用來定義接收到文字訊息後如何處理。在 itchat 裡定義了文字、圖片、名片、位置、通知、分享、文件等多種訊息類型,可以分別執行不同的處理。
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()
#開發訊息同步機器人
經過上述範例程式碼,可以總結出訊息同步機器人的開發想法:
維護一個字典,叫做groups 好了,用來存所有需要同步訊息的群聊,key 為群聊的ID,value 為群聊的名稱;
接收到群組聊天訊息時,如果訊息來自於需要同步訊息的群組聊天,就根據訊息類型處理,同時轉送到其他需要同步的群組聊天。
直接上程式碼好了,先定義一個訊息回應函數,文字類別訊息我感興趣的是TEXT 和SHARING 兩類,使用isGroupChat=True 指定訊息來自於群聊,這個參數預設為False。
@itchat.msg_register([TEXT, SHARING], isGroupChat=True) def group_reply_text(msg): # 获取群聊的ID,即消息来自于哪个群聊 # 这里可以把source打印出来,确定是哪个群聊后 # 把群聊的ID和名称加入groups source = msg['FromUserName'] # 处理文本消息 if msg['Type'] == TEXT: # 消息来自于需要同步消息的群聊 if groups.has_key(source): # 转发到其他需要同步消息的群聊 for item in groups.keys(): if not item == source: # groups[source]: 消息来自于哪个群聊 # msg['ActualNickName']: 发送者的名称 # msg['Content']: 文本消息内容 # item: 需要被转发的群聊ID itchat.send('%s: %s\n%s' % (groups[source], msg['ActualNickName'], msg['Content']), item) # 处理分享消息 elif msg['Type'] == SHARING: if groups.has_key(source): for item in groups.keys(): if not item == source: # msg['Text']: 分享的标题 # msg['Url']: 分享的链接 itchat.send('%s: %s\n%s\n%s' % (groups[source], msg['ActualNickName'], msg['Text'], msg['Url']), item)
再來處理下圖片等多媒體類別訊息。
# 处理图片和视频类消息 @itchat.msg_register([PICTURE, VIDEO], isGroupChat=True) def group_reply_media(msg): source = msg['FromUserName'] # 下载图片或视频 msg['Text'](msg['FileName']) if groups.has_key(source): for item in groups.keys(): if not item == source: # 将图片或视频发送到其他需要同步消息的群聊 itchat.send('@%s@%s' % ({'Picture': 'img', 'Video': 'vid'}.get(msg['Type'], 'fil'), msg['FileName']), item)
以上程式碼實現了對文字、分享、圖片、影片四類訊息的處理,如果對其他類型的訊息也感興趣,進行相應的處理即可。在前面補上 import 的程式碼,在後面補上登陸和運行的程式碼,就大功告成了。
成果展示
目前兩個群之間可以進行訊息同步了,一群和二群的小夥伴終於可以暢快地聊了起來(當群主不容易,常常要發很多紅包= =)。
進一步工作
當然,我不可能一直在筆記本上運行這麼個py 程式碼,所以把它部署到伺服器上運行就好了,開個screen 或用IPython 都可以。如果帳號偶爾下線了,再運行一下就好。
另外,我還寫了個API,回應訊息的時候會把對應的資料POST 到我的伺服器並存到資料庫,以便進一步的分析、統計和展示,這也是我身為一個群主應盡的職責~
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。
更多python基於itchat實作微信群組訊息同步機器人相關文章請關注PHP中文網站!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!