From 238e478f52d036b26c87376c496b425ff34564c3 Mon Sep 17 00:00:00 2001 From: liuwei Date: Tue, 7 Apr 2026 17:44:15 +0800 Subject: [PATCH] fix: reuse referenced message media in dashboard quotes --- admin/dashboard/blueprints/messages.py | 19 +++++++++++++++++++ db/message_storage.py | 12 ++++++++++++ utils/message_formatter.py | 2 ++ 3 files changed, 33 insertions(+) diff --git a/admin/dashboard/blueprints/messages.py b/admin/dashboard/blueprints/messages.py index 4fd6a4f..eabe832 100644 --- a/admin/dashboard/blueprints/messages.py +++ b/admin/dashboard/blueprints/messages.py @@ -109,6 +109,25 @@ def get_messages(): msg['quoted_type'] = quote_data.get('reference_type', '') msg['quoted_preview_image'] = quote_data.get('preview_image', '') msg['quoted_preview_video_thumb'] = quote_data.get('preview_video_thumb', '') + msg['quoted_reference_svrid'] = quote_data.get('reference_svrid', '') + + # 优先使用原始被引用消息自己已落库的图片/缩略图地址 + reference_svrid = quote_data.get('reference_svrid') + if reference_svrid: + referenced_msg = server.message_storage.get_message_by_message_id(reference_svrid) + if referenced_msg: + if msg['quoted_type'] == 'image': + msg['quoted_preview_image'] = ( + referenced_msg.get('image_path') + or referenced_msg.get('message_thumb') + or msg['quoted_preview_image'] + ) + elif msg['quoted_type'] == 'video': + msg['quoted_preview_video_thumb'] = ( + referenced_msg.get('message_thumb') + or referenced_msg.get('image_path') + or msg['quoted_preview_video_thumb'] + ) else: # 其他类型的应用消息,解析 XML 提取标题 root = ET.fromstring(msg['content']) diff --git a/db/message_storage.py b/db/message_storage.py index 326b130..9024b6c 100644 --- a/db/message_storage.py +++ b/db/message_storage.py @@ -61,6 +61,18 @@ class MessageStorageDB(BaseDBOperator): sql += " ORDER BY timestamp DESC LIMIT 1" return self.execute_query(sql, tuple(params), fetch_one=True) + def get_message_by_message_id(self, message_id: int | str) -> Optional[Dict]: + """根据 message_id 获取单条消息""" + sql = """ + SELECT id, group_id, timestamp, sender, content, message_type, + attachment_url, message_id, message_xml, message_thumb, image_path + FROM messages + WHERE message_id = %s + ORDER BY id DESC + LIMIT 1 + """ + return self.execute_query(sql, (message_id,), fetch_one=True) + def get_member_recent_messages(self, group_id: str, wxid: str, days: int = 30, limit: int = 200, include_today: bool = True) -> List[Dict]: """获取指定群成员近期消息""" diff --git a/utils/message_formatter.py b/utils/message_formatter.py index 28c29f1..5258fa5 100644 --- a/utils/message_formatter.py +++ b/utils/message_formatter.py @@ -76,6 +76,7 @@ def parse_quote_message(xml_content: str) -> dict: display_name = _clean_text(_extract_first(r'(.*?)', xml_content, "未知用户")) or "未知用户" quoted_content = _extract_first(r'.*?(.*?)', xml_content) ref_type = _extract_first(r'.*?(.*?)', xml_content) + reference_svrid = _extract_first(r'.*?(.*?)', xml_content) pretty_reference = _format_referenced_content(ref_type, quoted_content, xml_content) media_preview = _extract_media_preview(ref_type, quoted_content) @@ -83,6 +84,7 @@ def parse_quote_message(xml_content: str) -> dict: "main_content": main_content, "display_name": display_name, "quoted_content": pretty_reference, + "reference_svrid": reference_svrid, "reference_type": media_preview.get("reference_type", "text"), "preview_image": media_preview.get("preview_image", ""), "preview_video_thumb": media_preview.get("preview_video_thumb", ""),