itchat是一個開源的微信個人號接口,使用python調(diào)用微信從未如此簡單。
開源地址
https://github.com/littlecodersh/ItChat
文檔:
https://itchat.readthedocs.io/zh/latest/
安裝:
pip3 install itchat
登入與登出
登入并向文件助手發(fā)送一句話,登入時會經(jīng)過掃碼操作,類似于電腦微信登入
1 import itchat 2 # 登入并保存登入狀態(tài),實現(xiàn)第一次運行時掃碼,一定時間內(nèi)再次運行就不用掃碼了,手機微信上將顯示:網(wǎng)頁微信已登入..... 3 itchat.auto_login(hotReload= True) 4 # 發(fā)送文本數(shù)據(jù)到文件助手 5 itchat.send( " 東小東你好123 " ,toUserName= " filehelper " )
登出:
itchat.logout()
注冊登入登出的回調(diào)方法
1 def ldong(): 2 print ( ' 微信登入 ' ) 3 def edong(): 4 print ( ' 微信登出 ' ) 5 # 登入 6 itchat.auto_login(hotReload=True,loginCallback=ldong, exitCallback=edong)
命令行二維碼
通過以下命令可以在登陸的時候使用命令行顯示二維碼:
itchat.auto_login(enableCmdQR=True)
部分系統(tǒng)可能字幅寬度有出入,可以通過將enableCmdQR賦值為特定的倍數(shù)進行調(diào)整:
# 如部分的linux系統(tǒng),塊字符的寬度為一個字符(正常應(yīng)為兩字符),故賦值為2 itchat.auto_login(enableCmdQR=2)
默認控制臺背景色為暗色(黑色),若背景色為淺色(白色),可以將enableCmdQR賦值為負值:
itchat.auto_login(enableCmdQR=-1)
可接受監(jiān)聽的數(shù)據(jù)類型
消息分類:
圖片或表情(PICTURE)、錄制(RECORDING)、附件(ATTACHMENT)、小視頻(VIDEO)、文本(TEXT),地圖(MAP),名片(CARD),通知(NOTE),分享(SHARING),好友邀請(FRIENDS)、語音(RECORDING)、系統(tǒng)消息(SYSTEM)
獲取消息內(nèi)容:
可以通過print(msg)方法查看消息里的所有數(shù)據(jù),然后進行提取
@itchat.msg_register(itchat.content.TEXT) def text_reply(msg): print (msg)
消息捕獲
針對朋友的消息捕獲
登入時不適用于hotReload=True,因為多次運行會多次注冊自動回復(fù),比如在沒有登出的情況下運行3次程序,就會出現(xiàn)1次接受3次發(fā)送的效果
監(jiān)聽函數(shù)只有在對方發(fā)送數(shù)據(jù)時進入
文本
1 import itchat 2 # 自動回復(fù) 3 @itchat.msg_register(itchat.content.TEXT) 4 def text_reply(msg): 5 return " 東小東回復(fù)數(shù)據(jù): " +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 " ] # 得到文件路徑,目錄需要手動創(chuàng)建 9 msg.download(filedpx) # 下載 10 return " 你發(fā)送的文件類型 " +msg[ ' Type ' ]+ " 保存地址為:filex/ " +msg.fileName
針對群聊的自動監(jiān)測
如果想添加針對群聊的監(jiān)測,則在監(jiān)聽函數(shù)加入isGroupChat=True
監(jiān)聽函數(shù)只要有數(shù)據(jù)發(fā)送就會進入,包括自己發(fā)送的數(shù)據(jù)
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 " 東小東回復(fù)數(shù)據(jù)xx: " +msg[ " Text " ] 7 # 只對個人用戶有效 8 @itchat.msg_register(itchat.content.TEXT) 9 def text_reply(msg): 10 return " 東小東回復(fù)數(shù)據(jù): " +msg[ " Text " ] 11 # 登入 12 itchat.auto_login() 13 # 保持運行 14 itchat.run()
@我信息監(jiān)測
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+ " 東你發(fā)的信息為: " + msg.text 8 9 itchat.auto_login() # 登入 10 usermsgx=itchat.search_friends() # 得到當(dāng)前用戶的信息 11 itchat.run() # 保持運行
針對所有信息來源信息監(jiān)聽
朋友、群聊、公眾號
@itchat.msg_register(TEXT, isFriendChat=True, isGroupChat=True, isMpChat= True) def simple_reply(msg): return ' I received: %s ' % msg.text
數(shù)據(jù)發(fā)送
return
在接收數(shù)據(jù)函數(shù)里的return “數(shù)據(jù)” 則是自動確認為回復(fù)當(dāng)前發(fā)送用戶數(shù)據(jù),可以刪除該句,則不進行數(shù)據(jù)回復(fù)
itchat.send,可以一次性發(fā)送多條
參數(shù):(內(nèi)容,用戶)
返回值:發(fā)送結(jié)果,是否發(fā)送成功,json數(shù)據(jù)
注意:文件地址不可為中文
內(nèi)容:可為單獨的字符串內(nèi)容,其他有【@類型@地址】,類型有圖片(img)、文件(fil)、視頻(vid)
用戶:省略則發(fā)個自己,不穩(wěn)定,msg['FromUserName']表示指定用戶為觸發(fā)用戶
1 res=itchat.send( ' 文本信息的發(fā)送......! ' , 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 ' ])
指定類型發(fā)送2
參數(shù):(地址,用戶)
返回值:發(fā)送結(jié)果,是否發(fā)送成功,json數(shù)據(jù)
注意:文件地址不可為中文
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()相同,但是可以已經(jīng)確定toUserName=msg['FromUserName'],不可更換
指定用戶(toUserName):
文件助手(發(fā)送給自己,必備):toUserName="filehelper"
發(fā)送者:toUserName=msg['FromUserName']
例子:
通過群名向群里發(fā)送內(nèi)容,該微信群需要在運行代碼前進行手動添加到通訊錄
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 ' ]) # 輸出群聊標(biāo)識符 13 itchat.send_msg( ' 大家好,這是發(fā)送的內(nèi)容 ' , toUserName=chatrooms[0][ ' UserName ' ]) # 發(fā)送消息 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 # 獲取分別對應(yīng)相應(yīng)鍵值的用戶 6 itchat.search_friends(wechatAccount= ' littlecodersh ' ) 7 # 三、四項功能可以一同使用 8 itchat.search_friends(name= ' LittleCoder機器人 ' , wechatAccount= ' littlecodersh ' )
得到用戶序號
@itchat.msg_register([TEXT,MAP]) def text_reply(msg): print (msg) print (msg[ " User " ][ " Uin " ])
更新用戶數(shù)據(jù),通過 UserName ,或者 UserName 列表
memberList = itchat.update_friend( ' @abcdefg1234567 ' )
注意:
中文文件名文件上傳
Q: 為什么中文的文件沒有辦法上傳??
A: 這是因為使用requests包會自動將中文文件名編碼為服務(wù)器端無法識別的格式,所以需要修改requests包或者使用別的方法上傳文件。
最簡單的方法即將requests包的packages/urlib3中的fields.py中的format_header_param方法改為如下內(nèi)容:
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: 為什么我在設(shè)定了itchat.auto_login()的enableCmdQR為True后還是沒有辦法在命令行顯示二維碼?
A: 這是由于沒有安裝可選的包pillow,可以使用右邊的命令安裝:pip install pillow
綜合:
實現(xiàn)文本信息的關(guān)聯(lián),及可以實時看到所關(guān)聯(lián)的賬號的聊天信息,當(dāng)發(fā)生聊天數(shù)據(jù)時會主動將聊天數(shù)據(jù)發(fā)送到主賬號上
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 # 查詢數(shù)據(jù)的接收者 7 touserx= " filehelper " # 默認為文件助手發(fā)送信息 8 if msg[ " ToUserName " ]!= " filehelper " : # 如果非文件助手信息 9 touserx=itchat.search_friends(userName=msg[ " ToUserName " ])[ " NickName " ] 10 inuserx = itchat.search_friends(userName=msg[ " FromUserName " ])[ " NickName " ] # 查詢數(shù)據(jù)的發(fā)送者 11 totouserx=itchat.search_friends(name= ' 東里個咚 ' )[0][ " UserName " ] # 通過昵稱查詢到username 12 texts=msg.text # 得到接收的數(shù)據(jù) 13 itchat.send_msg( " 【 " +thisuserx+ " 】\n " +inuserx+ " --> " +touserx+ " :\n " +texts,toUserName=totouserx) # 發(fā)送給目標(biāo) 14 15 # 登入 16 itchat.auto_login() 17 thisuserx=itchat.search_friends()[ " NickName " ] # 得到當(dāng)前用戶昵稱 18 # 保持運行 19 itchat.run()
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
