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

  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 'T

his 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创建微信网页版桌面客户端