说在前面:想要使用itchat库,重要的事情说三遍:
首先需要一个能登录网页版微信的微信号!
首先需要一个能登录网页版微信的微信号!!
首先需要一个能登录网页版微信的微信号!!!
个人python学习笔记的目录博客,点击可获取更多内容。【传送门】
itchat是python的一个第三方库,是一个网页版
微信个人号接口
,可以通过python来应用这个库实现对于微信的一些自动化操作。这些自动化操作都是基于收到信息,并以所收到的信息内容为基础,通过逻辑判断决定接下来的指令。
在这当中会涉及到很多的判断语句和循环结构。如果想要实现一些更加智能的回复效果,就像市面上很多的微信群聊机器人一样,那就还需要一些字典等作为机器人回复信息的依据。
但是不管最终要完成什么功能,了解itchat库的基本语句是必要的。这篇文章也将从itchat的基础语句开始介绍,并在最后附加上我的一些实战。
itchat——使用python登录网页版微信
一、itchat的安装
在
cmd
中使用pip install itchat
可以直接进行安装。我是用是conda,但是conda中显示搜索不到这个第三方库,于是我使用了本地安装的方法,详情可以看我的另一篇博文《pip安装的第三方库无法在Anaconda中调用》,介绍了可能会遇到的问题。有关itchat的使用,学习文件最好的还是参考官方说明。
二、itchat的基本内容
1.调用
import itchat
2.登录
2.1 基本指令
itchat.auto_login() # 执行后生成的二维码扫描以登录,且二维码在关闭后自动删除
itchat.run() # 登录微信后保持登录状态
'''
应当注意:itchat.run()是一个循环,仅当退出登录时才结束循环,
在使用过程中应注意结合多线程来使用
'''
2.2 参数设置
2.2.1 退出登录后,一段时间内再登录不用扫码
hotReload = True
退出登录后,一段时间内重新登录不需要扫描二维码,这会生成一个二维码,且一段时间后二维码会自动删除2.2.2 将获取的二维码在控制台上打印
enableCmdQR = True
True的值为块字符的宽度,可以根据自己的需求自行调整:
- True的默认值为2
- 若控制台背景为深色(黑色),则True>0
- 若控制台背景为浅色(白色),则Trus<0
2.3 使用示例
import itchat
itchat.auto_login(hotReload=True, enableCmdQR=True)
itchat.run()
3.退出登录
3.1 基本指令
itchat.logout() # 退出登录
4.发送消息
4.1 基本指令
itchat.send(msg='Text Message', toUserName=None) # 发送信息
'''
msg:消息内容
toUserName:发送对象,若为空则发送给自己
'''
# 请确保该程序目录下存在:gz.gif以及xlsx.xlsx(以下toUserName缺省)
itchat.send('@img@%s' % 'gz.gif')
itchat.send('@fil@%s' % 'xlsx.xlsx')
itchat.send('@vid@%s' % 'demo.mp4')
'''
有一说一...除了发送文本消息,其他的我都发不出去...还希望如果有会了的教教我...
'''
4.2 参数设置
不同的参数主要体现在msg
的类型不同和toUserName
的类型不同
4.2.1 发送文本类型
send_msg(msg='Text Message', toUserName=None)
# 给文件传输助手发送文本类信息"Text Message" itchat.send_msg(msg='Text Message', toUserName="filehelper")
4.2.2 发送文件类型
send_file(fileDir, toUserName=None)
fileDir
:文件路径,若不存在该文件时在屏幕打印"无此文件
"4.2.3 发送图片类型
send_image(fileDir, toUserName=None)
划重点官方文档中为
send_img()
,但itchat中没有方法send_img()
,只有send_image()
应该是官方文档错了。4.2.4 发送视频类型
send_video(fileDir, toUserName=None)
5.注册消息
注册消息其实就是一个接收消息的过程,能够接收到消息的前提是消息类型被注册
5.1 基本指令
@itchat.msg_register(itchat.content.msg_type, msg_source=True)
def register_name(msg):
return "I recived a massage!"
'''参数说明
形参说明:
msg_type:所注册消息的消息类型,使用时用相应参数替代msg_type,具体类型参考:表1
msg_source:所注册消息的来源,使用时用相应参数替代msg_source,具体类型参考:表2
register_name:所定义的函数名,函数内容根据需求自行更改
'''
表 1
参数 | 类型 | msg内容类别 |
---|---|---|
TEXT | 文本 | 文本内容 |
MAP | 地图 | 位置文本 |
CARD | 名片 | 推荐人字典 |
NOTE | 通知 | 通知文本 |
SHARING | 分享 | 分享名称 |
PICTURE | 图片/表情 | 下载方法 |
RECORDING | 语音 | 下载方法 |
ATTACHMENT | 附件 | 下载方法 |
VIDEO | 小视频 | 下载方法 |
FRIENDS | 好友邀请 | 添加好友所需参数 |
SYSTEM | 系统消息 | 更新内容的用户或群聊的UserName组成的列表 |
表 2
参数 | 消息来源 |
---|---|
isFriendChat | 微信好友 |
isGroupChat | 微信群聊 |
isMpChat | 微信公众号 |
5.2 参数设置
参数设置的方法和参数种类如上两表所示
5.3 使用示例
# 接收群聊的文本类消息 @itchat.msg_register(itchat.content.TEXT, isGroupChat=True) def text_reply(msg): print(msg.isAt) print(msg.actualNickName) print(msg.text)
5.4 注册消息的优先级
在使用注册的时候,单是对每类消息注册一次往往是不够的,这时候要么在同一个注册消息中增加嵌套(在我后面的实战案例中会提到),要么就要多次注册消息。此时,便涉及到了注册消息的优先级问题。
注册消息优先级的原则:
- 后注册消息先于先注册消息
- 带参数消息先于不带参数消息
个人感悟: 这里itchat库对于消息的注册其实是对基础函数的装饰,来生成了一系列的函数。而在python中,函数名所代表的可以看作为一个指针,因此当函数后声明时,相当于为指针更新了地址,因此优先级呈现出一个“后来者居上”的现象。
''' 下面借用itchat官方文档的两个例子进行说明 ''' import itchat from itchat.content import * itchat.auto_login() @itchat.msg_register(TEXT) def text_reply(msg): return 'This is the old register' @itchat.msg_register(TEXT) def text_reply(msg): return 'This is a new one' itchat.run() # 在私聊发送文本时将会回复This is a new one。 ######################################### import itchat from itchat.content import * itchat.auto_login() @itchat.msg_register def general_reply(msg): return 'I received a %s' % msg.type @itchat.msg_register(TEXT) def text_reply(msg): return 'You said to me one to one: %s' % msg.text itchat.run() # 仅在私聊发送文本时将会回复You said to me one to one, # 其余情况将会回复I received a ...。
5.5 动态注册消息
6.消息内容
要想更好的对所收到的信息进行操作,就需要了解信息的结构。使用itchat所接收到消息都是以字典的形式存在,我们很容易查询到所需的内容。
6.1 微信一般消息内容
{ "FromUserName": "", "ToUserName": "", "Content": "", "StatusNotifyUserName": "", "ImgWidth": 0, "PlayLength": 0, "RecommendInfo": {}, "StatusNotifyCode": 0, "NewMsgId": "", "Status": 0, "VoiceLength": 0, "ForwardFlag": 0, "AppMsgType": 0, "Ticket": "", "AppInfo": {}, "Url": "", "ImgStatus": 0, "MsgType": 0, "ImgHeight": 0, "MediaId": "", "MsgId": "", "FileName": "", "HasProductId": 0, "FileSize": "", "CreateTime": 0, "SubMsgType": 0 }
所接收到的消息都符合这一结构,具体到不同的消息还会有细微的区别,可以根据所接收到的msg,依次查询这些内容来更加详细的了解。
6.2 常用字典内容
6.2.1 文本消息(TEXT)
msg['Content'] # 消息内容 msg.User["NickName"] # 消息所在地(好友备注/群聊名称/公众号名称) msg['ActualNickName'] # 发送消息者(适用范围:群聊)
7.账号信息
在使用个人微信的过程当中主要有三种账号需要获取,分别为:好友、公众号、群聊
这部分内容在前文注册消息部分就已经有了一些应用
7.1 微信好友
get_friends
- 其中每个好友为一个字典
- 列表的第一项为本人的账号信息
- 传入update键为True将可以更新好友列表并返回
search_friends
itchat.search_friends()
获取自己的用户信息,返回自己的属性字典itchat.search_friends(userName='@abcdefg1234567')
获取特定UserName的用户信息itchat.search_friends(name='littlecodersh')
获取任何一项等于name键值的用户itchat.search_friends(wechatAccount='littlecodersh')
获取分别对应相应键值的用户itchat.search_friends(name='LittleCoder机器人', wechatAccount='littlecodersh')
三、四项功能可以一同使用
update_friend
- 该方法需要传入用户的UserName,返回指定用户的最新信息
- 同样也可以传入UserName组成的列表,那么相应的也会返回指定用户的最新信息组成的列表
memberList = itchat.update_friend('@abcdefg1234567')
7.2 公众号
get_mps
- 其中每个公众号为一个字典
- 传入update键为True将可以更新公众号列表并返回
search_mps
itchat.search_mps(userName='@abcdefg1234567')
获取特定UserName的公众号,返回值为一个字典itchat.search_mps(name='LittleCoder')
获取名字中含有特定字符的公众号,返回值为一个字典的列表itchat.search_mps(userName='@abcdefg1234567', name='LittleCoder')
以下方法相当于仅特定了UserName
7.3 微信群聊
get_chatrooms
- 其中每个群聊为一个字典
- 传入update键为True将可以更新群聊列表并返回通讯录中保存的群聊列表
- 群聊列表为后台自动更新,如果中途意外退出存在极小的概率产生本地群聊消息与后台不同步
- 为了保证群聊信息在热启动中可以被正确的加载,即使不需要持续在线的程序也需要运行itchat.run()
- 如果不想要运行上述命令,请在退出程序前调用itchat.dump_login_status(),更新热拔插需要的信息
search_chatrooms
itchat.search_chatrooms(userName='@@abcdefg1234567')
获取特定UserName的群聊,返回值为一个字典itchat.search_chatrooms(name='LittleCoder')
获取名字中含有特定字符的群聊,返回值为一个字典的列表itchat.search_chatrooms(userName='@@abcdefg1234567', name='LittleCoder')
以下方法相当于仅特定了UserName
update_chatroom
- 同样,如果想要更新该群聊的其他信息也可以用该方法
- 群聊在首次获取中不会获取群聊的用户列表,所以需要调用该命令才能获取群聊的成员
- 该方法需要传入群聊的UserName,返回特定群聊的详细信息
- 同样也可以传入UserName组成的列表,那么相应的也会返回指定用户的最新信息组成的列表
memberList = itchat.update_chatroom('@@abcdefg1234567', detailedMember=True)
创建群聊、增加、删除群聊用户的方法如下所示:
由于之前通过群聊检测是否被好友拉黑的程序,目前这三个方法都被严格限制了使用频率
删除群聊需要本账号为群管理员,否则会失败
将用户加入群聊有直接加入与发送邀请,通过
useInvitation
设置超过40人的群聊无法使用直接加入的加入方式,特别注意
memberList = itchat.get_friends()[1:]
chatroomUserName = itchat.create_chatroom(memberList, 'test chatroom')
创建群聊,topic键值为群聊名
itchat.delete_member_from_chatroom(chatroomUserName, memberList[0])
删除群聊内的用户
itchat.add_member_into_chatroom(chatroomUserName, memberList[0], useInvitation=False)
增加用户进入群聊
7.4 Uins
Uin 就是微信中用于标识用户的方式,每一个用户、群聊都有唯一且不同的Uin。那么通过Uin,即使退出了重新登录,也可以轻松的确认正在对话的是上一次登陆的哪一个用户。
但注意,Uin与其他值不同,微信后台做了一定的限制,必须通过特殊的操作才能获取.最简单来说,首次点开登陆用的手机端的某个好友或者群聊,itchat就能获取到该好友或者群聊的Uin。如果想要通过程序获取,也可以用程序将某个好友或者群聊置顶(取消置顶)。
这里提供一个提示群聊更新的程序:import re, sys, json import itchat from itchat.content import * itchat.auto_login(True) @itchat.msg_register(SYSTEM) def get_uin(msg): if msg['SystemInfo'] != 'uins': return ins = itchat.instanceList[0] fullContact = ins.memberList + ins.chatroomList + ins.mpList print('** Uin Updated **') for username in msg['Text']: member = itchat.utils.search_dict_list( fullContact, 'UserName', username) print(('%s: %s' % ( member.get('NickName', ''), member['Uin'])) .encode(sys.stdin.encoding, 'replace')) itchat.run(True)
每当Uin更新了,就会打印相应的更新情况。同样的,如果你想要获取Uin更新的情况也通过获取SYSTEM类型消息实现。
三、实战拓展
1.官方实践项目分享
官方提供了三个实践项目用来分享,比起微信机器人确实多了很多心意(毕竟微信机器人除去智能识别以外别的都很程序化),在这里我只写出我对于三个项目的理解,不会过于深入的实践,想要阅读原文的请点击这里。
8.1 微信控制器
通过前文的介绍,我们知道了微信可以检测接收到的消息,这里包括文件传输助手(filehelper)所接收到的消息。于是,我们可以将通过与文件传输助手的对话,对收到的消息进行逻辑判断从而实现对于电脑的操作,即把微信作为一个控制器。
8.2 群发助手
本质上就是给昵称不同的人发送不同的信息。把对方的名称融合到所发的消息中即可。(感觉还是很麻烦…)
8.3 好友删除检测
这个的原理就比较高级了:
- 在于将好友拉入群聊时,非好友和黑名单好友不会被拉入群聊
- 群聊在第一次产生普通消息时才会被除创建者以外的人发现的(系统消息不算普通消息)
2.拓展内容
除了
itchat
以外,python还有一些其他的第三方库来协助我们完成对微信的操作,这些都是其他人所上传的,这里进行部分列出,如有其他好的内容欢迎补充。
第三方库 | 简介 |
---|---|
wxpy | 微信机器人 / 可能是最优雅的微信个人号 API |
WxBot | 微信机器人 |
itchatmp | 微信公众号、企业号接口 |
3.个人实战
- 基于itchat+wxpython创建微信网页版桌面客户端