说在前面:想要使用itchat库,重要的事情说三遍: 首先需要一个能登录网页版微信的微信号! 首先需要一个能登录网页版微信的微信号!! 首先需要一个能登录网页版微信的微信号!!!
个人python学习笔记的目录博客,点击可获取更多内容。【传送门】
itchat是python的一个第三方库,是一个网页版
微信个人号接口
,可以通过python来应用这个库实现对于微信的一些自动化操作。这些自动化操作都是基于收到信息,并以所收到的信息内容为基础,通过逻辑判断决定接下来的指令。在这当中会涉及到很多的判断语句和循环结构。如果想要实现一些更加智能的回复效果,就像市面上很多的微信群聊机器人一样,那就还需要一些字典等作为机器人回复信息的依据。
但是不管最终要完成什么功能,了解itchat库的基本语句是必要的。这篇文章也将从itchat的基础语句开始介绍,并在最后附加上我的一些实战。
itchat——使用python登录网页版微信
一、itchat的安装二、itchat的基本内容1.调用2.登录2.1 基本指令2.2 参数设置2.2.1 退出登录后,一段时间内再登录不用扫码2.2.2 将获取的二维码在控制台上打印2.3 使用示例3.退出登录3.1 基本指令4.发送消息4.1 基本指令4.2 参数设置4.2.1 发送文本类型4.2.2 发送文件类型4.2.3 发送图片类型4.2.4 发送视频类型5.注册消息5.1 基本指令5.2 参数设置5.3 使用示例5.4 注册消息的优先级5.5 动态注册消息6.消息内容6.1 微信一般消息内容6.2 常用字典内容6.2.1 文本消息(TEXT)7.账号信息7.1 微信好友7.2 公众号7.3 微信群聊7.4 Uins三、实战拓展1.官方实践项目分享8.1 微信控制器8.2 群发助手8.3 好友删除检测2.拓展内容3.个人实战参考文档一、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 itchatitchat.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,具体类型参考:表1msg_source:所注册消息的来源,使用时用相应参数替代msg_source,具体类型参考:表2register_name:所定义的函数名,函数内容根据需求自行更改'''
表 1
表 2
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 itchatfrom 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 itchatfrom itchat.content import *itchat.auto_login()@itchat.msg_registerdef 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.textitchat.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, jsonimport itchat from itchat.content import *itchat.auto_login(True)@itchat.msg_register(SYSTEM) def get_uin(msg):if msg['SystemInfo'] != 'uins': returnins = itchat.instanceList[0]fullContact = ins.memberList + ins.chatroomList + ins.mpListprint('** 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还有一些其他的第三方库来协助我们完成对微信的操作,这些都是其他人所上传的,这里进行部分列出,如有其他好的内容欢迎补充。
3.个人实战
基于itchat+wxpython创建微信网页版桌面客户端