MetAPI 站点与 Session 账号接入
目标
使用当前生产 MetAPI 的正式管理 API,以最少步骤完成“站点 + Session Cookie”接入和定向验收。优先运行 scripts/add_site_account.sh;只有部署布局或 API 契约已经变化时才手工调用接口。
硬性约束
- 把 Cookie、管理员 Token、API Key 和代理凭据视为秘密。不得回显、写入技能/仓库/普通日志,也不得放在进程命令行参数中。
- 通过脚本的隐藏标准输入传入 Cookie。不要使用
--cookie <值>、命令行curl -H "Cookie: ..."或持久化环境变量。 - 写入前核实运行容器、端口、数据卷和目标数据库。默认布局为容器
metapi、管理地址http://127.0.0.1:4000、SQLite/root/metapi-deploy/data/hub.db;证据不一致时停止使用默认值。 - 管理 Token 可能被 SQLite
settings.auth_token覆盖。优先从已核实的运行库做精确只读查询,不要只信 compose 或容器环境变量。 - 只使用管理 API 写入。不要直接向生产 SQLite 插入或更新站点、账号、余额、签到日志。
- 先按规范化 URL 查重站点。先验证 Session 身份,再按同站点用户名精确查重账号;唯一匹配时重绑,零匹配时新增,多匹配时停止,禁止猜测。
- 只刷新和签到本次目标账号。禁止调用全量余额刷新或
/api/checkin/trigger。 - 按用户的长期偏好,技能默认启用账号签到并执行一次定向签到测试;只有用户明确要求不签到时才关闭。余额刷新始终执行。
- 遇到
403、ACW/ESA/Cloudflare 盾、超时或限流时,不要高频重试。复用现有 MetAPI adapter、系统代理和 AnyRouter helper;记录脱敏错误并最多做一次有依据的重试。
快速流程
- 只读确认生产实例:
docker inspect metapi核对端口、数据卷、compose 工作目录和镜像。- 核对
127.0.0.1:4000只绑定本机。 - 核对 SQLite 路径来自容器
/app/data的实际挂载。
- 启动脚本,并让执行工具保持 TTY 会话:
METAPI_SITE_URL='https://example.com/' \
METAPI_SITE_NAME='站点显示名' \
bash /root/.codex/skills/metapi-add-site-account/scripts/add_site_account.sh
默认启用签到;用户明确要求不签到时加入 METAPI_ENABLE_CHECKIN=0。
3. 脚本提示时,通过执行会话的标准输入发送 Cookie 和换行。不要把 Cookie 拼进上述命令。
4. 脚本会依次执行:
- 获取有效管理员 Token并验证管理 API;
GET /api/sites按 URL 查重;- 必要时
POST /api/sites/detect和POST /api/sites; POST /api/accounts/verify-token验证 Session 并识别用户名;若站点要求用户 ID,自动从 Cookie 的 Gob payload 提取并逐个正式验证;- 精确重绑已有账号,或
POST /api/accounts新建账号; - 等待后台初始化任务进入终态;
- 定向
POST /api/accounts/:id/balance; - 定向
POST /api/checkin/trigger/:id; - 读取账号快照与最新签到日志,输出无凭据摘要。
- 使用脚本返回的 JSON 验收,不以单个 HTTP 200 代替业务结果。
可选参数
通过一次性环境变量覆盖非秘密配置:
METAPI_BASE_URL:管理地址,默认http://127.0.0.1:4000。METAPI_DB_PATH:运行 SQLite,默认/root/metapi-deploy/data/hub.db。METAPI_SITE_URL:必填站点 URL。METAPI_SITE_NAME:站点不存在时使用;未填则从域名生成。METAPI_PLATFORM:已知平台时可传new-api等;未填则调用站点检测。METAPI_PLATFORM_USER_ID:只有站点明确需要正整数用户 ID 时填写。METAPI_ENABLE_CHECKIN=0:显式关闭账号签到和签到测试;默认值为1。
Cookie 中的用户 ID
不要观察原始 Cookie 猜 ID。New API 常见 Session 值是外层 Base64,解码后结构为:
<timestamp>|<base64-gob-payload>|<signature>
再次 Base64 解码中间段即可得到 Go gorilla/sessions 的 Gob payload。站点用户 ID 存在字段名 id、类型 int 后,对应字节标记为 id\x03int\x04;后续是 Gob 长度、分隔符和有符号整数编码。使用 scripts/extract_session_user_ids.mjs 从隐藏标准输入读取 Cookie并输出候选,不要手工抄取。
主脚本已自动执行以下逻辑:
- 先不带用户 ID 验证 Cookie。
- 仅当接口明确返回
needsUserId时,本地解析 Gob 的精确id字段。 - 精确字段不存在时,才补充 payload 中与
id、uid、user或_相邻的 4–8 位数字。 - 最多取 8 个候选,逐个调用正式验证接口;只采用返回
tokenType=session的 ID。 - 全部候选失败才要求人工提供
METAPI_PLATFORM_USER_ID,禁止用连续数字暴力枚举。
验收标准
- 站点 URL 唯一,没有重复创建。
- Cookie 验证结果为
tokenType=session,目标账号为active,canRefreshBalance=true。 - 余额刷新返回数值余额,最终快照的
lastBalanceRefresh已更新。 - 授权签到时,返回成功、今日已签到或等价的幂等成功状态;最新签到日志属于目标账号,且最终
lastCheckinAt已更新。 - 若签到带来奖励,最终余额应反映签到后的再次刷新;报告奖励与余额变化时只报告数值,不报告凭据。
- 最终回复只给站点 ID、账号 ID、用户名、余额、签到结果、奖励和时间字段;明确说明 Cookie 未回显、未写入技能。
失败处理
- 站点检测失败:让用户或源码证据明确平台后再创建,不猜平台。
- Session 验证失败:若明确缺用户 ID,先执行内置 Gob 提取和正式验证;仍失败才停止,不绕过正式 API 直接落库。
- 同站点出现多个同名账号:停止并列出脱敏 ID,要求用户明确目标。
- 创建成功但初始化或验收失败:保留已创建记录并准确报告部分成功;不要擅自删除,因为删除属于额外破坏性操作。
- 管理 Token、数据库或运行实例身份不清:按生产环境处理并停止写入。