From 5afad3285a94bcd0f0a3122bb687544b4964c834 Mon Sep 17 00:00:00 2001 From: chendelian <116870791@qq.com> Date: Mon, 6 Apr 2026 12:57:26 +0800 Subject: [PATCH] chore: auto release commit (2026-04-06 12:57:26) --- SKILL.md | 17 +++- assets/README.md | 6 ++ assets/examples/README.md | 4 + assets/examples/get-response.json | 12 +++ assets/examples/list-json-array.json | 26 +++++ assets/schemas/account-record.schema.json | 24 +++++ references/CLI.md | 116 ++++++++++++++++++++++ references/ERRORS.md | 56 +++++++++++ references/INTEGRATION.md | 39 ++++++++ references/PLATFORMS.md | 23 +++++ references/README.md | 13 +++ references/RUNTIME.md | 54 ++++++++++ 12 files changed, 389 insertions(+), 1 deletion(-) create mode 100644 assets/README.md create mode 100644 assets/examples/README.md create mode 100644 assets/examples/get-response.json create mode 100644 assets/examples/list-json-array.json create mode 100644 assets/schemas/account-record.schema.json create mode 100644 references/CLI.md create mode 100644 references/ERRORS.md create mode 100644 references/INTEGRATION.md create mode 100644 references/PLATFORMS.md create mode 100644 references/README.md create mode 100644 references/RUNTIME.md diff --git a/SKILL.md b/SKILL.md index 52f7e55..9da11a2 100644 --- a/SKILL.md +++ b/SKILL.md @@ -50,4 +50,19 @@ python3 {baseDir}/scripts/main.py delete platform <平台> <手机号> ### 列出某平台所有账号(platform 可为中文名、all 或 全部) ```bash python3 {baseDir}/scripts/main.py list all -python3 {baseDir}/scripts/main.py list 搜狐号 \ No newline at end of file +python3 {baseDir}/scripts/main.py list 搜狐号 +``` + +### 跨技能:单行 JSON(get / list-json / pick-web / pick-logged-in / set-login-status) +```bash +python3 {baseDir}/scripts/main.py get +python3 {baseDir}/scripts/main.py list-json all --limit 50 +python3 {baseDir}/scripts/main.py pick-web 搜狐号 +python3 {baseDir}/scripts/main.py set-login-status 1 +``` +约定与字段说明见 `references/INTEGRATION.md`;错误前缀见 `references/ERRORS.md`。 + +## 扩展文档(便于 AI 精确调用) + +- **references/**:完整 CLI、平台表、运行时环境、错误码、集成协议 — 见 [references/README.md](references/README.md)。 +- **assets/**:示例 JSON 与单条账号 Schema — 见 [assets/README.md](assets/README.md)。 \ No newline at end of file diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 0000000..efc64ea --- /dev/null +++ b/assets/README.md @@ -0,0 +1,6 @@ +# assets + +- `examples/`:CLI 成功输出形状示例(虚构路径与数据)。 +- `schemas/`:`get` / `list-json` / `pick-*` 单条对象的轻量 JSON Schema(`additionalProperties: true` 允许扩展字段)。 + +详细命令与错误码见仓库根目录 `references/`。 diff --git a/assets/examples/README.md b/assets/examples/README.md new file mode 100644 index 0000000..8e04f72 --- /dev/null +++ b/assets/examples/README.md @@ -0,0 +1,4 @@ +# 示例 JSON + +- `get-response.json`:`python main.py get ` 成功时 **stdout 单行** 对象的形状参考(示例路径为虚构)。 +- `list-json-array.json`:`list-json` 成功时 **stdout 单行** 数组的形状参考(本文件为多行排版便于阅读)。 diff --git a/assets/examples/get-response.json b/assets/examples/get-response.json new file mode 100644 index 0000000..3dc017c --- /dev/null +++ b/assets/examples/get-response.json @@ -0,0 +1,12 @@ +{ + "id": 1, + "name": "搜狐1号", + "platform": "sohu", + "phone": "13800138000", + "profile_dir": "D:/jiangchang-data/_anon/account-manager/profiles/搜狐号/13800138000", + "url": "https://mp.sohu.com", + "login_status": 1, + "last_login_at": "2026-04-01T12:00:00", + "created_at": "2026-03-01T10:00:00", + "updated_at": "2026-04-01T12:00:00" +} diff --git a/assets/examples/list-json-array.json b/assets/examples/list-json-array.json new file mode 100644 index 0000000..c4b0e31 --- /dev/null +++ b/assets/examples/list-json-array.json @@ -0,0 +1,26 @@ +[ + { + "id": 2, + "name": "知乎1号", + "platform": "zhihu", + "phone": "13900001111", + "profile_dir": "D:/jiangchang-data/_anon/account-manager/profiles/知乎/13900001111", + "url": "https://www.zhihu.com", + "login_status": 0, + "last_login_at": null, + "created_at": "2026-04-02T09:00:00", + "updated_at": "2026-04-02T09:00:00" + }, + { + "id": 1, + "name": "搜狐1号", + "platform": "sohu", + "phone": "13800138000", + "profile_dir": "D:/jiangchang-data/_anon/account-manager/profiles/搜狐号/13800138000", + "url": "https://mp.sohu.com", + "login_status": 1, + "last_login_at": "2026-04-01T12:00:00", + "created_at": "2026-03-01T10:00:00", + "updated_at": "2026-04-01T12:00:00" + } +] diff --git a/assets/schemas/account-record.schema.json b/assets/schemas/account-record.schema.json new file mode 100644 index 0000000..f8afebf --- /dev/null +++ b/assets/schemas/account-record.schema.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://openclaw.local/account-manager/account-record.schema.json", + "title": "AccountRecord", + "description": "account-manager get / list-json / pick-* 返回的单条账号对象(核心字段;extra_json 合并键不枚举)", + "type": "object", + "required": ["id", "name", "platform", "phone", "profile_dir", "url", "login_status", "created_at", "updated_at"], + "properties": { + "id": { "type": "integer" }, + "name": { "type": "string" }, + "platform": { "type": "string", "description": "内部英文键,如 sohu、zhihu" }, + "phone": { "type": "string", "description": "归一后的数字串,可能为空字符串" }, + "profile_dir": { "type": "string", "description": "Playwright 用户数据目录绝对路径" }, + "url": { "type": "string", "format": "uri" }, + "login_status": { "type": "integer", "enum": [0, 1] }, + "last_login_at": { + "type": ["string", "null"], + "description": "本地时区 ISO8601 字符串;未登录过为 null" + }, + "created_at": { "type": ["string", "null"] }, + "updated_at": { "type": ["string", "null"] } + }, + "additionalProperties": true +} diff --git a/references/CLI.md b/references/CLI.md new file mode 100644 index 0000000..31dc825 --- /dev/null +++ b/references/CLI.md @@ -0,0 +1,116 @@ +# account-manager CLI 参考 + +入口:`{skillRoot}/scripts/main.py`(宿主可将 `{baseDir}` 或技能根目录代入)。下文用 `python main.py` 表示在 `scripts/` 目录执行,或写成 `python {skillRoot}/scripts/main.py`。 + +## 通用说明 + +- **平台参数**:可为 `scripts/util/platforms.py` 中配置的**中文展示名、别名或英文键**(如 `sohu`、`搜狐号`)。详见 [PLATFORMS.md](PLATFORMS.md)。 +- **数据与路径**:库文件、profile 目录由环境变量决定,网关与本地终端不一致时会「看不到同一份数据」。详见 [RUNTIME.md](RUNTIME.md)。 +- **机器可读子命令**:`get`、`list-json`、`pick-logged-in`、`pick-web`、`set-login-status` 的成功/失败约定见 [INTEGRATION.md](INTEGRATION.md)。 +- **错误码前缀**:见 [ERRORS.md](ERRORS.md)。 + +> 说明:当前版本 **未实现** `health` / `version` 子命令;与工作区其它技能的统一约定可对齐后另补。 + +--- + +## 子命令一览 + +### `add` — 添加账号 + +```bash +python main.py add <平台> <手机号> +``` + +- 手机号为**中国大陆 11 位**(`1` 开头,第二位 `3–9`),可含空格/分隔符,入库前会归一成数字。 +- 同一 `platform` 下同一手机号不可重复。 + +### `list` — 列出账号(人类可读多行块) + +```bash +python main.py list [平台|all|全部] +``` + +- 省略第二参数时等价于 `all`。 +- 默认最多 **10** 条(按创建时间倒序);内部实现见 `service/account_service.cmd_list`。 + +### 简写:`python main.py <平台>` / `python main.py <平台> list` + +- 若第一个参数能解析为平台,则等价于 `list <平台>`。 + +### `get` — 按 id 输出**单行 JSON** + +```bash +python main.py get +``` + +- 成功:`stdout` **仅一行** JSON 对象(UTF-8)。 +- 失败:首行 `ERROR:ACCOUNT_NOT_FOUND`,路径提示在 stderr。 + +### `list-json` — 列表的**单行 JSON 数组**(跨技能) + +```bash +python main.py list-json <平台|all|全部> [--limit N] +``` + +- 成功:`stdout` **仅一行** JSON 数组;元素结构与 `get` 单条一致。 +- 默认 `limit=200`,实际 clamp 为 `1..500`。 +- 排序:按 `updated_at` 倒序。 + +### `pick-logged-in` — 该平台**已登录**的一条账号(单行 JSON) + +```bash +python main.py pick-logged-in <平台> +``` + +- 筛选:`login_status = 1`,按 `last_login_at` 优先。 +- 失败:首行以 `ERROR:` 开头(**勿当 JSON 解析**)。 + +### `pick-web` — 网页自动化候选账号(单行 JSON) + +```bash +python main.py pick-web <平台> +``` + +- 优先同 `pick-logged-in`;若无已登录,则取该平台 `updated_at` 最新一条。 +- 失败:首行 `ERROR:`。 + +### `set-login-status` — 回写登录态(跨技能) + +```bash +python main.py set-login-status <0|1> +``` + +- 成功:`stdout` 首行 `OK:SET_LOGIN_STATUS` 或 `OK:CLEARED_LOGIN_STATUS`,退出码 `0`。 +- 失败:`stdout` 首行 `ERROR:...`,退出码 `1`。 + +### `open` — 仅打开浏览器(**不写库**) + +```bash +python main.py open +``` + +- 需本机 Chrome/Edge + Playwright;详见运行环境说明。 + +### `login` — 打开浏览器并**自动检测登录**,写回 `login_status` + +```bash +python main.py login +``` + +- 依赖 Playwright;超时与轮询间隔等见 [RUNTIME.md](RUNTIME.md)。 + +### `delete` — 删除库记录并尽量删除 profile 目录 + +```bash +python main.py delete id +python main.py delete platform <平台> +python main.py delete platform <平台> <手机号> +``` + +- 第二段必须为 `id` 或 `platform`(小写不敏感)。 + +--- + +## 无参数 / 未知子命令 + +- 无参数或无法解析:打印用法概览;未知子命令时首行 `ERROR:CLI_UNKNOWN_OR_BAD_ARGS`,退出码 `1`。 diff --git a/references/ERRORS.md b/references/ERRORS.md new file mode 100644 index 0000000..cbdf75d --- /dev/null +++ b/references/ERRORS.md @@ -0,0 +1,56 @@ +# 终端前缀约定(account-manager) + +约定:**机器解析只依赖 `stdout` 首行**时,应先判断首行是否以 `ERROR:` 或 `OK:` 开头;多行说明可忽略或仅作展示。 + +## `OK:`(成功标记) + +| 首行 | 场景 | +|------|------| +| `OK:SET_LOGIN_STATUS` | `set-login-status 1` 成功 | +| `OK:CLEARED_LOGIN_STATUS` | `set-login-status 0` 成功 | + +## `ERROR:` — CLI 参数 / 路由 + +| 前缀 | 含义 | +|------|------| +| `ERROR:CLI_ADD_MISSING_ARGS` | `add` 参数不足 | +| `ERROR:CLI_GET_MISSING_ID` | `get` 缺少 id | +| `ERROR:CLI_OPEN_MISSING_ID` | `open` 缺少 id | +| `ERROR:CLI_LOGIN_MISSING_ID` | `login` 缺少 id | +| `ERROR:CLI_DELETE_MISSING_ARGS` | `delete` 参数不足 | +| `ERROR:CLI_DELETE_BAD_MODE` | `delete` 第二段不是 `id`/`platform` | +| `ERROR:CLI_SET_LOGIN_STATUS_MISSING_ARGS` | `set-login-status` 参数不足 | +| `ERROR:CLI_LIST_JSON_MISSING_PLATFORM` | `list-json` 缺少平台参数 | +| `ERROR:CLI_PICK_LOGGED_IN_MISSING_ARGS` | `pick-logged-in` 缺少平台 | +| `ERROR:CLI_PICK_WEB_MISSING_ARGS` | `pick-web` 缺少平台 | +| `ERROR:CLI_UNKNOWN_OR_BAD_ARGS` | 无法识别的子命令或参数组合 | + +## `ERROR:` — 业务与数据 + +| 前缀 | 含义 | +|------|------| +| `ERROR:INVALID_PLATFORM_LIST` | `list` 的平台名无法识别 | +| `ERROR:INVALID_PLATFORM_LIST_JSON` | `list-json` 的平台名无法识别 | +| `ERROR:INVALID_PLATFORM` | 其它子命令中平台无法识别 | +| `ERROR:NO_ACCOUNTS_FOUND` | 列表无结果(或 `delete platform` 下无记录) | +| `ERROR:ACCOUNT_NOT_FOUND` | 指定 id/记录不存在 | +| `ERROR:PHONE_REQUIRED` | 缺少手机号 | +| `ERROR:PHONE_INVALID` | 手机号格式不符合大陆 11 位规则 | +| `ERROR:DUPLICATE_PHONE_PLATFORM` | 同平台下山手机号已存在 | +| `ERROR:DELETE_INVALID_ID` | 删除 id 非法 | +| `ERROR:NO_LOGGED_IN_ACCOUNT` | `pick-logged-in` 无 `login_status=1` 的账号 | +| `ERROR:NO_ACCOUNT` | `pick-web` 该平台无任何记录 | +| `ERROR:INVALID_ACCOUNT_ID` | `set-login-status` 的 id 非数字 | +| `ERROR:INVALID_STATUS` | `set-login-status` 状态不是 0/1 | + +## `ERROR:` — 浏览器 / 环境 + +| 前缀 | 含义 | +|------|------| +| `ERROR:需要 playwright:pip install playwright && playwright install chromium` | 未安装 Playwright 或浏览器未安装 | +| `ERROR:PROFILE_DIR_MISSING` | 账号记录中 `profile_dir` 为空 | + +## 非前缀输出 + +- **成功添加账号**、**删除成功**等可能包含 `✅` 等人类可读行,**不宜**作为稳定协议解析。 +- **`get` / `list-json` / `pick-*` 成功**:`stdout` 应为**单行 JSON**(失败时首行 `ERROR:`,勿当 JSON)。 diff --git a/references/INTEGRATION.md b/references/INTEGRATION.md new file mode 100644 index 0000000..ed806f0 --- /dev/null +++ b/references/INTEGRATION.md @@ -0,0 +1,39 @@ +# 与其它 Skill 集成(account-manager) + +## 推荐调用方式 + +使用 **`subprocess`** 调用技能根目录下的 `scripts/main.py`,工作目录可为技能根或 `scripts/`(只要命令中的 `python` 与路径一致)。宿主注入的 **`JIANGCHANG_DATA_ROOT` / `JIANGCHANG_USER_ID`** 必须与最终用户会话一致,否则读写到错误库。 + +## 机器可读命令摘要 + +| 目的 | 命令 | 成功时 stdout | +|------|------|----------------| +| 取单条账号 JSON | `get ` | 单行 JSON 对象 | +| 批量账号 JSON | `list-json <平台或all> [--limit N]` | 单行 JSON 数组 | +| 只要已登录 | `pick-logged-in <平台>` | 单行 JSON 对象 | +| 自动化候选(优先已登录) | `pick-web <平台>` | 单行 JSON 对象 | +| 回写登录态 | `set-login-status <0或1>` | 首行 `OK:...` | + +## 解析协议(强建议) + +1. 读取子进程 **stdout** 全文或首行。 +2. 若首行以 **`ERROR:`** 开头 → 失败,不要 `json.loads` 整段 stdout。 +3. 若首行以 **`OK:`** 开头 → `set-login-status` 成功(可再检查退出码 `0`)。 +4. **`get` / `list-json` / `pick-logged-in` / `pick-web`**:成功时应对**第一行**做 `json.loads`;后续行应不存在,若有则视为非协议内容。 + +## JSON 对象字段(与 `get` 一致) + +典型字段见仓库 `assets/examples/get-response.json` 与 `assets/schemas/account-record.schema.json`。 + +常见键名包括:`id`, `name`, `platform`, `phone`, `profile_dir`, `url`, `login_status`, `last_login_at`, `created_at`, `updated_at`;`extra_json` 列中的扁平扩展可能并入同一对象。 + +## Publisher / 自动化流水线示例 + +1. `pick-web 搜狐号`(或目标平台)→ 解析 JSON → 取 `id`、`profile_dir`、`url`。 +2. 若需确认已登录:检查 `login_status == 1`,否则可引导用户执行 `login ` 或先 `open ` 人工登录。 +3. 外部脚本在确认登录后,可调用 `set-login-status 1` 保持与库一致(若你们自有检测逻辑)。 + +## 退出码 + +- **`set-login-status`**:失败时进程以 **`1`** 退出(见实现)。 +- 其它子命令多数为 **`0`**;若需严格编排,请以 **stdout 首行前缀** 与 **JSON 可解析性** 为准,不要仅依赖退出码。 diff --git a/references/PLATFORMS.md b/references/PLATFORMS.md new file mode 100644 index 0000000..b1bba99 --- /dev/null +++ b/references/PLATFORMS.md @@ -0,0 +1,23 @@ +# 平台与别名(account-manager) + +**权威来源**:`scripts/util/platforms.py` 中的 `PLATFORMS`。下表便于 AI/文档阅读;若与代码不一致,**以代码为准**。 + +入库字段 `accounts.platform` 使用下表 **英文键**(小写)。CLI 与用户话术可使用 **展示名** 或 **别名**。 + +| 英文键 (`platform`) | 展示名 (`label`) | 默认账号名前缀 (`prefix`) | 别名 (`aliases`) | 默认 URL | +|---------------------|------------------|---------------------------|------------------|----------| +| `sohu` | 搜狐号 | 搜狐 | 搜狐 | https://mp.sohu.com | +| `toutiao` | 头条号 | 头条 | 头条 | https://mp.toutiao.com/ | +| `zhihu` | 知乎 | (同 label) | 知乎号 | https://www.zhihu.com | +| `wechat` | 微信公众号 | 微信 | 公众号、微信 | https://mp.weixin.qq.com | +| `kimi` | Kimi | (同 label) | 月之暗面 | https://kimi.moonshot.cn | +| `deepseek` | DeepSeek | (同 label) | — | https://chat.deepseek.com | +| `doubao` | 豆包 | (同 label) | — | https://www.doubao.com | +| `qianwen` | 通义千问 | 通义 | 通义、千问 | https://tongyi.aliyun.com | +| `yiyan` | 文心一言 | 文心 | 文心、一言 | https://yiyan.baidu.com | +| `yuanbao` | 腾讯元宝 | 元宝 | 元宝 | https://yuanbao.tencent.com | + +## 解析规则(摘要) + +- 英文键本身、各 `label`、各 `aliases` 条目(及小写形式)均可解析到对应键。 +- 无法识别时,相关子命令会输出 `ERROR:INVALID_PLATFORM` 或 `ERROR:INVALID_PLATFORM_LIST` / `INVALID_PLATFORM_LIST_JSON` 等,并附带「支持的平台」提示。 diff --git a/references/README.md b/references/README.md new file mode 100644 index 0000000..f741f9e --- /dev/null +++ b/references/README.md @@ -0,0 +1,13 @@ +# references(account-manager) + +供 Agent 按需加载的说明文档(与 `SKILL.md` 配合,渐进式披露)。 + +| 文件 | 内容 | +|------|------| +| [CLI.md](CLI.md) | 子命令、参数、行为说明 | +| [PLATFORMS.md](PLATFORMS.md) | 平台英文键、中文名、别名 | +| [RUNTIME.md](RUNTIME.md) | 环境变量、数据路径、日志、登录调参 | +| [ERRORS.md](ERRORS.md) | `ERROR:` / `OK:` 前缀一览 | +| [INTEGRATION.md](INTEGRATION.md) | 跨 Skill 调用与 JSON 解析约定 | + +示例 JSON 与 Schema 见仓库 `assets/`。 diff --git a/references/RUNTIME.md b/references/RUNTIME.md new file mode 100644 index 0000000..b432149 --- /dev/null +++ b/references/RUNTIME.md @@ -0,0 +1,54 @@ +# 运行环境与数据路径(account-manager) + +## 数据落盘位置(当前实现) + +代码见 `scripts/util/runtime_paths.py`、`scripts/util/constants.py`。 + +- **数据根目录** `get_data_root()`:优先环境变量 **`JIANGCHANG_DATA_ROOT`**;未设置时 Windows 默认 `D:\jiangchang-data`,其它系统默认 `~/.jiangchang-data`。 +- **用户/工作空间 id** `get_user_id()`:优先 **`JIANGCHANG_USER_ID`**;未设置时为 **`_anon`**。 +- **技能数据目录**:`{数据根}/{用户id}/account-manager/` + - **SQLite**:`account-manager.db` + - **Profile**:`profiles/<平台展示名>/<手机号>/`(由 `get_default_profile_dir` 生成) + - **日志目录**:`logs/`(见下) + +> OpenClaw 工作区文档中的 **`CLAW_*`** 变量:本技能**当前仍以 `JIANGCHANG_*` 为准**读取数据根与用户 id;若宿主已统一注入 `CLAW_*`,需在代码层做别名兼容(未做前请只依赖本文列出的变量)。 + +## 调试:为什么「list 没数据」 + +- 本地终端未设置 `JIANGCHANG_DATA_ROOT` / `JIANGCHANG_USER_ID` 时,会落到 **默认盘路径** 与 **`_anon`**,与网关中运行的实例**不是同一个库文件**。 +- 设置 **`JIANGCHANG_ACCOUNT_DEBUG_PATHS=1`**(`1`/`true`/`yes`/`on`)后,每次 CLI 子命令前会在 **stderr** 打印实际使用的根目录、用户 id 与数据库路径(由 `_maybe_print_paths_debug_cli` 输出)。 + +## 本地 CLI 开发注入(慎用) + +`util/constants.py` 中 **`_apply_cli_local_dev_env()`** 仅在 CLI 入口调用: + +- 若开启本地开发开关(代码内 `_ACCOUNT_MANAGER_CLI_LOCAL_DEV` 或环境变量 **`JIANGCHANG_ACCOUNT_CLI_LOCAL_DEV=1`**),且当前未设置 `JIANGCHANG_DATA_ROOT` / `JIANGCHANG_USER_ID`,会注入代码内配置的默认路径与用户 id。 +- **发版前务必关闭**,避免个人路径进入制品。详见该文件内注释。 + +## 日志 + +`scripts/util/logging_config.py`: + +| 变量 | 作用 | +|------|------| +| `JIANGCHANG_LOG_LEVEL` | 日志级别,默认 `INFO` | +| `JIANGCHANG_LOG_TO_STDERR` | 设为 `1`/`true` 等时,WARNING 及以上同步 stderr | +| `JIANGCHANG_ACCOUNT_MANAGER_LOG_FILE` | 覆盖日志文件绝对路径(默认 `{技能数据目录}/logs/account-manager.log`) | + +## 登录 / 浏览器子进程(login) + +`service/browser_service.py` 与子进程 `service/login_child_runner.py`: + +| 变量 | 作用 | +|------|------| +| `JIANGCHANG_LOGIN_TIMEOUT_SECONDS` | 登录检测最长秒数,默认 `300`,不少于 `60` | +| `JIANGCHANG_LOGIN_POLL_INTERVAL_SECONDS` | DOM 轮询间隔,默认 `1.5`,限制在 `0.5..10` | +| `JIANGCHANG_LOGIN_DOM_GRACE_SECONDS` | 打开 URL 后等待再检测,默认 `4`,减轻跳转误判 | + +依赖:**本机已安装 Chrome 或 Edge**;Python 环境需 **`playwright`** 且已执行 `playwright install chromium`(错误信息见 CLI 输出)。 + +## 常见问题(简要) + +- **`ERROR:需要 playwright`**:安装 `playwright` 并安装浏览器内核。 +- **`ERROR:PROFILE_DIR_MISSING`**:库中该账号 `profile_dir` 为空,需检查数据或重新添加账号流程。 +- **登录检测一直失败**:关闭占用同一 profile 目录的其它浏览器;可调高超时与环境变量;查看技能日志文件。