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

  • shell (str) –
    指定命令行类型,可设为 ‘ipython’,’bpython’,’python’,或它们的首字母;
    若为 None,则按上述优先级进入首个可用的 Python 命令行。
  • local (dict) – 设定本地变量环境,若为 None,则获取进入之前的变量环境。
  • banner (str) – 设定欢迎内容,将在进入命令行后展示。
posted @ 2019-01-19 16:16  镜花水苑  阅读(2047)  评论(0编辑  收藏  举报