[Python] 用 ItChat 套件寫一個微信 WeChat 聊天機器人 ChatBot

微信機器人有很多實作方式,有修改微信電腦版的方式、網頁版登入的方式等等。
我這邊使用的是 Python ,利用登入網頁版微信來做為溝通

註:這個作法是利用「個人」的帳戶方式,實現半自動化的功能。
可以自動拉入群、群發訊息、特定關鍵字回覆…等等的功能

我們使用 ItChat 的套件來實作微信的機器人。

網路上對於 ItChat 有許多分支,最原始的是 littlecodersh/ItChat 的版本,
但小弟在測試的時候發現這個版本有登入的問題(等等會解釋)。
所以改用 luvletter2333/ItChat 修改後的版本

相關文件:
https://itchat.readthedocs.io/zh/latest/

以下使用 Python 3.9 的環境實作。

安裝套件

pip3 install git+https://github.com/luvletter2333/ItChat.git

最基本的一個範例

import itchat

itchat.auto_login()

itchat.send('Hello, filehelper', toUserName='filehelper')

就是向給「文件傳輸助手」發一條「Hello, filehelper」訊息。
因爲不能自己發給自己,但每個人每個帳號都有「文件傳輸助手」故可以用它來測試。

列出好友列表

使用 get_friends() 方法可以獲取所有的好友(好友第一位是自己)

friendList = itchat.get_friends(update=True)[1:]
for friend in friendList:
    print("%s %s" % ((friend['DisplayName'] or friend['NickName']), friend['UserName']))

可以得到 friend 物件,是一個 json 物件。
主要二個重點:

  • UserName 使用者 ID
  • NickName 顯示的暱稱

你發訊息的時候會需要 UserName 代表使用者 ID
資料類似這樣
@@f2148b83xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa3644c

列出群組聊天

這邊有一個要注意:你的群組聊天,一定要勾選「儲存到通訊錄」
如果不儲存到通訊錄,是無法在各裝置之間同步的(所以 itchat 也無法讀取到)

讀取方式有二種

第一種,類似 get_friends() 的方式,使用 get_chatrooms() 來列出你有加的群組。

chatroomList = itchat.get_chatrooms(update=True)[1:]
for chatroom in chatroomList:
    print("%s %s" % (chatroom['NickName'], chatroom['UserName']))

跟使用者一樣,有 NickName 與 UserName

  • UserName 群組 ID
  • NickName 顯示的暱稱

操作方式與使用者相同

第二種方式,使用 search_chatrooms 方法

chatroomName=u'MyChatGroup'
chatrooms = itchat.search_chatrooms(name=chatroomName)
if chatrooms is None:
    print(u'Chatroom not found: ' + chatroomName)
else:
    print("%s %s" % (chatrooms[0]['NickNameUserName'], chatrooms[0]['UserName']))

發訊息

使用 send 方法

itchat.send(u'Hello, world', userName)

參數就二個,第一個就是訊息,第二個就是 UserName 參數(代表你的群組 ID 或使用者 ID)
資料類似這樣
@@f2148b83xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa3644c

使用 Docker 包裝

我會使用 Docker 鎖定執行的環境與所需材料,只要一個 docker run
就能帶入當時所使用的環境

FROM python:3.9.7-slim-bullseye

WORKDIR /data

RUN apt-get update
RUN apt-get install -y git
RUN pip3 install requests pyqrcode
RUN pip3 install git+https://github.com/luvletter2333/ItChat.git 

ADD *.py /data/

CMD python3 main.py

使用 python 3.9.7 基於 Debian 11 (代號 bullseye) 的版本
加入所需套件 requests pyqrcode ItChat 等

然後執行之

實例

我寫了一個有趣的微信 Wechat 機器人
抓取財金資訊日曆,整理後貼回群組
提醒大家留意交易的時間點


QRCode 登入畫面(因為 QRCode 是個人登入使用,避免誤掃就隱藏起來)

發送訊息的樣子

對照原有 app

遇到問題

我在測試的時候遇到最多最不知道怎麼解的問題就是這個

「為了你的帳號安全,此微信號不能登錄網頁微信。你可以使用 Windows 微信或 Mac 微信在電腦端登錄」

找了一下相關的討論

Issue#943 這邊提到他用 why2lyj/ItChat-UOS 來實現,但包進 Docker 會沒辦法用。

Issue#939 這邊 luvletter2333/ItChat 的修改就可以用,也就是本文使用的版本

有網友使用老版本的網頁微信,就又可以使用了。
(什麼時候封禁不能用,不知道,看微信的臉色)

有網友回報新註冊的微信就已經不能使用了,
使用前請苛灼。

參考資料