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

