From 16b4a754168351f28912e781a8b57ae509caf041 Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Thu, 2 Oct 2025 04:18:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(napcat):=20=E6=96=B0=E5=A2=9E=E5=AF=B9?= =?UTF-8?q?=E9=9F=B3=E4=B9=90=E5=88=86=E4=BA=AB=E5=8D=A1=E7=89=87=E7=9A=84?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 NapCat 适配器增加了对音乐分享卡片的解析能力,能够识别并提取来自 QQ 音乐和网易云音乐的分享内容。 - 支持解析标准的 `view: "music"` 类型卡片,提取歌曲、艺术家、跳转链接和封面图信息。 - 兼容处理部分网易云音乐伪装成 `view: "news"` 类型的分享卡片,确保这类消息也能被正确解析。 - 将解析后的音乐信息格式化为易于阅读的文本消息,提升了用户体验。 --- .../src/recv_handler/message_handler.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/message_handler.py b/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/message_handler.py index ab0dac46b..8725edeff 100644 --- a/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/message_handler.py +++ b/src/plugins/built_in/napcat_adapter_plugin/src/recv_handler/message_handler.py @@ -828,6 +828,63 @@ class MessageHandler: data=f"这是一条小程序分享消息,可以根据来源,考虑使用对应解析工具\n{formatted_content}", ) + # 检查是否是音乐分享 (QQ音乐类型) + if nested_data.get("view") == "music" and "com.tencent.music" in str(nested_data.get("app", "")): + meta = nested_data.get("meta", {}) + music = meta.get("music", {}) + if music: + tag = music.get("tag", "未知来源") + logger.debug(f"检测到【{tag}】音乐分享消息 (music view),开始提取信息") + + title = music.get("title", "未知歌曲") + desc = music.get("desc", "未知艺术家") + jump_url = music.get("jumpUrl", "") + preview_url = music.get("preview", "") + + artist = "未知艺术家" + song_title = title + + if "网易云音乐" in tag: + artist = desc + elif "QQ音乐" in tag: + if " - " in title: + parts = title.split(" - ", 1) + song_title = parts[0] + artist = parts[1] + else: + artist = desc + + formatted_content = ( + f"这是一张来自【{tag}】的音乐分享卡片:\n" + f"歌曲: {song_title}\n" + f"艺术家: {artist}\n" + f"跳转链接: {jump_url}\n" + f"封面图: {preview_url}" + ) + return Seg(type="text", data=formatted_content) + + # 检查是否是新闻/图文分享 (网易云音乐可能伪装成这种) + elif nested_data.get("view") == "news" and "com.tencent.tuwen" in str(nested_data.get("app", "")): + meta = nested_data.get("meta", {}) + news = meta.get("news", {}) + if news and "网易云音乐" in news.get("tag", ""): + tag = news.get("tag") + logger.debug(f"检测到【{tag}】音乐分享消息 (news view),开始提取信息") + + title = news.get("title", "未知歌曲") + desc = news.get("desc", "未知艺术家") + jump_url = news.get("jumpUrl", "") + preview_url = news.get("preview", "") + + formatted_content = ( + f"这是一张来自【{tag}】的音乐分享卡片:\n" + f"标题: {title}\n" + f"描述: {desc}\n" + f"跳转链接: {jump_url}\n" + f"封面图: {preview_url}" + ) + return Seg(type="text", data=formatted_content) + # 如果没有提取到关键信息,返回None return None