Python微信操控(itchat)

東小東發表於2019-05-31

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()

 

相關文章