当前位置: 首页 > 工具软件 > wxpy > 使用案例 >

Python wxpy 操作微信 大全集

韶弘壮
2023-12-01

安装及导入 wxpy

安装 wxpy

pip install wxpy

导入 wxpy

import wxpy

登录微信

登录

bot = wxpy.Bot(cache_path=None, 
               console_qr=False, qr_path=None, 
               qr_callback=None, login_callback=None, logout_callback=None)
参数说明
cache_path设置当前会话的缓存路径,并开启缓存功能;为 None (默认) 则不开启缓存功能。开启缓存后可在短时间内避免重复扫码,缓存失效时会重新要求登陆。 设为 True 时,使用默认的缓存路径 ‘wxpy.pkl’
console_qr在终端中显示登陆二维码,需要安装 pillow 模块。可为整数(int),表示二维码单元格的宽度,通常为 2 (当被设为 True 时,也将在内部当作 2)。也可为负数,表示以反色显示二维码,适用于浅底深字的命令行界面。 例如: 在大部分 Linux 系统中可设为 True 或 2,而在macOS Terminal 的默认白底配色中,应设为 -2
qr_path保存二维码的路径
qr_callback获得二维码后的回调,可以用来定义二维码的处理方式,接收参数: uuid, status, qrcode
login_callback登陆成功后的回调,若不指定,将进行清屏操作,并删除二维码文件
logout_callback登出时的回调

阻塞进程

在完成注册操作后,若没有其他操作,程序会因主线程执行完成而退出。 因此务必堵塞线程以保持监听状态。

wxpy 的 embed() 可在堵塞线程的同时,进入 Python 命令行。

wxpy.embed(shell=None, local=None, banner='')
参数说明
shell: str指定命令行类型,可设为 ‘ipython’,’bpython’,’python’,或它们的首字母;
若为 None,则按上述优先级进入首个可用的 Python 命令行。
local: dict设定本地变量环境,若为 None,则获取进入之前的变量环境。
banner: str设定欢迎内容,将在进入命令行后展示。

聊天对象

聊天对象

获取所有聊天对象

bot.chats(update=False)
参数说明
update是否更新

返回: 聊天对象合集

返回类型: wxpy.Chats

获取所有好友

bot.friends(update=False)
参数说明
update是否更新

返回:聊天对象合集

返回类型:wxpy.Chats

获取所有群聊

bot.groups(update=False, contact_only=False)

一些不活跃的群可能无法被获取到,可通过在群内发言,或修改群名称的方式来激活

参数说明
update是否更新
contact_only是否限于保存为联系人的群聊

返回:群聊合集

返回类型:wxpy.Groups

获取所有公众号

bot.mps(update=False)
参数说明
update是否更新

返回:聊天对象合集

返回类型:wxpy.Chats

其他对象

# 机器人自己
bot.self
# 文件传输助手
bot.file_helper

搜索聊天对象

.search()

搜索所有聊天对象

# 搜索名称含有 'wxpy' 的任何聊天对象
found = bot.search('wxpy')
# [<Friend: wxpy 机器人>, <Group: wxpy 交流群1>, <Group: wxpy 交流群2>]

不包括群成员

搜索好友

# 搜索名称包含 'david' 的广州男性好友
found = bot.friends().search('david', sex=MALE, city='广州')
# [<Friend: david>]

# 确保搜索结果是唯一的,并取出唯一结果
david = ensure_one(found)
# <Friend: david>

搜索群聊

# 搜索名称包含 'wxpy',且成员中包含 `david` 的群聊对象
wxpy_groups = bot.groups().search('wxpy', [david])
# [<Group: wxpy 交流群 1>, <Group: wxpy 交流群 2>]

在群聊中搜索

# 在刚刚找到的第一个群中搜索
group = wxpy_groups[0]
# 搜索该群中所有广州的群友
found = group.search(province='广州')
# [<Member: 广州 群友1>, <Group: 广州 群友2>, <Group: 广州 群友3> ...]

添加聊天对象

添加用户为好友

bot.add_friend(user, verify_content='')
参数说明
user 或 user_name用户对象
verify_content验证说明信息

添加/关注 公众号

bot.add_mp(user)
参数说明
user 或 user_name公众号对象

接受用户为好友

bot.accept_friend(user, verify_content='')
参数说明
user 或 user_name用户对象
verify_content验证说明信息

返回:新的好友对象

返回类型:wxpy.Friend

其他属性

.mark_as_read()
# 消除当前聊天对象的未读提示小红点

.pin()
# 将聊天对象置顶

.unpin()
# 取消聊天对象的置顶状态

.get_avatar(save_path=None)
# 获取头像
# 参数: save_path – 保存路径(后缀通常为.jpg),若为 None 则返回字节数据

.uin
# 微信中的聊天对象ID,固定且唯一
# 因微信的隐私策略,该属性有时无法被获取到
# 建议使用 puid 作为用户的唯一 ID

.alias
# 若用户进行过一次性的 “设置微信号” 操作,则该值为用户设置的”微信号”,固定且唯一
# 因微信的隐私策略,该属性有时无法被获取到
# 建议使用 puid 作为用户的唯一 ID

.wxid
# 聊天对象的微信ID (实际为 .alias 或 .uin)
# 因微信的隐私策略,该属性有时无法被获取到
# 建议使用 puid 作为用户的唯一 ID

.user_name
# 该聊天对象的内部 ID,通常不需要用到
# 注意:同个聊天对象在不同用户中,此 ID 不一致 ,且可能在新会话中 被改变!

发送消息

.send(content=None, media_id=None)

动态发送不同类型的消息,具体类型取决于 content 的前缀

参数说明
content由 前缀 和 内容 两个部分组成,若 省略前缀,将作为纯文本消息发送
前缀 部分可为: @fil@: 文件,@img@: 图片,@msg@: 纯文本,@vid@: 视频
内容 部分可为: 文件、图片、视频的路径,或纯文本的内容
media_id填写后可省略上传过程

返回类型:wxpy.SentMessage

发送文本

.send_msg(msg=None)
参数说明
msg文本内容

发送图片

.send_image(path, media_id=None)
参数说明
path文件路径
media_id设置后可省略上传过程

发送视频

.send_video(path=None, media_id=None)
参数说明
path文件路径
media_id设置后可省略上传过程

发送文件

my_friend.send_file(path, media_id=None)
参数说明
path文件路径
media_id设置后可省略上传过程

以原始格式发送其他类型消息

send_raw_msg(raw_type, raw_content, uri=None, msg_ext=None)
参数说明
raw_type: int原始的整数消息类型
raw_content: str原始的消息内容
uri: str请求路径,默认为 ‘/webwxsendmsg’
msg_ext: dict消息的扩展属性 (会被更新到 Msg 键中)

处理消息

注册函数

可通过预先注册的方式,实现消息的自动处理。

预先将特定聊天对象的特定类型消息,注册到对应的处理函数,以实现自动回复等功能。

每当收到新消息时,将根据注册规则找到匹配条件的执行函数。并将消息对象作为唯一参数传入该函数。

将 bot.register() 作为函数的装饰器,即可完成注册。

bot.register(chats=None, msg_types=None, except_self=True, run_async=True, enabled=True

其中msg_types参数,是指定接收消息的类型,wxpy中支持以下消息类型:

描述
TEXT 或 ‘Text’文本
MAP 或 ‘Map’位置
CARD 或 ‘Card’名片
NOTE 或 ‘Note’提示
SHARING 或 ‘Sharing’分享
PICTURE 或 ‘Picture’图片
RECORDING 或 ‘Recording’语音
ATTACHMENT 或 ‘Attachment’文件
VIDEO 或 ‘Video’视频
FRIENDS 或 ‘Friends’好友请求
SYSTEM 或 ‘System’系统

其他参数

参数描述
chats消息所在的聊天对象:单个或列表形式的多个聊天对象或聊天类型,为空时匹配所有聊天对象;
既可以是聊天对象实例,也可以是对象类。当为类时,表示匹配该类型的所有聊天对象。
msg_types消息的类型:单个或列表形式的多个消息类型,为空时匹配所有消息类型 (SYSTEM 类消息除外)
except_self排除由自己发送的消息
run_async是否异步执行所配置的函数:可提高响应速度
enabled当前配置的默认开启状态,可事后动态开启或关闭

在被注册函数中,可以通过直接 return <回复内容> 的方式来回复消息,等同于调用 msg.reply(<回复内容>)。

Message 消息对象

每当机器人接收到消息时,会自动执行以下两个步骤:

1.将消息保存到 Bot.messages 中

2.查找消息预先注册的函数,并执行(若有匹配的函数)

基本属性

消息的类型

Message.type

返回消息的类型:str

机器人对象

Message.bot

接收此消息的机器人对象

消息的唯一 ID

Message.id

(通常为大于 0 的 64 位整型)

内容数据

# 消息的文本内容
Message.text

# 下载图片、视频、语音、附件消息中的文件内容
# 可与 Message.file_name 配合使用
# 参数: save_path – 文件的保存路径。若为 None,将直接返回字节数据
Message.get_file(save_path=None)

# 消息中文件的文件名
Message.file_name

# 消息中文件的体积大小
Message.file_size

# 文件类消息中的文件资源 ID (但图片视频语音等其他消息中为空)
Message.media_id

# 原始数据 (dict 数据
)Message.raw

用户相关

Message.chat
# 消息所在的聊天会话
# 对于自己发送的消息,为消息的接收者
# 对于别人发送的消息,为消息的发送者
# 返回类型:wxpy.User, wxpy.Group

Message.sender
# 消息的发送者
# 返回类型: wxpy.User, wxpy.Group

Message.receiver
# 消息的接收者
# 返回类型:wxpy.User, wxpy.Group

Message.member
# 消息的实际发送人
# 若消息来自群聊,则此属性为消息的实际发送人(具体的群成员)
# 若消息来自其他聊天对象(非群聊),则此属性为 None# 返回类型:NoneType, wxpy.Member

Message.card
#好友请求中的请求用户
#名片消息中的推荐用户

群聊相关

Message.member
# 发送人
# 若消息来自群聊,则此属性为消息的实际发送人(具体的群成员)
# 若消息来自其他聊天对象(非群聊),则此属性为 None
# 返回类型: NoneType,wxpy.Member

Message.is_at
# 是否被 @
# 当消息来自群聊,且被 @ 时,为 True

时间相关

# 服务端发送时间
Message.create_time

# 本地接收时间
Message.receive_time

# 消息的延迟秒数 (发送时间和接收时间的差值)
Message.latency

不同类型消息

图片、视频、语音

# 图片高度
Message.img_height

# 图片宽度
Message.img_width

# 视频长度
Message.play_length

# 语音长度
Message.voice_length

文章

# 分享类消息中的网页 URL
Message.url
# 公众号推送中的文章列表 (首篇的 标题/地址 与消息中的 text/url 相同)
Message.articles

其中,每篇文章均有以下属性

属性说明
title标题
summary摘要
url文章 URL
cover封面或缩略图 URL

位置消息

# 位置消息中的地理位置信息
Message.location

回复

方法一:获取聊天对象后发送消息

Message.chat.send(...)
Message.chat.send_msg(...)
# ...更多见本章 “发送消息”

方法二:直接回复

代码描述
Message.reply(…)回复
Message.reply_msg(…)回复文本
Message.reply_image(…)回复图片
Message.reply_file(…)回复文件
Message.reply_video(…)回复视频
Message.reply_raw_msg(…)以原始格式回复其他类型消息

具体参数见本章 “发送消息”。

转发消息

# 将本消息转发给其他聊天对象
Message.forward(chat, prefix=None, suffix=None, raise_for_unsupported=False)

支持以下消息类型

类型描述
TEXT文本
VIDEO视频
ATTACHMENT文件
PICTURE图片/自定义表情
不支持表情商店中的表情
CARD名片
仅支持公众号名片,以及自己发出的个人号名片
SHARING分享
会转化为 标题 + 链接 形式的文本消息
RECORDING语音
会以文件方式发送
MAP地图
会转化为 位置名称 + 地图链接 形式的文本消息

参数:

参数描述
chat: Chat接收转发消息的聊天对象
prefix: str转发时增加的 前缀 文本,原消息为文本时会自动换行
suffix: str转发时增加的 后缀 文本,原消息为文本时会自动换行
raise_for_unsupported: bool为 True 时,将为不支持的消息类型抛出 NotImplementedError 异常

原创不易,如果你觉得这篇文章很赞的话,

点赞收藏再走吧!


yeanky

2021/7/20
 类似资料: