itchat——使用python登录网页版微信

说在前面:想要使用itchat库,重要的事情说三遍:
首先需要一个能登录网页版微信的微信号!
首先需要一个能登录网页版微信的微信号!!
首先需要一个能登录网页版微信的微信号!!!

个人python学习笔记的目录博客,点击可获取更多内容。【传送门】

itchat是python的一个第三方库,是一个网页版微信个人号接口,可以通过python来应用这个库实现对于微信的一些自动化操作。这些自动化操作都是基于收到信息,并以所收到的信息内容为基础,通过逻辑判断决定接下来的指令。
在这当中会涉及到很多的判断语句和循环结构。如果想要实现一些更加智能的回复效果,就像市面上很多的微信群聊机器人一样,那就还需要一些字典等作为机器人回复信息的依据。
但是不管最终要完成什么功能,了解itchat库的基本语句是必要的。这篇文章也将从itchat的基础语句开始介绍,并在最后附加上我的一些实战。

一、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的值为块字符的宽度,可以根据自己的需求自行调整:

  1. True的默认值为2
  2. 若控制台背景为深色(黑色),则True>0
  3. 若控制台背景为浅色(白色),则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 注册消息的优先级

在使用注册的时候,单是对每类消息注册一次往往是不够的,这时候要么在同一个注册消息中增加嵌套(在我后面的实战案例中会提到),要么就要多次注册消息。此时,便涉及到了注册消息的优先级问题。
注册消息优先级的原则:

  1. 后注册消息先于先注册消息
  2. 带参数消息先于不带参数消息

个人感悟: 这里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

  1. 其中每个好友为一个字典
  2. 列表的第一项为本人的账号信息
  3. 传入update键为True将可以更新好友列表并返回

search_friends

  1. itchat.search_friends()
    获取自己的用户信息,返回自己的属性字典
  2. itchat.search_friends(userName='@abcdefg1234567')
    获取特定UserName的用户信息
  3. itchat.search_friends(name='littlecodersh')
    获取任何一项等于name键值的用户
  4. itchat.search_friends(wechatAccount='littlecodersh')
    获取分别对应相应键值的用户
  5. itchat.search_friends(name='LittleCoder机器人', wechatAccount='littlecodersh')
    三、四项功能可以一同使用

update_friend

  1. 该方法需要传入用户的UserName,返回指定用户的最新信息
  2. 同样也可以传入UserName组成的列表,那么相应的也会返回指定用户的最新信息组成的列表
    memberList = itchat.update_friend('@abcdefg1234567')

7.2 公众号

get_mps

  1. 其中每个公众号为一个字典
  2. 传入update键为True将可以更新公众号列表并返回

search_mps

  1. itchat.search_mps(userName='@abcdefg1234567')
    获取特定UserName的公众号,返回值为一个字典
  2. itchat.search_mps(name='LittleCoder')
    获取名字中含有特定字符的公众号,返回值为一个字典的列表
  3. itchat.search_mps(userName='@abcdefg1234567', name='LittleCoder')
    以下方法相当于仅特定了UserName

7.3 微信群聊

get_chatrooms

  1. 其中每个群聊为一个字典
  2. 传入update键为True将可以更新群聊列表并返回通讯录中保存的群聊列表
  3. 群聊列表为后台自动更新,如果中途意外退出存在极小的概率产生本地群聊消息与后台不同步
  4. 为了保证群聊信息在热启动中可以被正确的加载,即使不需要持续在线的程序也需要运行itchat.run()
  5. 如果不想要运行上述命令,请在退出程序前调用itchat.dump_login_status(),更新热拔插需要的信息

search_chatrooms

  1. itchat.search_chatrooms(userName='@@abcdefg1234567')
    获取特定UserName的群聊,返回值为一个字典
  2. itchat.search_chatrooms(name='LittleCoder')
    获取名字中含有特定字符的群聊,返回值为一个字典的列表
  3. itchat.search_chatrooms(userName='@@abcdefg1234567', name='LittleCoder')
    以下方法相当于仅特定了UserName

update_chatroom

  1. 同样,如果想要更新该群聊的其他信息也可以用该方法
  2. 群聊在首次获取中不会获取群聊的用户列表,所以需要调用该命令才能获取群聊的成员
  3. 该方法需要传入群聊的UserName,返回特定群聊的详细信息
  4. 同样也可以传入UserName组成的列表,那么相应的也会返回指定用户的最新信息组成的列表
    memberList = itchat.update_chatroom('@@abcdefg1234567', detailedMember=True)

创建群聊、增加、删除群聊用户的方法如下所示:

  1. 由于之前通过群聊检测是否被好友拉黑的程序,目前这三个方法都被严格限制了使用频率

  2. 删除群聊需要本账号为群管理员,否则会失败

  3. 将用户加入群聊有直接加入与发送邀请,通过useInvitation设置

  4. 超过40人的群聊无法使用直接加入的加入方式,特别注意

  5. memberList = itchat.get_friends()[1:]

  6. chatroomUserName = itchat.create_chatroom(memberList, 'test chatroom')
    创建群聊,topic键值为群聊名

  7. itchat.delete_member_from_chatroom(chatroomUserName, memberList[0])
    删除群聊内的用户

  8. 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 好友删除检测

这个的原理就比较高级了:

  1. 在于将好友拉入群聊时,非好友和黑名单好友不会被拉入群聊
  2. 群聊在第一次产生普通消息时才会被除创建者以外的人发现的(系统消息不算普通消息)

2.拓展内容

除了itchat以外,python还有一些其他的第三方库来协助我们完成对微信的操作,这些都是其他人所上传的,这里进行部分列出,如有其他好的内容欢迎补充。

第三方库简介
wxpy微信机器人 / 可能是最优雅的微信个人号 API
WxBot微信机器人
itchatmp微信公众号、企业号接口

3.个人实战

  1. 基于itchat+wxpython创建微信网页版桌面客户端

参考文档

  1. itchat项目介绍
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值