【itchat】
itchat是個基於網頁版微信的python微信API。功能目前做到基本可以滿足正常的消息收發,信息的獲取等等。不過對於紅包之類網頁版微信不支持的功能,這個模塊自然也就無法支持了。
■ 安裝與基本使用
安裝就用pip就可以了。
基本使用:
首先進行登錄,登出和發送消息,獲取好友信息等等簡單操作。
import itchat def find_friend(nick_name): for friend in itchat.get_friends(): if friend['NickName'] == nick_name: return friend def main(): itchat.auto_login(True) friend = find_friend(u'spiritual') username = friend['UserName'] itchat.send(msg=u'你好啊',toUserName=username) itchat.logout() if __name__ == "__main__": main()
按照代碼邏輯,首先調用的是auto_login方法,這個方法就可以視為是登錄方法,初次調用此方法時itchat會自動生成一個二維碼並且顯示出來讓你掃二維碼確認登錄。至於其auto不auto在於參數有沒有True。當參數為True的時候,意思是說保持熱登錄狀態,初次登錄后會把登錄的一些信息保存在同目錄下的itchat.pkl文件中,即使這次程序運行結束,下次在同目錄下再次調用這個方法的時候可以不用再掃二維碼登錄了。根據網頁版微信的登錄機制,這種保持是有時限的,隔一段時間后就要重新登錄。
find_friend方法接受一個用戶昵稱,然后調用了get_friends方法,這個方法放回的是一個當前用戶所有好友組成的列表。一個好友可以視為一個字典結構,有UserName,NickName,Province,City,Sex等等字段的信息。需要注意的是UserName這個字段是處理過的,不是微信ID。而且這個UserName會根據每次登錄而變化,所以對於程序而言,最好是能動態地獲取這個信息,然后作為參數被其他函數調用。
send方法是籠統的發送消息的方法。指定msg為普通字符串時發送普通文本信息,toUserName就用到了剛才解析出的UserName的值。
logout自然就是登出了。因為設置了True,所以這里登不登出無所謂了,反正下次都是自動登錄了。如果toUserName沒有指出或為None,那么就發送給自己。
● 通過send方法發送其他類型的信息
如果想通過send方法發送一些其他類型的信息比如文件、圖片、視頻等,可以另msg等於一個有格式的字符串:
發送文件: msg='@fil@path_to_file'
發送圖片:msg='@img@path_to_img'
發送視頻:msg='@vid@path_to_vid'
這樣就可以把程序所在計算機上的一些資源通過微信發送出去了。
send方法返回True或False來提示發送成功或失敗,除了send,還有send_msg,send_image等一些經過一些包裝的方法,這里就不多說了。
■ 注冊消息
上面說的都是由本用戶發送消息給其他用戶,其實itchat還可以監聽別人發給本用戶的消息並根據消息做出一些反應。結合上面的send等方法就可以實現自動回復了。監聽的具體實現就是通過裝飾器來注冊消息。比如:
@itchat.msg_register(itchat.content.TEXT) def simple_reply(recv_msg): msg = recv_msg['Text'] if msg == 'name': itchat.send(msg=u'我的名字是Takanashi',toUserName=recv_msg['FromUserName']) elif msg == 'age': itchat.send(msg=u'我今年10歲了',toUserName=recv_msg['FromUserName'])
itchat.run()
這個注冊方法就監聽了所有普通文本類型的消息,當消息是name或age的時候就返回相關的信息。注意這個注冊函數接受的參數recv_msg不是單純的文本而也是一個字典類型的結構。
最后別忘了調用itchat.run來啟動自動回復。
*當對同一種類型的消息進行了多次注冊的話那么以最后一次注冊情況為准。
● 帶參數注冊
再來深入看下msg_register這個裝飾器。上面使用的時候添加了一個參數itchat.content.TEXT,這是指出了注冊在這個裝飾器下的函數是用於處理文本類型消息的。
除了TEXT這個類型以外,還可以用以下的類型來標識發送過來的信息,從而實現對不同類別的信息作出不同類別的反應。
MAP 地理位置的分享
CARD 名片信息
SHARING 鏈接分享
PICTURE 表情或照片
RECORDING 語音
ATTACHMENT 附件
VIDEO 視頻
FRIENDS 加好友申請,也就是說發起的一個好友申請其實是一條特殊的信息
SYSTEM 系統消息,比如系統推送消息或者是某個群成員發生變動等等
NOTE 通知文本,比如撤回了消息等等
對於非文本類型的信息,在注冊的響應函數中的參數recv_msg結構上和文本信息是類似的。比如下面這個注冊的響應函數可以自動把所有發過來的附件、語音等類型的信息保存到本地:
@itchat.msg_register([ATTACHMENT,PICTURE,RECORDING,VIDEO]) def download_attach(recv_msg): recv_msg['Text'](recv_msg['FileName']) itchat.send(msg='Received Your Message',toUserName=recv_msg['FromUserName'])
從中可以看出,文本信息的msg['Text']值是一段文本,而這些類型信息的msg['Text']的值卻是一個函數,這個函數的作用就是接受一個本地的文件路徑然后把目標文件保存在這個路徑上,換言之就是下載了這個文件。
在想要進行某種類型的信息進行注冊響應函數的時候,可以先實驗性地用發送一條相關類型的信息,捕捉下獲取到的Msg對象,逐一分析字段,,然后根據自己的需要進行編程。
再回到msg_register這個裝飾器上來,除了第一個參數,我們還可以添加一些其他參數比如isGroupChat=True就表示注冊的響應函數只響應來自群聊的信息。此時的recv_msg對象中會有isAt這個Key,當其值為True時表明在這條消息中我被@了。與之相對的還有isFriendChat應該是表明消息來自一般的好友聊天。比如下面這段代碼可以將好友推薦過來的名片自動加好友:
@itchat.msg_register(CARD) def add_friend(msg): print msg['Text'] print msg['Content'] itchat.add_friend(userName=msg['Text']['UserName']) print msg['RecommendInfo'] print msg['RecommendInfo']['UserName']
■ 賬號類方法
剛才上面也已經用過了get_friends這個方法。其實類似的跟好友、賬號相關的方法還有一些:
get_friends 返回所有好友組成的列表,第一個是自己,此外還能傳入update=True參數用於獲取更新后的列表。
search_friends 這個方法的參數是多種多樣的。如果是空參,那么返回自己的信息。如果有參數userName那么就是用戶對象中userName字段的值作為查詢的依據。如果name=xxx是根據我們對好友的備注來找人,wechatAccount=xxx則是根據微信ID來找人
update_friend 有時候好友更新了資料比如頭像,我們是無法第一時間知道的,這個方法就是手動觸發更新資料的操作。參數可以傳入一個userName的值或者一些值的列表來更新一個或一些用戶的信息
get_mps 返回關注的全部公眾號列表
search_mps 公眾號也是有UserName這個屬性的,所以可以通過UserName來選擇返回特定的一個公眾號的信息
■ 群聊類方法
get_chatrooms 返回所有群聊的列表,可以加參數update=True,此時手動更新信息並且返回在通訊錄中保存過的群聊列表的信息。
要獲取群聊信息時,有一點比較Tricky的是群聊列表的信息並不是和賬戶直接相關,而是每次登錄的時候進行動態加載的,這就使得利用API來獲取群聊列表的時候有時候會失靈。為了正確地獲取群聊列表,應該即使沒有需要時也要保證itchat.run()的運行。假如一定不想運行這個run的話可以在程序結束前調用itchat.dump_login_status()方法來更新熱插拔時itchat所需要的登錄狀態。
search_chatroom 搜尋特定的群聊信息。群聊同樣有UserName這個字段的信息用於特定一個群聊用。
update_chatroom 更新群聊信息
暫時寫到這里吧。。好玩是挺好玩的,懶得往下寫了。。
