今天來為大家介紹一個有意思的開源微信個人號 API,它是基于 Python/ target=_blank class=infotextkey>Python 調用微信網頁版實現,只需要編寫少量的代碼,就可以完成一個能夠處理所有信息的微信機器人。那它到底能實現了什么功能,接下來為大家一一介紹。
安裝
想要使用它,首先得安裝 itchat 模塊:
$ pip3 install itchat
登陸
想要通過 itchat 操作微信接收、發送信息等,第一步需要先登陸微信網頁版,為此 itchat 提供了 auto_login 方法,調用這個方法就能實現微信登陸。首先新建 mychat1.py 文件,代碼如下:
# mychat1.py
import itchat
from itchat.content import TEXT
@itchat.msg_register(TEXT) # 注冊處理文本信息
def simple_reply(msg):
print(msg.text)
itchat.auto_login(hotReload=True) # hotReload=True表示短時間關閉程序后可重連
itchat.run()
然后通過執行命令 python mychat1.py 運行代碼,這時會生成一個名為 QR.png 的二維碼圖片文件,通過掃描這個二維碼就可以登陸微信網頁版了,這時將會顯示如下信息:
Login successfully as 你的微信昵稱
Start auto replying.
如果你向這個登陸后的微信發送文本消息,則會直接把你發送的消息內容在終端打印出來。
關于登陸這里還有幾點要說明下:
- itchat提供了登陸狀態暫存,關閉程序后一定時間內不需要掃碼即可登錄。只需要在 auto_login 方法中傳入 hotReload=True 即可。
- 為了方便在無圖形界面使用itchat,程序內置了命令行二維碼的顯示。只需要在 auto_login 方法中傳入 enableCmdQR=True 即可。
- 可以自定義登陸,比如更改提示語、二維碼出現后郵件發送等。
關于自定義登陸所需要的方法,登陸的過程按順序為:
- 獲取二維碼uuid,方法名稱:get_QRuuid
- 獲取二維碼,方法名稱:get_QR
- 判斷是否已經登陸成功,方法名稱:check_login
- 獲取初始化數據,方法名稱:web_init
- 更新微信相關信息(通訊錄、手機登陸狀態),方法名稱:get_friends、show_mobile_login
- 循環掃描新信息(開啟心跳),方法名稱:start_receiving
以上簡單介紹了下關于登陸相關的內容,如果想了解更詳細信息請查看官方文檔。
注冊消息方法
itchat 將根據接收到的消息類型尋找對應的已經注冊的方法,如果一個消息類型沒有對應的注冊方法,該消息將會被舍棄,就像我們上面代碼只注冊了 TEXT 類型的消息才會被打印出來。當然在運行過程當中也可以動態注冊方法,注冊方式與結果不變。
消息類型
itchat 支持多種類型的消息處理,具體類型和參數詳見下表:
參數 |
類型 |
Text鍵值 |
TEXT |
文本 |
文本內容 |
MAP |
地圖 |
位置文本 |
CARD |
名片 |
推薦人字典 |
NOTE |
通知 |
通知文本 |
SHARING |
分享 |
分享名稱 |
PICTURE |
圖片/表情 |
下載方法 |
RECORDING |
語音 |
下載方法 |
ATTACHMENT |
附件 |
下載方法 |
VIDEO |
小視頻 |
下載方法 |
FRIENDS |
好友邀請 |
添加好友所需參數 |
SYSTEM |
系統消息 |
更新內容的用戶或群聊的UserName組成的列表 |
注冊消息
注冊消息有兩種方法:
- 不帶具體對象注冊,將注冊為普通消息的回復方法
- 帶對象參數注冊,對應消息對象將調用該方法
# mychat2.py
import itchat
from itchat.content import TEXT
# 不帶具體對象注冊,將注冊為普通消息的回復方法
@itchat.msg_register(TEXT)
def simple_reply(msg):
return 'I received: %s' % msg['Text']
# 帶對象參數注冊,對應消息對象將調用該方法
@itchat.msg_register(TEXT, isFriendChat=True, isGroupChat=True, isMpChat=False)
def text_reply(msg):
msg.user.send('%s: %s' % (msg.type, msg.text))
itchat.auto_login(hotReload=True)
itchat.run()
然后通過執行命令 python mychat2.py 運行代碼,掃碼登陸并向該微信號發消息,這時你會發現你向它發什么消息,它會同樣回復什么消息,而控制臺并沒有打印消息,很明顯它只調用了帶參數對象注冊的方法,那么為什么不調用第一個不帶對象注冊的方法,下面我們就說說注冊消息的優先級。
注冊消息優先級
多次注冊同一類型消息時,遵循以下規則:
- 后注冊消息先于先注冊消息
- 帶參數消息先于不帶參數消息
依據這兩個規則,上例代碼只執行第二個帶參數注冊的方法就很正常了,另外 itchat 還支持動態注冊消息,一種方法是生成一個守護線程動態注冊消息,另一種是使用 configured_reply 方法,具體如何實現請參考官方文檔 。
消息回復
itchat 提供了五種消息回復的方法:
1. send方法
import itchat
# 可發送多種類型消息
itchat.send(msg='文本消息', toUserName=None)
itchat.send('@img@%s' % '表情圖片.gif')
itchat.send('@fil@%s' % '文件.docx')
itchat.send('@vid@%s' % '測試.mp4')
參數說明:
- msg:消息內容。'@fil@文件地址'將會被識別為傳送文件,'@img@圖片地址'將會被識別為傳送圖片,'@vid@視頻地址'將會被識別為小視頻。
- toUserName:發送對象,如果留空將會發送給自己。
返回值:
- 發送成功:True
- 失敗:False
2. send_msg方法
send_msg(msg='文本消息', toUserName=None)
參數說明:
- msg:消息內容,僅文本
- toUserName:發送對象,如果留空將會發送給自己
返回值:
- 發送成功:True
- 失敗:False
3. send_file、send_img、send_video方法
send_file(fileDir, toUserName=None)
send_img(fileDir, toUserName=None)
send_video(fileDir, toUserName=None)
參數說明:
- fileDir:文件路徑(不存在該文件時將打印無此文件的提醒)
- toUserName:發送對象,如果留空將會發送給自己
返回值:
- 發送成功:True
- 失敗:False
通過以上幾種可以看出,幾種方法各有特點,可以隨自己喜好使用,不過官方推薦直接使用 send 方法。
消息內容
在上面介紹注冊消息時,我們知道了 itchat 支持微信回復的以下幾種類型的消息,包括:微信初始化消息、文本消息、圖片消息、小視頻消息、地理位置消息、名片消息、 語音消息、動畫表情、普通鏈接和應用分享、音樂鏈接、群消息、紅包消息、系統消息。接下來我們選幾種常見消息和大家簡單介紹下。
文本消息
文本消息是最常見的消息,基本格式如下:
MsgType: 1 # 消息類型
FromUserName: 發送方ID
ToUserName: 接收方ID
Content: 消息內容
圖片消息
MsgType: 3 # 消息類型
FromUserName: 發送方ID
ToUserName: 接收方ID
MsgId: 用于獲取圖片
Content:
<msg>
<img length="6503" hdlength="0" />
<commenturl></commenturl>
</msg>
小視頻消息
MsgType: 62 # 小視頻消息
FromUserName: 發送方ID
ToUserName: 接收方ID
MsgId: 用于獲取小視頻
Content:
<msg>
<img length="6503" hdlength="0" />
<commenturl></commenturl>
</msg>
篇幅有限,先展示這幾種消息結構,有個大概的認識,更多的消息結構請參考官網文檔。
賬號類型
我們平時使用微信中,經常接觸的三種賬號,分別為好友、公眾號、群聊。 itchat 為這三種類型的賬號分別提供了整體獲取和根據條件搜索的方法,接下來我們分別介紹下每種類型的使用方式。
好友
1、好友的獲取方法為 get_friends,將會返回完整的好友列表:
- 其中每個好友為一個字典
- 列表的第一項為本人的賬號信息
- 傳入 update 鍵為 True 將可以更新好友列表并返回
2、好友的搜索方法為 search_friends,目前有如下四種搜索方式:
- 僅獲取自己的用戶信息: search_friends()
- 獲取特定 UserName 的用戶信息: search_friends(userName='好友昵稱')
- 獲取備注、微信號、昵稱中的任何一項等于name鍵值的用戶:search_friends(name='搜索名稱')
- 獲取備注、微信號、昵稱分別等于相應鍵值的用戶:search_friends(wechatAccount='搜索名稱')
- 以上第3和4項功能可以一同使用:itchat.search_friends(name='小白', wechatAccount='littleboy')
3、更新用戶信息的方法為 update_friend,該方法需要傳入用戶的 UserName,返回指定用戶的最新信息。當然也可以傳入 UserName 組成的列表,那么相應的也會返回指定用戶的最新信息組成的列表。
公眾號
1、公眾號的獲取方法為 get_mps,將會返回完整的公眾號列表:
- 其中每個公眾號為一個字典
- 傳入 update 鍵為 True 將可以更新公眾號列表并返回
2、公眾號的搜索方法為 search_mps,有兩種搜索方法:
- 獲取特定 UserName 的公眾號:search_mps(userName='公眾號名')
- 獲取名字中含有特定字符的公眾號,返回值為一個字典的列表:search_mps(name='littleboy')
群聊
1、群聊的獲取方法為 get_chatrooms,將會返回完整的群聊列表:
- 其中每個群聊為一個字典
- 傳入 update 鍵為 True 將可以更新群聊列表并返回通訊錄中保存的群聊列表
- 群聊列表為后臺自動更新,如果中途意外退出存在極小的概率產生本地群聊消息與后臺不同步
- 為了保證群聊信息在熱啟動中可以被正確的加載,即使不需要持續在線的程序也需要運行 itchat.run()
- 如果不想要運行上述命令,請在退出程序前調用 itchat.dump_login_status(),更新熱拔插需要的信息
2、群聊的搜索方法為 search_chatrooms,有兩種搜索方法,分別是通過傳參 userName 和 name 進行搜索,方式同公眾號搜索相似。
3、群聊用戶列表的獲取方法為 update_chatroom,同時需要關注以下幾點:
- 如果想要更新該群聊的其他信息也可以用該方法
- 群聊在首次獲取中不會獲取群聊的用戶列表,所以需要調用該命令才能獲取群聊的成員
- 該方法需要傳入群聊的 UserName,返回特定群聊的詳細信息
- 同樣也可以傳入 UserName 組成的列表,那么相應的也會返回指定用戶的最新信息組成的列表
4、創建、增加、刪除群聊用戶的方法如下所示:
memberList = itchat.get_friends()[1:]
# 創建群聊,topic鍵值為群聊名
chatroomName = itchat.create_chatroom(memberList, '測試群聊')
# 刪除群聊內的群友
itchat.delete_member_from_chatroom(chatroomName, memberList[0])
# 增加好友進入群聊
itchat.add_member_into_chatroom(chatroomName, memberList[0], useInvitation=False)
不過還需要注意以下幾點:
- 由于之前通過群聊檢測是否被好友拉黑的程序,目前這三個方法都被嚴格限制了使用頻率
- 刪除群聊需要本賬號為群管理員,否則會失敗
- 將用戶加入群聊有直接加入與發送邀請,通過 useInvitation 設置
- 超過40人的群聊無法使用直接加入的加入方式,特別注意
總結
本文為大家簡單介紹了 itchat 所提供的大部分功能,通過這些功能我們完全可以非常方便的開發出一個微信聊天機器人。還有目前微信對新賬號有限制,即不能登陸微信網頁版,所以這種賬號也不能通過 itchat 登陸。另外 GitHub 上也有很多基于 itchat 做的開源機器人項目,有興趣可以去搜索,再次感謝各位開源作者的貢獻。
參考
- itchat 文檔:https://itchat.readthedocs.io/zh/latest/