itchat
itchat是一個開源的微信個人號接口,使用python調用微信從未如此簡單。
使用不到三十行的代碼,你就可以完成一個能夠處理所有信息的微信機器人。
當然,該api的使用遠不止一個機器人,更多的功能等着你來發現,比如這些。
該接口與公眾號接口itchatmp共享類似的操作方式,學習一次掌握兩個工具。
如今微信已經成為了個人社交的很大一部分,希望這個項目能夠幫助你擴展你的個人的微信號、方便自己的生活。
安裝
可以通過本命令安裝itchat:
pip install itchat
簡單入門實例
有了itchat,如果你想要給文件傳輸助手發一條信息,只需要這樣:
import itchat itchat.auto_login() itchat.send('Hello, filehelper', toUserName='filehelper')
如果你想要回復發給自己的文本消息,只需要這樣:
import itchat @itchat.msg_register(itchat.content.TEXT) def text_reply(msg): return msg['Text'] itchat.auto_login() itchat.run()
一些進階應用可以在下面的開源機器人的源碼和進階應用中看到,或者你也可以閱覽文檔。
試一試
這是一個基於這一項目的開源小機器人,百聞不如一見,有興趣可以嘗試一下。
截屏
進階應用
各類型消息的注冊
通過如下代碼,微信已經可以就日常的各種信息進行獲取與回復。
#coding=utf8 import itchat, time from itchat.content import * @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING]) def text_reply(msg): itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName']) @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO]) def download_files(msg): msg['Text'](msg['FileName']) return '@%s@%s' % ({'Picture': 'img', 'Video': 'vid'}.get(msg['Type'], 'fil'), msg['FileName']) @itchat.msg_register(FRIENDS) def add_friend(msg): itchat.add_friend(**msg['Text']) # 該操作會自動將新好友的消息錄入,不需要重載通訊錄 itchat.send_msg('Nice to meet you!', msg['RecommendInfo']['UserName']) @itchat.msg_register(TEXT, isGroupChat=True) def text_reply(msg): if msg['isAt']: itchat.send(u'@%s\u2005I received: %s' % (msg['ActualNickName'], msg['Content']), msg['FromUserName']) itchat.auto_login(True) itchat.run()
命令行二維碼
通過以下命令可以在登陸的時候使用命令行顯示二維碼:
itchat.auto_login(enableCmdQR=True)
部分系統可能字幅寬度有出入,可以通過將enableCmdQR賦值為特定的倍數進行調整:
# 如部分的linux系統,塊字符的寬度為一個字符(正常應為兩字符),故賦值為2 itchat.auto_login(enableCmdQR=2)
默認控制台背景色為暗色(黑色),若背景色為淺色(白色),可以將enableCmdQR賦值為負值:
itchat.auto_login(enableCmdQR=-1)
退出程序后暫存登陸狀態
通過如下命令登陸,即使程序關閉,一定時間內重新開啟也可以不用重新掃碼。
itchat.auto_login(hotReload=True)
用戶搜索
使用search_friends
方法可以搜索用戶,有四種搜索方式: 1. 僅獲取自己的用戶信息 2. 獲取特定UserName
的用戶信息 3. 獲取備注、微信號、昵稱中的任何一項等於name
鍵值的用戶 4. 獲取備注、微信號、昵稱分別等於相應鍵值的用戶
其中三、四項可以一同使用,下面是示例程序:
# 獲取自己的用戶信息,返回自己的屬性字典 itchat.search_friends() # 獲取特定UserName的用戶信息 itchat.search_friends(userName='@abcdefg1234567') # 獲取任何一項等於name鍵值的用戶 itchat.search_friends(name='littlecodersh') # 獲取分別對應相應鍵值的用戶 itchat.search_friends(wechatAccount='littlecodersh') # 三、四項功能可以一同使用 itchat.search_friends(name='LittleCoder機器人', wechatAccount='littlecodersh')
關於公眾號、群聊的獲取與搜索在文檔中有更加詳細的介紹。
附件的下載與發送
itchat的附件下載方法存儲在msg的Text鍵中。
發送的文件的文件名(圖片給出的默認文件名)都存儲在msg的FileName鍵中。
下載方法接受一個可用的位置參數(包括文件名),並將文件相應的存儲。
@itchat.msg_register(['Picture', 'Recording', 'Attachment', 'Video']) def download_files(msg): msg['Text'](msg['FileName']) itchat.send('@%s@%s'%('img' if msg['Type'] == 'Picture' else 'fil', msg['FileName']), msg['FromUserName']) return '%s received'%msg['Type']
如果你不需要下載到本地,僅想要讀取二進制串進行進一步處理可以不傳入參數,方法將會返回圖片的二進制串。
@itchat.msg_register(['Picture', 'Recording', 'Attachment', 'Video']) def download_files(msg): with open(msg['FileName'], 'wb') as f: f.write(msg['Text']())
用戶多開
使用如下命令可以完成多開的操作:
import itchat newInstance = itchat.new_instance() newInstance.auto_login(hotReload=True, statusStorageDir='newInstance.pkl') @newInstance.msg_register(TEXT) def reply(msg): return msg['Text'] newInstance.run()
退出及登陸完成后調用特定方法
登陸完成后的方法需要賦值在loginCallback
中。
而退出后的方法需要賦值在exitCallback
中。
import time import itchat def lc(): print('finish login') def ec(): print('exit') itchat.auto_login(loginCallback=lc, exitCallback=ec) time.sleep(3) itchat.logout()
若不設置loginCallback的值,則將會自動刪除二維碼圖片並清空命令行顯示。
常見問題與解答
Q: 為什么中文的文件沒有辦法上傳?
A: 這是由於requests
的編碼問題導致的。若需要支持中文文件傳輸,將fields.py(py3版本見這里)文件放入requests包的packages/urllib3下即可
Q: 如何通過這個包將自己的微信號變為控制器?
A: 有兩種方式:發送、接受自己UserName的消息;發送接收文件傳輸助手(filehelper)的消息
Q: 為什么我發送信息的時候部分信息沒有成功發出來?
A: 有些賬號是天生無法給自己的賬號發送信息的,建議使用filehelper
代替。
作者
LittleCoder: 構架及維護Python2 Python3版本。
tempdban: 協議、構架及日常維護。
Chyroc: 完成第一版本的Python3構架。
類似項目
liuwons/wxBot: 類似的基於Python的微信機器人
zixia/wechaty: 基於Javascript(ES6)的微信個人賬號機器人NodeJS框架/庫
sjdy521/Mojo-Weixin: 使用Perl語言編寫的微信客戶端框架,可通過插件提供基於HTTP協議的api接口供其他語言調用
問題和建議
如果有什么問題或者建議都可以在這個Issue和我討論
當然也可以加入我們新建的QQ群討論:549762872