itchat是一個開源的微信我的號接口,使用python調用微信從未如此簡單。python
開源地址linux
https://github.com/littlecodersh/ItChatgit
文檔:github
https://itchat.readthedocs.io/zh/latest/json
安裝:服務器
pip3 install itchat
登入並向文件助手發送一句話,登入時會通過掃碼操做,相似於電腦微信登入微信
1 import itchat 2 #登入並保存登入狀態,實現第一次運行時掃碼,必定時間內再次運行就不用掃碼了,手機微信上將顯示:網頁微信已登入..... 3 itchat.auto_login(hotReload=True) 4 #發送文本數據到文件助手 5 itchat.send("東小東你好123",toUserName="filehelper")
登出:ide
itchat.logout()
註冊登入登出的回調方法函數
1 def ldong(): 2 print('微信登入') 3 def edong(): 4 print('微信登出') 5 #登入 6 itchat.auto_login(hotReload=True,loginCallback=ldong, exitCallback=edong)
命令行二維碼this
經過如下命令能夠在登錄的時候使用命令行顯示二維碼:
itchat.auto_login(enableCmdQR=True)
部分系統可能字幅寬度有出入,能夠經過將enableCmdQR賦值爲特定的倍數進行調整:
#如部分的linux系統,塊字符的寬度爲一個字符(正常應爲兩字符),故賦值爲2 itchat.auto_login(enableCmdQR=2)
默認控制檯背景色爲暗色(黑色),若背景色爲淺色(白色),能夠將enableCmdQR賦值爲負值:
itchat.auto_login(enableCmdQR=-1)
消息分類:
圖片或表情(PICTURE)、錄製(RECORDING)、附件(ATTACHMENT)、小視頻(VIDEO)、文本(TEXT),地圖(MAP),名片(CARD),通知(NOTE),分享(SHARING),好友邀請(FRIENDS)、語音(RECORDING)、系統消息(SYSTEM)
獲取消息內容:
能夠經過print(msg)方法查看消息裏的全部數據,而後進行提取
@itchat.msg_register(itchat.content.TEXT) def text_reply(msg): print(msg)
針對朋友的消息捕獲
登入時不適用於hotReload=True,由於屢次運行會屢次註冊自動回覆,好比在沒有登出的狀況下運行3次程序,就會出現1次接受3次發送的效果
監聽函數只有在對方發送數據時進入
文本
1 import itchat 2 #自動回覆 3 @itchat.msg_register(itchat.content.TEXT) 4 def text_reply(msg): 5 return "東小東回覆數據:"+msg["Text"] 6 7 #登入 8 itchat.auto_login() 9 #保持運行 10 itchat.run()
文件下載
1 import itchat 2 #PICTURE, RECORDING, ATTACHMENT, VIDEO,TEXT 3 # 圖片、錄製、附件、視頻、文本 4 from itchat.content import PICTURE, RECORDING, ATTACHMENT, VIDEO,TEXT 5 6 @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO]) 7 def download_files(msg): 8 filedpx="./filex/"+msg["FileName"] #獲得文件路徑,目錄須要手動建立 9 msg.download(filedpx) #下載 10 return "你發送的文件類型"+msg['Type']+" 保存地址爲:filex/"+msg.fileName
針對羣聊的自動監測
若是想添加針對羣聊的監測,則在監聽函數加入isGroupChat=True
監聽函數只要有數據發送就會進入,包括本身發送的數據
1 import itchat 2 #只對羣消息有效 3 @itchat.msg_register(itchat.content.TEXT,isGroupChat=True) 4 def text_reply(msg): 5 if(msg["Text"]=="11"): 6 return "東小東回覆數據xx:"+msg["Text"] 7 #只對我的用戶有效 8 @itchat.msg_register(itchat.content.TEXT) 9 def text_reply(msg): 10 return "東小東回覆數據:"+msg["Text"] 11 #登入 12 itchat.auto_login() 13 #保持運行 14 itchat.run()
@我信息監測
1 import itchat 2 #只對羣消息有效 3 @itchat.msg_register(itchat.content.TEXT,isGroupChat=True) 4 def text_reply(msg): 5 #判斷是不是@本人 6 if msg["Text"].find("@"+usermsgx["NickName"])==0: 7 return "@"+msg.actualNickName+" 東你發的信息爲:"+msg.text 8 9 itchat.auto_login()#登入 10 usermsgx=itchat.search_friends()#獲得當前用戶的信息 11 itchat.run()#保持運行
針對全部信息來源信息監聽
朋友、羣聊、公衆號
@itchat.msg_register(TEXT, isFriendChat=True, isGroupChat=True, isMpChat=True) def simple_reply(msg): return 'I received: %s' % msg.text
return
在接收數據函數裏的return 「數據」 則是自動確認爲回覆當前發送用戶數據,能夠刪除該句,則不進行數據回覆
itchat.send,能夠一次性發送多條
參數:(內容,用戶)
返回值:發送結果,是否發送成功,json數據
注意:文件地址不可爲中文
內容:可爲單獨的字符串內容,其餘有【@類型@地址】,類型有圖片(img)、文件(fil)、視頻(vid)
用戶:省略則發個本身,不穩定,msg['FromUserName']表示指定用戶爲觸發用戶
1 res=itchat.send('文本信息的發送......!', toUserName=msg['FromUserName']) 2 res=itchat.send('@img@%s' % './filex/zcy.gif', toUserName=msg['FromUserName']) 3 res=itchat.send('@fil@%s' % './filex/tt.txt', toUserName=msg['FromUserName']) 4 res=itchat.send('@vid@%s' % './filex/videox.mp4', toUserName=msg['FromUserName'])
指定類型發送2
參數:(地址,用戶)
返回值:發送結果,是否發送成功,json數據
注意:文件地址不可爲中文
1 bb = itchat.send_msg('文字信息2', toUserName=msg['FromUserName']) 2 bb = itchat.send_image('./filex/zcy.gif', toUserName=msg['FromUserName']) 3 bb = itchat.send_file('./filex/tt.txt', toUserName=msg['FromUserName']) 4 bb = itchat.send_video('./filex/videox.mp4', toUserName=msg['FromUserName']) 5 print("返回值:",bb)
msg.user.send()
使用與itchat.send()相同,可是能夠已經肯定toUserName=msg['FromUserName'],不可更換
指定用戶(toUserName):
文件助手(發送給本身,必備):toUserName="filehelper"
發送者:toUserName=msg['FromUserName']
例子:
經過羣名向羣裏發送內容,該微信羣須要在運行代碼前進行手動添加到通信錄
1 import itchat 2 3 #登入 4 itchat.auto_login() 5 chatroomName='傻逼羣'#羣名 6 itchat.get_chatrooms(update=True) 7 chatrooms = itchat.search_chatrooms(name=chatroomName) 8 if len(chatrooms)==0 : 9 print('沒有找到羣聊:' + chatroomName) 10 exit(0) 11 else: 12 print(chatrooms[0]['UserName'])#輸出羣聊標識符 13 itchat.send_msg('你們好,這是發送的內容', toUserName=chatrooms[0]['UserName'])#發送消息 14 15 #保持運行 16 itchat.run()
獲取本人信息
usermsgx=itchat.search_friends() print(usermsgx) print(usermsgx["NickName"]) #獲得暱稱
獲取全部朋友信息
friendx=itchat.get_friends() print(friendx)
條件獲取朋友或者本身信息
1 # 獲取特定UserName的用戶信息 2 itchat.search_friends(userName='@abcdefg1234567') 3 # 獲取任何一項等於name鍵值的用戶 4 itchat.search_friends(name='littlecodersh') 5 # 獲取分別對應相應鍵值的用戶 6 itchat.search_friends(wechatAccount='littlecodersh') 7 # 3、四項功能能夠一同使用 8 itchat.search_friends(name='LittleCoder機器人', wechatAccount='littlecodersh')
獲得用戶序號
@itchat.msg_register([TEXT,MAP]) def text_reply(msg): print(msg) print(msg["User"]["Uin"])
更新用戶數據,經過UserName,或者UserName列表
memberList = itchat.update_friend('@abcdefg1234567')
中文文件名文件上傳
Q: 爲何中文的文件沒有辦法上傳?
A: 這是由於使用requests包會自動將中文文件名編碼爲服務器端沒法識別的格式,因此須要修改requests包或者使用別的方法上傳文件。
最簡單的方法即將requests包的packages/urlib3中的fields.py中的format_header_param方法改成以下內容:
1 def format_header_param(name, value): 2 if not any(ch in value for ch in '"\\\r\n'): 3 result = '%s="%s"' % (name, value) 4 try: 5 result.encode('ascii') 6 except UnicodeEncodeError: 7 pass 8 else: 9 return result 10 if not six.PY3: # Python 2: 11 value = value.encode('utf-8') 12 value = email.utils.encode_rfc2231(value, 'utf-8') 13 value = '%s="%s"' % (name, value.decode('utf8')) 14 return value
命令行顯示二維碼
Q: 爲何我在設定了itchat.auto_login()的enableCmdQR爲True後仍是沒有辦法在命令行顯示二維碼?
A: 這是因爲沒有安裝可選的包pillow,可使用右邊的命令安裝:pip install pillow
實現文本信息的關聯,及能夠實時看到所關聯的帳號的聊天信息,當發生聊天數據時會主動將聊天數據發送到主帳號上
1 import itchat 2 from itchat.content import PICTURE, RECORDING, ATTACHMENT, VIDEO,TEXT,MAP 3 #只對我的用戶有效 4 @itchat.msg_register([TEXT]) 5 def text_reply(msg): 6 # 查詢數據的接收者 7 touserx="filehelper"#默認爲文件助手發送信息 8 if msg["ToUserName"]!="filehelper":#若是非文件助手信息 9 touserx=itchat.search_friends(userName=msg["ToUserName"])["NickName"] 10 inuserx = itchat.search_friends(userName=msg["FromUserName"])["NickName"]#查詢數據的發送者 11 totouserx=itchat.search_friends(name='東里個咚')[0]["UserName"] #經過暱稱查詢到username 12 texts=msg.text #獲得接收的數據 13 itchat.send_msg("【"+thisuserx+"】\n"+inuserx+"-->"+touserx+" :\n"+texts,toUserName=totouserx) #發送給目標 14 15 #登入 16 itchat.auto_login() 17 thisuserx=itchat.search_friends()["NickName"] #獲得當前用戶暱稱 18 #保持運行 19 itchat.run()