对消息进行格式化

This commit is contained in:
liuwei
2025-04-01 15:28:59 +08:00
parent 5db76f1a46
commit 59898621f5
3 changed files with 97 additions and 39 deletions

View File

@@ -4,20 +4,19 @@ import sys
import threading
from datetime import datetime
import time
import xml.etree.ElementTree as ET
from db.message_storage import MessageStorageDB
from db.stats_db import StatsDBOperator
from utils.wechat.contact_manager import ContactManager
from flask import Flask, render_template, request, jsonify, redirect, url_for, session, send_from_directory
from robot_cmd.robot_command import GroupBotManager, Feature, PermissionStatus
# 导入消息格式化工具
from utils.message_formatter import format_quote_message
# 导入toml用于配置文件
import toml
# 添加项目根目录到系统路径,确保可以导入项目模块
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
from flask import Flask, render_template, request, jsonify, redirect, url_for, session, send_from_directory
from robot_cmd.robot_command import GroupBotManager, Feature, PermissionStatus
# 导入toml用于配置文件
import toml
class DashboardServer:
"""统计看板服务器"""
@@ -152,12 +151,12 @@ class DashboardServer:
def errors():
return render_template('errors.html')
@app.route('/messages')
@login_required
def message_list_page():
"""消息列表页面"""
return render_template('message_list.html')
# 在_create_app方法中添加新的路由
@app.route('/robot_management')
@login_required
@@ -486,7 +485,6 @@ class DashboardServer:
self.logger.error(f"添加群组失败: {e}")
return jsonify({"success": False, "error": str(e)}), 500
@app.route('/api/messages', methods=['GET'])
@login_required
def get_messages():
@@ -510,7 +508,7 @@ class DashboardServer:
page_size=page_size
)
# 处理消息数据,添加群组名称和发送者昵称
# 处理消息数据,添加群组名称和发送者昵称,并格式化引用消息
for msg in result['messages']:
# 获取群组名称
msg['group_name'] = self.contact_manager.get_nickname(msg['group_id']) or msg['group_id']
@@ -518,6 +516,22 @@ class DashboardServer:
# 获取发送者昵称
msg['sender_name'] = self.contact_manager.get_nickname(msg['sender']) or msg['sender']
# 处理消息内容,格式化引用消息
if msg['message_type'] == 49 and msg['content']: # 应用消息类型
try:
# 检查是否为引用消息
if '<refermsg>' in msg['content']:
# 使用格式化工具处理引用消息
msg['content'] = format_quote_message(msg['content'])
else:
# 其他类型的应用消息,解析 XML 提取标题
root = ET.fromstring(msg['content'])
title_elem = root.find('.//title')
if title_elem is not None:
msg['content'] = title_elem.text
except Exception as e:
self.logger.error(f"解析消息类型49出错: {e}")
return jsonify(result)
except Exception as e:
self.logger.error(f"获取消息列表失败: {e}")

View File

@@ -7,6 +7,8 @@ from wcferry import WxMsg
from db.connection import DBConnectionManager
from db.message_storage import MessageStorageDB
# 导入消息格式化工具
from utils.message_formatter import format_quote_message
# 配置日志
logging.basicConfig(
@@ -209,18 +211,22 @@ class MessageStorage:
hours_ago = int(
(current_time - datetime.strptime(last_summary_time, '%Y-%m-%d %H:%M:%S')).total_seconds() / 3600) + 1
messages = self.message_db.get_recent_messages(group_id, hours_ago=hours_ago)
# 构建最终的结果字符串
result = []
for msg in messages:
timestamp, sender, content, message_type = msg['timestamp'], msg['sender'], msg['content'], msg[
'message_type']
timestamp, sender, content, message_type = msg['timestamp'], msg['sender'], msg['content'], msg['message_type']
try:
if message_type == 49: # 注意这里是整数类型
# 解析 XML 字符串
root = ET.fromstring(content)
# 提取 title 内容
content = root.find('.//title').text
if message_type == 49: # 应用消息类型
# 检查是否为引用消息
if '<refermsg>' in content:
# 使用格式化工具处理引用消息
content = format_quote_message(content)
else:
# 其他类型的应用消息,解析 XML 提取标题
root = ET.fromstring(content)
title_elem = root.find('.//title')
if title_elem is not None:
content = title_elem.text
except Exception as e:
logger.error(f"解析消息类型49出错: {e}")

View File

@@ -0,0 +1,38 @@
import xml.etree.ElementTree as ET
import html
def format_quote_message(xml_content):
"""
格式化引用消息
Args:
xml_content: XML格式的消息内容
Returns:
格式化后的消息文本
"""
try:
# 解析XML
root = ET.fromstring(xml_content)
# 获取主消息内容
title_elem = root.find('.//title')
main_content = title_elem.text if title_elem is not None else ""
# 获取引用消息信息
refer_msg = root.find('.//refermsg')
if refer_msg is not None:
display_name = refer_msg.find('displayname').text if refer_msg.find('displayname') is not None else "未知用户"
quoted_content = refer_msg.find('content').text if refer_msg.find('content') is not None else ""
# 解码HTML实体
quoted_content = html.unescape(quoted_content)
# 构建格式化的引用消息
formatted_message = f"┌─────────────────────────────────\n│ 引用 {display_name}{quoted_content}\n└─────────────────────────────────\n{main_content}"
return formatted_message
return main_content
except Exception as e:
return f"解析引用消息失败: {str(e)}"