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