如今的平常生活已經離不開微信,本文將會拋磚引玉演示如何使用Python調用微信API作一些有意思的東西。python
看完這一系列教程,你就能從頭開始實現本身關於微信的想法。git
本文爲教程的第二部分,主要以微信控制器、羣發助手、好友刪除檢測爲例演示如何調用微信API。github
Python基礎並不困難,因此即便沒有這方面基礎輔助搜索引擎也徹底能夠學習本教程。微信
關於本教程有任何建議或者疑問,都歡迎郵件與我聯繫(i7meavnktqegm1b@qq.com),或者在github上提出。框架
這一系列教程從如何分析微信協議開始,第一部分教你如何從零開始獲取並模擬擴展我的微信號所須要的協議。工具
第二部分將會就這些協議進行利用,以各項目爲例介紹一些微信有意思功能的實現。學習
第三部分就協議的一些高級用法進行介紹,對框架作進一步介紹與擴展。搜索引擎
本文爲教程的第二部分。spa
完成了本文的學習,你將會完成三個小項目:(出於方便二次閱讀,括號中都放上了源碼連接)調試
使用微信協議完成機器人較爲日常,若是對具體細節感興趣,能夠添加我的號littlecodersh
並回復「源代碼」。
本文主要基於微信API的第三方包itchat,你能夠在項目主頁獲取更多信息。
本文是這一教程的第二部分,須要基本的pip可用的Python環境。
本教程使用的環境以下:
Windows 8.1 (其餘平臺也可用)
Python 2 or 3
微信版本6.3.25
在項目主頁上,專門有人就微信做爲智能家居入口向我提出了不少想法。
若是微信能夠做爲控制器,就能夠沒必要自制手機端客戶端的麻煩。
其實這個需求實現起來很是簡單,這裏我借鑑了yaphone的RasWxMusicbox,使用了其中部分的代碼做爲演示。
這是一個經過微信控制電腦播放音樂的小項目,那麼主要就是三個功能:
輸入「幫助」,顯示幫助
輸入「關閉」,關閉音樂播放
輸入具體歌名,進入歌曲的選擇
換成代碼就是這樣一個邏輯:
if msg == u'關閉': close_music() print(u'音樂已關閉') if msg == u'幫助': print(u'幫助信息') else: print(interact_select_song(msg))
那麼如今須要解決的就是如何關閉音樂,如何選擇音樂和如何使用微信交互。
關閉音樂咱們這裏使用打開空文件的方式,而選擇音樂咱們使用網易雲音樂的API完成:
import os # 經過該命令安裝該API: pip install NetEaseMusicApi from NetEaseMusicApi import interact_select_song with open('stop.mp3', 'w') as f: pass def close_music(): os.startfile('stop.mp3')
而微信的調用能夠經過itchat包簡單的完成,這裏要注意的是:
有些帳號沒法與本身通訊,因此咱們選擇與文件傳輸助手(filehelper)通訊
爲了防止對於其餘消息的響應,咱們在第一行過濾了無關信息
itchat.run的選項分別爲容許熱拔插,方便調試
# 接上段程序 # 經過該命令安裝該API: pip install itchat import itchat @itchat.msg_register(itchat.content.TEXT) def music_player(msg): if msg['ToUserName'] != 'filehelper': return if msg['Text'] == u'關閉': close_music() itchat.send(u'音樂已關閉', 'filehelper') if msg['Text'] == u'幫助': itchat.send(u'幫助信息', 'filehelper') else: itchat.send(interact_select_song(msg['Text']), 'filehelper') itchat.auto_login(True) itchat.send(HELP_MSG, 'filehelper') itchat.run()
itchat對經常使用功能都作好了封裝,調用仍是很是容易的。
完整的程序我放在了gist上面,使用時不要忘記安裝第三方包。
經過與文件傳輸助手的交互,微信就可以輕鬆變成其餘程序的入口。
在短信的時代,逢年過節都會須要接收和發送大量的短信。
雖然本身也看到短信就煩,但不發又怕會錯過什麼。
因此當時就產生了各式各樣的羣發工具,最簡單的好比在消息中加入暱稱,讓人感受不像羣發。
不過惋惜的是,微信自帶的羣發助手真的只是羣發。
固然,稍加操做,一切皆有可能。
例如在消息中加入暱稱:
經過get_friends
方法能夠輕鬆獲取全部的好友(好友首位是本身)
基於不一樣的好友能夠發送不一樣的消息
這條程序運行後是真的會發消息出去,若是隻是演示目的,把itchat.send
改成print
便可
#coding=utf8 import itchat, time itchat.auto_login(True) SINCERE_WISH = u'祝%s新年快樂!' friendList = itchat.get_friends(update=True)[1:] for friend in friendList: # 若是是演示目的,把下面的方法改成print便可 itchat.send(SINCERE_WISH % (friend['DisplayName'] or friend['NickName']), friend['UserName']) time.sleep(.5)
又例如給特定的人發送特定的消息。
咱們這裏經過羣聊實現,劃定一個羣聊,在羣聊內則私信發送祝福。
若是僅是建立羣聊不說話,對方是不會有提示的
羣聊若是不保存到通信錄,是沒法在各設備之間同步的(因此itchat也沒法讀取到)
羣聊在被獲取的時候不會自帶用戶列表,因此須要使用update_chatroom
更新用戶列表
固然,若是隻是演示目的,把itchat.send
改成print
便可
#coding=utf8 import itchat, time itchat.auto_login(True) REAL_SINCERE_WISH = u'祝%s新年快樂!!' chatroomName='wishgroup' itchat.get_chatrooms(update=True) chatrooms = itchat.search_chatrooms(name=chatroomName) if chatrooms is None: print(u'沒有找到羣聊:' + chatroomName) else: chatroom = itchat.update_chatroom(chatrooms[0]['UserName']) for friend in chatroom['MemberList']: friend = itchat.search_friends(userName=friend['UserName']) # 若是是演示目的,把下面的方法改成print便可 itchat.send(REAL_SINCERE_WISH % (friend['DisplayName'] or friend['NickName']), friend['UserName']) time.sleep(.5)
因此個人通信錄裏會有歷來不用的客戶羣、教師羣什麼的。
完整的程序我放在了gist上面,使用時不要忘記安裝第三方包。
固然,爲了防止誤操做,完整程序中我把全部的itchat.send
換成了print
。
另外,不僅有文字能夠發送,文件、圖片也都是可行的,具體操做見itchat的文檔了。
itchat獲取微信能夠獲取到的各類內容也都很是方便。
其他的例如生日,節日什麼的就看具體需求了。
有時候咱們會想知道某個好友有沒有刪除本身或者把本身拉入黑名單。
這一操做使用itchat也會變的很是簡單。
原理的話,在於將好友拉入羣聊時,非好友和黑名單好友不會被拉入羣聊。
因此羣聊的返回值中就有了好友與你關係的數據。
另外,羣聊在第一次產生普通消息時纔會被除建立者之外的人發現的(系統消息不算普通消息)。
這樣,就能夠隱蔽的完成好友檢測。
寫成代碼的話,這個操做就是這樣的:(只是演示,不能運行,運行版本在段末)
chatroomUserName = '@1234567' friend = itchat.get_friends()[1] r = itchat.add_member_into_chatroom(chatroomUserName, [friend]) if r['BaseResponse']['ErrMsg'] == '': status = r['MemberList'][0]['MemberStatus'] itchat.delete_member_from_chatroom(chatroom['UserName'], [friend]) return { 3: u'該好友已經將你加入黑名單。', 4: u'該好友已經將你刪除。', }.get(status, u'該好友仍舊與你是好友關係。')
其中,經過add_member_into_chatroom
操做獲取咱們須要的返回值,便可獲得好友的狀態。
一樣的,此次咱們也將文件傳輸助手做爲終端,具體方法與控制器一節相似。
此次咱們肯定的交互方式是接收「名片」消息,並判斷名片中的好友與本身的關係。
那麼獲取名片信息的內容能夠這麼寫:
import itchat @itchat.msg_register(itchat.content.CARD) def get_friend(msg): if msg['ToUserName'] != 'filehelper': return friendStatus = get_friend_status(msg['RecommendInfo']) itchat.send(friendStatus['NickName'], 'filehelper') itchat.auto_login(True) itchat.run()
那麼咱們所須要的全部部分就都解決了,下面將他們組合起來便可。
完整的程序我放在了gist上面,使用時不要忘記安裝第三方包。
在網頁版微信的接口受到限制以前徹底能夠批量進行這一操做,檢測哪些好友刪除了本身。
但目前顯然操做存在頻率限制,因此只能作一些變通了。
到這裏這一篇文章的主要內容就結束了。
主要從微信做爲終端使用、自定義的消息交互、微信協議研究三方面開了一個簡單的頭。
其他有一些過於大衆,如機器人,就再也不贅述。
而另外一些,須要必定的基礎或者不適合分享,就留給各位自行研究。
若是要留個懸念,能夠想象添加好友的方法status傳2,輕鬆實現好友病毒式擴張。
利用微信的API能夠作不少事情,文檔我放在這裏,祝好運!
但願讀完這篇文章能對你有幫助,有什麼不足之處萬望指正(鞠躬)。
有什麼想法或者想要關注個人更新,歡迎來Github上Star或者Fork。
160928
LittleCoder
EOF