第73天: itchat 微信機器人簡介


by 極光

今天來為大家介紹一個有意思的開源微信個人號 API,它是基於 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.

如果你向這個登陸后的微信發送文本消息,則會直接把你發送的消息內容在終端打印出來。

關於登陸這里還有幾點要說明下:

  1. itchat提供了登陸狀態暫存,關閉程序后一定時間內不需要掃碼即可登錄。只需要在 auto_login 方法中傳入 hotReload=True 即可。
  2. 為了方便在無圖形界面使用itchat,程序內置了命令行二維碼的顯示。只需要在 auto_login 方法中傳入 enableCmdQR=True 即可。
  3. 可以自定義登陸,比如更改提示語、二維碼出現后郵件發送等。

關於自定義登陸所需要的方法,登陸的過程按順序為:

  • 獲取二維碼uuid,方法名稱:get_QRuuid
  • 獲取二維碼,方法名稱:get_QR
  • 判斷是否已經登陸成功,方法名稱:check_login
  • 獲取初始化數據,方法名稱:web_init
  • 更新微信相關信息(通訊錄、手機登陸狀態),方法名稱:get_friendsshow_mobile_login
  • 循環掃描新信息(開啟心跳),方法名稱:start_receiving

以上簡單介紹了下關於登陸相關的內容,如果想了解更詳細信息請查看官方文檔。

注冊消息方法

itchat 將根據接收到的消息類型尋找對應的已經注冊的方法,如果一個消息類型沒有對應的注冊方法,該消息將會被舍棄,就像我們上面代碼只注冊了 TEXT 類型的消息才會被打印出來。當然在運行過程當中也可以動態注冊方法,注冊方式與結果不變。

消息類型

itchat 支持多種類型的消息處理,具體類型和參數詳見下表:

參數 類型 Text鍵值
TEXT 文本 文本內容
MAP 地圖 位置文本
CARD 名片 推薦人字典
NOTE 通知 通知文本
SHARING 分享 分享名稱
PICTURE 圖片/表情 下載方法
RECORDING 語音 下載方法
ATTACHMENT 附件 下載方法
VIDEO 小視頻 下載方法
FRIENDS 好友邀請 添加好友所需參數
SYSTEM 系統消息 更新內容的用戶或群聊的UserName組成的列表

注冊消息

注冊消息有兩種方法:

  1. 不帶具體對象注冊,將注冊為普通消息的回復方法
  2. 帶對象參數注冊,對應消息對象將調用該方法
# 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,有兩種搜索方法,分別是通過傳參 userNamename 進行搜索,方式同公眾號搜索相似。

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 做的開源機器人項目,有興趣可以去搜索,再次感謝各位開源作者的貢獻。

參考

示例代碼:https://github.com/JustDoPython/python-100-day

關注公眾號:python技術,回復"python"一起學習交流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM