新增864 provider并打通server_key配置

- 新增 server_864 独立 provider 目录,接入登录、消息轮询、联系人、群资料、用户资料与朋友圈基础能力

- 扩展 gateway、robot 与配置归一化逻辑,支持 server_864/864 别名和 WECHAT_SERVER_KEY

- 更新配置示例与多版本适配路线图,明确 864 第一版接入范围和后续待补项
This commit is contained in:
liuwei
2026-05-07 11:24:33 +08:00
parent 86f8d57874
commit ff33edb0d1
18 changed files with 1174 additions and 7 deletions

View File

@@ -214,6 +214,11 @@ class Config(object):
wechat_ipad_config["server_type"] = str(
wechat_ipad_config.get("server_type", "legacy_855") or "legacy_855"
).strip()
# 864 风格 server 的鉴权核心是固定 `key`
# 1. 它不是像 855 那样主要依赖运行时 `wxid`
# 2. 因此这里把 `server_key` 也纳入统一配置归一化,确保 `.env` 成为唯一静态维护入口;
# 3. 留空仍允许通过校验阶段给出明确提示,而不是在 provider 启动后才报模糊错误。
wechat_ipad_config["server_key"] = str(wechat_ipad_config.get("server_key", "") or "").strip()
wechat_ipad_config["wxid"] = str(wechat_ipad_config.get("wxid", "") or "").strip()
wechat_ipad_config["device_name"] = str(wechat_ipad_config.get("device_name", "") or "").strip()
wechat_ipad_config["device_id"] = str(wechat_ipad_config.get("device_id", "") or "").strip()
@@ -343,6 +348,8 @@ class Config(object):
server_url = str(wechat_ipad_config.get("server_url", "") or "").strip()
server_ip = str(wechat_ipad_config.get("server_ip", "") or "").strip()
server_port = wechat_ipad_config.get("server_port", 0)
server_type = str(wechat_ipad_config.get("server_type", "") or "").strip().lower()
server_key = str(wechat_ipad_config.get("server_key", "") or "").strip()
if not server_url:
self._append_issue(
@@ -368,6 +375,18 @@ class Config(object):
"wechat_ipad server_port 未配置,机器人无法连接 wechat_ipad server。",
)
# 864 provider 明确依赖静态 `server_key`
# 1. 它用于服务端 license / 实例身份校验;
# 2. 即使扫码成功,也不能替代这份静态鉴权参数;
# 3. 因此这里在启动前直接报错,避免上线后才在登录页反复拿不到二维码。
if server_type in {"864", "server_864"} and not server_key:
self._append_issue(
report["errors"],
"missing_wechat_server_key",
"wechat_ipad.server_key",
"server_864 模式必须配置 wechat_ipad.server_key建议通过 .env 的 WECHAT_SERVER_KEY 注入)。",
)
def _validate_llm_config(self, report: dict) -> None:
"""检查 LLM 配置的完整性与路由一致性。"""
llm_config = self.llm or {}