From 88314fda6ec3a64d0c067ffdd23b178ed113b45d Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 4 Oct 2025 12:57:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(api):=20=E6=96=B0=E5=A2=9E=E6=8C=89?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E6=B5=81=E7=BB=9F=E8=AE=A1=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=9A=84API=E7=AB=AF=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增了一个API端点 `/messages/stats_by_chat`,用于根据指定的天数统计消息数据。该端点支持按聊天流进行分组,并提供了按用户进一步分组以及过滤机器人自身消息的选项。 主要功能包括: - 按指定天数范围查询消息。 - 按聊天流(chat_id)聚合统计数据,包括总消息数、发送数和接收数。 - 可选地按用户(user_id)在每个聊天流内进行分组统计。 - 可选地过滤掉机器人自身发送的消息。 --- src/api/message_router.py | 52 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/api/message_router.py b/src/api/message_router.py index 687f48f1e..919dacf4b 100644 --- a/src/api/message_router.py +++ b/src/api/message_router.py @@ -46,3 +46,55 @@ async def get_message_stats( except Exception as e: raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/messages/stats_by_chat") +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自身的消息") +): + """ + 获取BOT在指定天数内按聊天流或按用户统计的消息数据。 + """ + try: + end_time = time.time() + start_time = end_time - (days * 24 * 3600) + 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] + + stats = {} + + for msg in messages: + chat_id = msg.get("chat_id", "unknown") + user_id = msg.get("user_id") + + if chat_id not in stats: + stats[chat_id] = { + "total_stats": {"sent": 0, "received": 0, "total": 0}, + "user_stats": {} + } + + stats[chat_id]["total_stats"]["total"] += 1 + if user_id == bot_qq: + stats[chat_id]["total_stats"]["sent"] += 1 + else: + stats[chat_id]["total_stats"]["received"] += 1 + + if group_by_user: + if user_id not in stats[chat_id]["user_stats"]: + stats[chat_id]["user_stats"][user_id] = 0 + + 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()} + + return stats + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e))