消息處理
每當機器人接收到消息時,會自動執行以下兩個步驟
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
|