Python微信操控(itchat)

itchat是一個開源的微信個人號接口,使用python調用微信從未如此簡單。

開源地址

https://github.com/littlecodersh/ItChat

文檔:

https://itchat.readthedocs.io/zh/latest/

安裝:

pip3 install itchat

登入與登出

登入並向文件助手發送一句話,登入時會經過掃碼操作,類似於電腦微信登入

1 import itchat
2 #登入並保存登入狀態,實現第一次運行時掃碼,一定時間內再次運行就不用掃碼了,手機微信上將顯示:網頁微信已登入.....
3 itchat.auto_login(hotReload=True)
4 #發送文本數據到文件助手
5 itchat.send("東小東你好123",toUserName="filehelper")

登出:

itchat.logout() 

註冊登入登出的回調方法

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)

部分系統可能字幅寬度有出入,可以通過將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 # 三、四項功能可以一同使用
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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章