From af5b7f1a927e3ab11665086a4b1fda536490bbab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E6=A2=93=E6=9F=92?= <1787882683@qq.com> Date: Sat, 13 Dec 2025 15:12:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A7=86=E9=A2=91=E5=92=8C?= =?UTF-8?q?=E9=9F=B3=E4=B9=90=E6=B6=88=E6=81=AF=E5=A4=84=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=84=E5=8C=96=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E5=88=86=E4=BA=AB=E6=B6=88=E6=81=AF=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/recv_handler/message_handler.py | 65 +++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/src/recv_handler/message_handler.py b/src/recv_handler/message_handler.py index d52d21a..56a8c69 100644 --- a/src/recv_handler/message_handler.py +++ b/src/recv_handler/message_handler.py @@ -468,23 +468,23 @@ class MessageHandler: Parameters: raw_message: dict: 原始消息 Returns: - seg_data: Seg: 处理后的消息段 + seg_data: Seg: 处理后的消息段(video_card类型) """ message_data: dict = raw_message.get("data") - file: str = message_data.get("file") - url: str = message_data.get("url") - file_size: str = message_data.get("file_size", "未知大小") + file: str = message_data.get("file", "") + url: str = message_data.get("url", "") + file_size: str = message_data.get("file_size", "") if not file: logger.warning("视频消息缺少文件信息") return None - # 视频消息返回文本描述,包含文件名和大小 - video_text = f"[视频: {file}, 大小: {file_size}字节]" - if url: - video_text += f"\n视频链接: {url}" - - return Seg(type="text", data=video_text) + # 返回结构化的视频卡片数据 + return Seg(type="video_card", data={ + "file": file, + "file_size": file_size, + "url": url + }) async def handle_json_message(self, raw_message: dict) -> Seg | None: """ @@ -544,13 +544,44 @@ class MessageHandler: # 尝试从music字段提取信息 if music: title = music.get("title", "") - singer = music.get("singer", "") - music_text = "[音乐卡片]" - if title: - music_text += f"\n歌曲: {title}" - if singer: - music_text += f"\n歌手: {singer}" - return Seg(type="text", data=music_text) + singer = music.get("desc", "") or music.get("singer", "") + jump_url = music.get("jumpUrl", "") or music.get("jump_url", "") + music_url = music.get("musicUrl", "") or music.get("music_url", "") + tag = music.get("tag", "") # 音乐来源标签,如"网易云音乐" + preview = music.get("preview", "") # 封面图URL + + # 返回结构化的音乐卡片数据 + return Seg(type="music_card", data={ + "title": title, + "singer": singer, + "jump_url": jump_url, + "music_url": music_url, + "tag": tag, + "preview": preview + }) + + # 检查是否为小程序分享(如B站视频分享) + if app == "com.tencent.miniapp_01": + meta = parsed_json.get("meta", {}) + detail = meta.get("detail_1", {}) + + if detail: + title = detail.get("title", "") # 小程序名称,如"哔哩哔哩" + desc = detail.get("desc", "") # 分享内容描述 + url = detail.get("url", "") # 小程序链接 + qqdocurl = detail.get("qqdocurl", "") # 原始链接(如B站链接) + preview = detail.get("preview", "") # 预览图 + icon = detail.get("icon", "") # 小程序图标 + + # 返回结构化的小程序卡片数据 + return Seg(type="miniapp_card", data={ + "title": title, + "desc": desc, + "url": url, + "source_url": qqdocurl, + "preview": preview, + "icon": icon + }) # 其他卡片消息使用prompt字段 prompt = parsed_json.get("prompt", "[卡片消息]")