ForcePilot/backend/package/yuxi/channels/plugins/qqbot/_constants.py
Kris c888db4e1f refactor(qqbot): 重构并完善QQ Bot适配器功能
1. 优化HTTP客户端关闭异常捕获范围
2. 重构事件工具方法抽取公共模块
3. 新增频控缓存常量与身份缓存配置
4. 完善适配器依赖注入与配置读取
5. 实现被动消息频控与令牌刷新串行化
6. 修复会话、状态、目录等适配器逻辑
7. 优化探测适配器账户获取逻辑
8. 完善凭据轮换与生命周期钩子
9. 优化WebSocket连接处理与心跳机制
2026-07-09 04:19:12 +08:00

211 lines
7.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""QQ Bot 渠道插件共享常量。
集中定义在多个模块间共享的配置默认值、依赖标识与渠道标识,避免重复
定义导致的不一致风险P2-3 常量去重)。
仅汇集真正跨模块共享的常量;仅单一模块使用的常量仍保留在各自模块内。
所有常量值需与 ``manifest.json`` 中 ``config_schema`` 的 ``default`` 字段
及 ``resource_quota`` 保持一致F-03 manifest 单真相源),本模块的常量
作为 ConfigPort 未命中时的本地回退默认值。
依赖方向:仅标准库,不 import 任何框架层或同插件模块,避免循环依赖。
"""
from __future__ import annotations
# ---------------------------------------------------------------------------
# 渠道与依赖标识
# ---------------------------------------------------------------------------
# 渠道标识,用于 ConfigPort CHANNEL 作用域 target与 manifest.json
# channel_type / provides 对齐)
CHANNEL_TARGET = "qqbot"
# QQ Bot API 依赖标识,统一用于 ``DependencyError.dep`` 字段
QQBOT_API_DEP = "qqbot_api"
# ---------------------------------------------------------------------------
# QQ Bot API 端点与默认值
# ---------------------------------------------------------------------------
# QQ Bot API 基础地址(对齐 manifest.json config_schema api_base.default
API_BASE_URL = "https://api.sgroup.qq.com"
# token 获取端点路径POST /app/getAppAccessToken
TOKEN_ENDPOINT_PATH = "/app/getAppAccessToken"
# Gateway 获取端点路径GET /gateway
GATEWAY_ENDPOINT_PATH = "/gateway"
# 用户信息查询端点路径前缀GET /users/{openid}
USERS_ENDPOINT_PREFIX = "/users"
# 消息发送端点路径前缀
# C2C: POST /v2/users/{openid}/messages
# Group: POST /v2/groups/{group_openid}/messages
C2C_MESSAGES_PREFIX = "/v2/users"
GROUP_MESSAGES_PREFIX = "/v2/groups"
MESSAGES_SUFFIX = "/messages"
# 富媒体上传端点路径后缀
# C2C: POST /v2/users/{openid}/files
# Group: POST /v2/groups/{group_openid}/files
FILES_SUFFIX = "/files"
# 互动回调回应端点路径前缀PUT /interactions/{interaction_id}
INTERACTIONS_PREFIX = "/interactions"
# ---------------------------------------------------------------------------
# HTTP 客户端配置lifecycle 与 qqbot_client 共享)
# ---------------------------------------------------------------------------
# HTTP 客户端默认超时(秒),对齐 manifest.json config_schema
# http_timeout_ms.default=30000
HTTP_TIMEOUT_SECONDS = 30.0
# HTTP 连接池最大连接数,对齐 manifest.json
# resource_quota.max_connections=20
HTTP_MAX_CONNECTIONS = 20
# HTTP 连接池 keepalive 连接数上限
HTTP_MAX_KEEPALIVE_CONNECTIONS = 5
# ---------------------------------------------------------------------------
# WebSocket 与传输引擎配置
# ---------------------------------------------------------------------------
# WebSocket 心跳间隔默认值(毫秒),对齐 manifest.json config_schema
# ws_heartbeat_interval_ms.default=30000
WS_HEARTBEAT_INTERVAL_MS = 30000
# WebSocket 卡死检测超时(毫秒),对齐 manifest.json config_schema
# ws_stall_timeout_ms.default=120000
WS_STALL_TIMEOUT_MS = 120000
# 连接建立超时(毫秒)
CONNECT_TIMEOUT_MS = 10000
# ---------------------------------------------------------------------------
# Token 与缓存配置
# ---------------------------------------------------------------------------
# access_token 刷新提前量(秒),到期前 60s 刷新(设计文档 §5.4
TOKEN_REFRESH_LEAD_TIME_SEC = 60
# access_token 默认 TTLQQ Bot 有效期 7200s2 小时)
TOKEN_DEFAULT_TTL = 7200
# 用户信息缓存默认 TTL对齐 manifest.json config_schema
# user_cache_ttl.default=3600
USER_CACHE_TTL = 3600
# 身份解析缓存 TTL契约规定 60s
IDENTITY_CACHE_TTL = 60
# channel_msg_id → account_id 反向映射缓存 TTL
MSG_CACHE_TTL_SECONDS = 86400
# ---------------------------------------------------------------------------
# Intents 默认值(设计文档 §1.3
# ---------------------------------------------------------------------------
# GROUP_AND_C2C_EVENT (1<<25) + INTERACTION (1<<26)
# 对齐 manifest.json config_schema intents.default=0x06000000
DEFAULT_INTENTS = 0x06000000
# ---------------------------------------------------------------------------
# 被动消息频控默认值(设计文档 §4.5
# ---------------------------------------------------------------------------
# C2C 被动消息 60 分钟最大回复次数
PASSIVE_REPLY_LIMIT_C2C = 4
# Group 被动消息 5 分钟最大回复次数
PASSIVE_REPLY_LIMIT_GROUP = 5
# C2C 被动消息有效期(毫秒,默认 60 分钟)
PASSIVE_REPLY_TTL_C2C_MS = 3600000
# Group 被动消息有效期(毫秒,默认 5 分钟)
PASSIVE_REPLY_TTL_GROUP_MS = 300000
# Group 主动消息账号维度 qpm认证账号
GROUP_ACTIVE_QPM_ACCOUNT_VERIFIED = 60
# Group 主动消息账号维度 qpm未认证账号
GROUP_ACTIVE_QPM_ACCOUNT_UNVERIFIED = 30
# Group 主动消息单群维度 qpm
GROUP_ACTIVE_QPM_PER_GROUP = 20
# ---------------------------------------------------------------------------
# 消息撤回时限C2C/Group 均 2 分钟)
# ---------------------------------------------------------------------------
RECALL_TIME_LIMIT_SECONDS = 120
# ---------------------------------------------------------------------------
# 频控缓存 key 前缀
# ---------------------------------------------------------------------------
# 被动消息计数 key 前缀qqbot:passive:{account_id}:{peer_id}
PASSIVE_COUNTER_KEY_PREFIX = "qqbot:passive:"
# 主动消息 QPM 计数 key 前缀qqbot:active_qpm:{account_id}
ACTIVE_QPM_KEY_PREFIX = "qqbot:active_qpm:"
# 群主动消息 QPM 计数 key 前缀qqbot:active_qpm_group:{account_id}:{group_openid}
ACTIVE_QPM_GROUP_KEY_PREFIX = "qqbot:active_qpm_group:"
# ---------------------------------------------------------------------------
# 互动回调回应超时QQ Bot 客户端 loading 超时 3s
# ---------------------------------------------------------------------------
INTERACTION_ACK_TIMEOUT_SECONDS = 3.0
# ---------------------------------------------------------------------------
# 消息大小上限(字符数,决策 5
# ---------------------------------------------------------------------------
MAX_MESSAGE_LENGTH = 4000
__all__ = [
"CHANNEL_TARGET",
"QQBOT_API_DEP",
"API_BASE_URL",
"TOKEN_ENDPOINT_PATH",
"GATEWAY_ENDPOINT_PATH",
"USERS_ENDPOINT_PREFIX",
"C2C_MESSAGES_PREFIX",
"GROUP_MESSAGES_PREFIX",
"MESSAGES_SUFFIX",
"FILES_SUFFIX",
"INTERACTIONS_PREFIX",
"HTTP_TIMEOUT_SECONDS",
"HTTP_MAX_CONNECTIONS",
"HTTP_MAX_KEEPALIVE_CONNECTIONS",
"WS_HEARTBEAT_INTERVAL_MS",
"WS_STALL_TIMEOUT_MS",
"CONNECT_TIMEOUT_MS",
"TOKEN_REFRESH_LEAD_TIME_SEC",
"TOKEN_DEFAULT_TTL",
"USER_CACHE_TTL",
"IDENTITY_CACHE_TTL",
"MSG_CACHE_TTL_SECONDS",
"DEFAULT_INTENTS",
"PASSIVE_REPLY_LIMIT_C2C",
"PASSIVE_REPLY_LIMIT_GROUP",
"PASSIVE_REPLY_TTL_C2C_MS",
"PASSIVE_REPLY_TTL_GROUP_MS",
"GROUP_ACTIVE_QPM_ACCOUNT_VERIFIED",
"GROUP_ACTIVE_QPM_ACCOUNT_UNVERIFIED",
"GROUP_ACTIVE_QPM_PER_GROUP",
"RECALL_TIME_LIMIT_SECONDS",
"PASSIVE_COUNTER_KEY_PREFIX",
"ACTIVE_QPM_KEY_PREFIX",
"ACTIVE_QPM_GROUP_KEY_PREFIX",
"INTERACTION_ACK_TIMEOUT_SECONDS",
"MAX_MESSAGE_LENGTH",
]