From 19c37280d489ab2e67587cc85557afec20506925 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 3 Oct 2025 20:43:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(api):=20=E6=96=B0=E5=A2=9E=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=BB=9F=E8=AE=A1API=E7=AB=AF=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原有的获取最近消息的API替换为功能更强大的消息统计API。 新的 `/messages/recent` 端点允许按天数和消息类型(发送、接收或全部)查询机器人的消息数量统计。 - 支持 `days` 和 `message_type` 查询参数。 - 实现统计逻辑,区分机器人发送和接收的消息。 - 增加异常处理,提高API的健壮性。 --- src/api/message_router.py | 47 ++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src/api/message_router.py b/src/api/message_router.py index 5a2dd2d0a..687f48f1e 100644 --- a/src/api/message_router.py +++ b/src/api/message_router.py @@ -1,13 +1,48 @@ -from fastapi import APIRouter +import time +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 router = APIRouter() @router.get("/messages/recent") -async def get_recent_messages(chat_id: str, limit: int = 10): +async def get_message_stats( + days: int = Query(1, ge=1, description="指定查询过去多少天的数据"), + message_type: Literal["all", "sent", "received"] = Query("all", description="筛选消息类型: 'sent' (BOT发送的), 'received' (BOT接收的), or 'all' (全部)") +): """ - 获取最近的聊天记录 + 获取BOT在指定天数内的消息统计数据。 """ - # 假设 message_api.get_recent_messages 是一个异步函数 - messages = await message_api.get_recent_messages(chat_id=chat_id, limit=limit) - return {"chat_id": chat_id, "messages": messages} \ No newline at end of file + try: + end_time = time.time() + start_time = end_time - (days * 24 * 3600) + + messages = await message_api.get_messages_by_time(start_time, end_time) + + sent_count = 0 + received_count = 0 + bot_qq = str(global_config.bot.qq_account) + + for msg in messages: + if msg.get("user_id") == bot_qq: + sent_count += 1 + else: + received_count += 1 + if message_type == "sent": + return {"days": days, "message_type": message_type, "count": sent_count} + elif message_type == "received": + return {"days": days, "message_type": message_type, "count": received_count} + else: + return { + "days": days, + "message_type": message_type, + "sent_count": sent_count, + "received_count": received_count, + "total_count": len(messages) + } + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e))