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

