From 346353670d975067ff3cb6ce8479baeabf4e124b Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 4 Oct 2025 13:09:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(api):=20=E5=A2=9E=E5=BC=BA=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=BB=9F=E8=AE=A1=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=A0=BC=E5=BC=8F=E5=8C=96=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 `/messages/stats/by_chat` 端点添加了一个新的 `format` 查询参数。当 `format=True` 时,API 响应将包含更友好的信息,如群聊名称和用户昵称,而不仅仅是 ID。 这通过集成 `chat_api` 和 `person_api` 来获取相应的会话和用户信息,从而提高了接口的可用性和数据可读性。 --- src/api/message_router.py | 48 ++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/api/message_router.py b/src/api/message_router.py index 919dacf4b..c2c28a06d 100644 --- a/src/api/message_router.py +++ b/src/api/message_router.py @@ -4,7 +4,11 @@ from typing import Literal from fastapi import APIRouter, HTTPException, Query from src.config.config import global_config -from src.plugin_system.apis import message_api +from src.plugin_system.apis import message_api, chat_api, person_api +from src.chat.message_receive.chat_stream import get_chat_manager +from src.common.logger import get_logger + +logger = get_logger("HTTP消息API") router = APIRouter() @@ -52,7 +56,7 @@ async def get_message_stats( async def get_message_stats_by_chat( days: int = Query(1, ge=1, description="指定查询过去多少天的数据"), group_by_user: bool = Query(False, description="是否按用户进行分组统计"), - filter_bot: bool = Query(False, description="是否过滤BOT自身的消息") + format: bool = Query(False, description="是否格式化输出,包含群聊和用户信息"), ): """ 获取BOT在指定天数内按聊天流或按用户统计的消息数据。 @@ -63,8 +67,7 @@ async def get_message_stats_by_chat( messages = await message_api.get_messages_by_time(start_time, end_time) bot_qq = str(global_config.bot.qq_account) - if filter_bot: - messages = [msg for msg in messages if msg.get("user_id") != bot_qq] + messages = [msg for msg in messages if msg.get("user_id") != bot_qq] stats = {} @@ -91,8 +94,41 @@ async def get_message_stats_by_chat( stats[chat_id]["user_stats"][user_id] += 1 if not group_by_user: - # 如果不按用户分组,则只返回总统计信息 - return {chat_id: data["total_stats"] for chat_id, data in stats.items()} + stats = {chat_id: data["total_stats"] for chat_id, data in stats.items()} + + if format: + formatted_stats = {} + for chat_id, data in stats.items(): + # 尝试获取群聊流 + logger.info(f"这是一个测试日志:{chat_id}") + group_stream = chat_api.get_stream_by_group_id(chat_id) + if group_stream and group_stream.group_info: + chat_name = group_stream.group_info.group_name + else: + # 只有当它不是一个已知的群聊时,才尝试作为私聊处理 + private_stream = chat_api.get_stream_by_user_id(chat_id) + if private_stream and private_stream.user_info: + chat_name = private_stream.user_info.user_nickname + else: + chat_name = f"未知会话 ({chat_id})" + + formatted_data = { + "chat_name": chat_name, + "total_stats": data if not group_by_user else data["total_stats"], + } + + if group_by_user and "user_stats" in data: + formatted_data["user_stats"] = {} + for user_id, count in data["user_stats"].items(): + person_id = person_api.get_person_id("qq", user_id) + nickname = await person_api.get_person_value(person_id, "nickname", "未知用户") + formatted_data["user_stats"][user_id] = { + "nickname": nickname, + "count": count + } + + formatted_stats[chat_id] = formatted_data + return formatted_stats return stats