1. 优化HTTP客户端关闭异常捕获范围 2. 重构事件工具方法抽取公共模块 3. 新增频控缓存常量与身份缓存配置 4. 完善适配器依赖注入与配置读取 5. 实现被动消息频控与令牌刷新串行化 6. 修复会话、状态、目录等适配器逻辑 7. 优化探测适配器账户获取逻辑 8. 完善凭据轮换与生命周期钩子 9. 优化WebSocket连接处理与心跳机制
211 lines
7.4 KiB
Python
211 lines
7.4 KiB
Python
"""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 默认 TTL(秒),QQ Bot 有效期 7200s(2 小时)
|
||
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",
|
||
]
|