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()
一些進階應用可以在下面的開源機器人的源碼和進階應用中看到,或者你也可以閱覽文檔。
進階應用
特殊的字典使用方式
通過打印itchat的用戶以及註冊消息的參數,可以發現這些值都是字典。
但實際上itchat精心構造了相應的消息、用戶、羣聊、公衆號類。
其所有的鍵值都可以通過這一方式訪問:
@itchat.msg_register(TEXT)
def _(msg):
# equals to print(msg['FromUserName'])
print(msg.fromUserName)
屬性名爲鍵值首字母小寫後的內容。
author = itchat.search_friends(nickName='LittleCoder')[0]
author.send('greeting, littlecoder!')
各類型消息的註冊
通過如下代碼,微信已經可以就日常的各種信息進行獲取與回覆。
import itchat, time
from itchat.content import *
@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
msg.user.send('%s: %s' % (msg.type, msg.text))
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
msg.download(msg.fileName)
typeSymbol = {
PICTURE: 'img',
VIDEO: 'vid', }.get(msg.type, 'fil')
return '@%s@%s' % (typeSymbol, msg.fileName)
@itchat.msg_register(FRIENDS)
def add_friend(msg):
msg.user.verify()
msg.user.send('Nice to meet you!')
@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):
if msg.isAt:
msg.user.send(u'@%s\u2005I received: %s' % (
msg.actualNickName, msg.text))
itchat.auto_login(True)
itchat.run(True)
命令行二維碼
通過以下命令可以在登陸的時候使用命令行顯示二維碼:
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.download(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.download())
用戶多開
使用如下命令可以完成多開的操作:
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構架。
類似項目
youfou/wxpy: 優秀的api包裝和配套插件,微信機器人/優雅的微信個人號API
liuwons/wxBot: 類似的基於Python的微信機器人
zixia/wechaty: 基於Javascript(ES6)的微信個人賬號機器人NodeJS框架/庫
sjdy521/Mojo-Weixin: 使用Perl語言編寫的微信客戶端框架,可通過插件提供基於HTTP協議的api接口供其他語言調用
HanSon/vbot: 基於PHP7的微信個人號機器人,通過實現匿名函數可以方便地實現各種自定義的功能