wxpy微信模块学习之消息处理
消息处理
每当机器人接收到消息时,会自动执行以下两个步骤
1.将消息保存至Bot.messages中
2.查找消息预先注册的函数,并执行(若有匹配的函数)
消息对象
消息对象代表每一条从微信获取到的消息。
基本属性
Message.type 消息的类型,目前可为以下值:
返回类型:str
# 文本 TEXT = 'Text' # 位置 MAP = 'Map' # 名片 CARD = 'Card' # 提示 NOTE = 'Note' # 分享 SHARING = 'Sharing' # 图片 PICTURE = 'Picture' # 语音 RECORDING = 'Recording' # 文件 ATTACHMENT = 'Attachment' # 视频 VIDEO = 'Video' # 好友请求 FRIENDS = 'Friends' # 系统 SYSTEM = 'System'
Message.bot 接收此消息的机器人对象
Message.id 消息的唯一 ID (通常为大于 0 的 64 位整型)
基本属性
Message.text 消息的文本内容
Message.get_filr (save_path=None)
下载图片、视频、语音、附件消息中的文件内容,可与Message.file_name配合使用。
参数:save_path -- 文件的保存路径。若为 None,将直接返回字节数据
Message.file_name 消息中文件的文件名
Message.file_size 消息中文件的大小
Message.media_id 文件类消息中的文件资源 ID (但图片视频语音等其他消息中为空)
Message.raw 原始数据 (dict 数据)
基本属性
Message.chat 消息所在的聊天会话:
对于自己发送的消息,为消息的接收者
对于别人发送的消息,为消息的发送者
返回类型:wxpy.User,wxpy.Group
Message.sender 消息发送者:
返回类型:wxpy.User,wxpy.Group
Message.receiver 消息接收者:
返回类型:wxpy.User,wxpy.Group
Message.member
若消息来自群聊,则此属性为消息的实际发送人(具体的群成员)
若消息来自其他聊天对象(非群聊),则此属性为 None
返回类型:wxpy.User,wxpy.Group
Message.card
好友请求中的请求用户
名片消息中的推荐用户
群聊相关
Message.member
若消息来自群聊,则此属性为消息的实际发送人(具体的群成员)
若消息来自其他聊天对象(非群聊),则此属性为 None
返回类型:wxpy.User,wxpy.Group
Message.is_at 当消息来自群聊,且被 @ 时,为 True
时间相关
Message.creaete_time 服务端发送时间
Message.receive_time 本地接收时间
Message.latency 消息的延迟秒数 (发送时间和接收时间的差值)
其他属性
Message.url 分享类消息中的网页 URL
Message.articles 公众号推送中的文章列表 (首篇的 标题/地址 与消息中的 text/url 相同)
title: 标题;summary:摘要;url:文章URL;cover:封面或缩略图URL;
Message.location 位置消息中的地理位置信息
Message.img_height 图片高度
Message.img_width 图片高度
Message.play_lenth 视频长度
Message.voice_lenth 语音长度
回复方法
类似于各send方法
Message.reply()
Message.reply_image()
Message.reply_file()
Message.reply_video()
Message.reply_msg()
Message.reply_raw_msg()
转发消息
Message.forward(chat,prefix=None,suffix=None,raise_for_unsupported=False)
将本消息转发给其他聊天对象
参数:chat--接收转发消息的聊天对象
prefix(str)--转发时增加的 前缀 文本,原消息为文本时会自动换行
sufffix(str)--转发时增加的 后缀 文本,原消息为文本时会自动换行
raise_for_unsupported (bool) --True ,将为不支持的消息类型抛出 NotImplementedError 异常
eg.
from wxpy import * bot = Bot() # 定位公司群 company_group = ensure_one(bot.groups().search('公司微信群')) # 定位老板 boss = ensure_one(company_group.search('老板大名')) # 将老板的消息转发到文件传输助手 @bot.register(company_group) def forward_boss_message(msg): if msg.member == boss: msg.forward(bot.file_helper, prefix='老板发言') # 堵塞线程 embed()
自动处理消息
可通过 预先注册 的方式,实现消息的自动处理。
注册消息
每当收到新消息时,将根据注册规则找到匹配条件的执行函数
并将消息对象作为唯一参数传入该函数。
将 Bot.register()作为函数的装饰器,即可完成注册。
# 打印所有*群聊*对象中的*文本*消息 @bot.register(Group, TEXT) def print_group_msg(msg): print(msg)
*优先匹配 后注册 的函数,且仅匹配 一个 注册函数。
Bot.register(chat=None,msg_types=None, except_self=True, run_async=True, enabled=True)
装饰器:用于注册消息配置
参数:chats--消息所在的聊天对象:单个或列表形式的多个聊天对象或聊天类型,为空时匹配所有聊天对象
msg_types--消息的类型:单个或列表形式的多个消息类型,为空时匹配所有消息类型 (SYSTEM 类消息除外)
except_self--排除由自己发送的消息
run_async -- 是否异步执行所配置的函数:可提高响应速度
enabled -- 当前配置的默认开启状态,可事后动态开启或关闭
开始运行
在完成注册操作后,若没有其他操作,程序会因主线程执行完成而退出。因此务必堵塞线程以保持监听状态!
from wxpy import * bot = Bot() @bot.register() def print_messages(msg): print(msg) # 堵塞线程,并进入 Python 命令行 embed()
wxpy.embed(local=None, banner='', shell=None)
进入交互式的 Python 命令行界面,并堵塞当前线程
参数:shell (str) --指定命令行类型,可设为 ‘ipython’,’bpython’,’python’,或它们的首字母;
若为None,则按上述优先级进入首个可用的 Python 命令行。
local (dict)-排除由自己发送的消息
run_async -- 设定本地变量环境,若为None,则获取进入之前的变量环境。
banner (str) -- 设定欢迎内容,将在进入命令行后展示
已发送消息
wxpy.SentMessage(attributes)
程序中通过 .send/reply() 系列方法发出的消息
使用程序发送的消息也将被记录到历史消息 bot.messages 中
大部分属性与Message相同
recall() 撤回本条消息 (应为 2 分钟内发出的消息)
历史消息
可通过访问bot.Messages 来查看历史消息列表。
为Message对象,具有搜索功能
例如,搜索所有自己在手机上发出的消息
sent_msgs = bot.messages.search(sender=bot.self) print(sent_msgs)
class wxpy.Messages(msg_list=None,max_history=200)
多条消息的合集,可用于记录或搜索
参数:max_history --设置最大保存条数,即:仅保存最后的 n 条消息
search(keywords=None,**attributes)
搜索消息记录
参数:keywords --文本关键词
attributes--属性键值对
返回:所有匹配的消息
返回类型:wxpy.Messages
|