注册登录认证固定域名skill
把「注册 → 登录 → 认证 → 创建 → 激活 → 绑定固定域名对外可用」整条链路做成可复用、可自主执行的流程引擎。
产出:账号 / 域名 / 服务从零到可用,并挂上永久固定、自带 HTTPS 的公网域名,凭据按统一规范落盘归档。
本技能整合来源(特色 100% 迁入,原技能已删除,避免重复与冲突):
sms-register-pay-skill · api-register-skill · 注册账户和配置模型 skill · 火山方舟控制台开通 · account-mismatch-diagnosis
〇、适用与不适用(先看这一节)
0.1 适用
- 你本人要在某个平台开账号、开服务、拿 Key、付一笔钱;
- 你要给已经跑起来的本地应用挂一个永久固定、自带 HTTPS 的公网域名;
- 你要按平台规则完成域名实名、DNS 切换、Cloudflare 接入;
- 你要核对「钱付了但权益没到账」这类账号问题。
0.2 不适用(命中任一条就别用)
| 情况 | 为什么 | 改用 |
|---|---|---|
| 批量注册、养号、多开账号 | 违反平台规则,且本技能的三大人工节点就是为此设的闸 | 无替代方案,不做 |
| 想完全无人值守自动过短信/人脸/支付 | 本技能故意在这三处停下等本人 | 做不到,别找 |
| 没有任何浏览器驱动 | A/B/C/F 的页面交互全依赖它,脚本会报 DRIVER_UNAVAILABLE |
装 bsk(Windows)或 pip install playwright(全平台);两个都不装就只能照 references 手工做 |
| macOS / Linux 且要用流程 G 的保活 | keep-alive-template.ps1、register-keepalive-task.ps1 依赖 Windows 计划任务 |
用 systemd / launchd 自行改写,Tunnel 部分照用 |
| 只想读方法论、不打算动手 | 8 条流程里只有 4 条有脚本,其余是手册 | 直接读 references,别装 |
| 要用非授权账号操作他人资产 | 越权且违规 | 不做 |
0.3 前置条件与检查
python scripts/preflight.py # 一条命令检查全部前置,缺失项会明确告诉你
| 依赖 | 必需范围 | 缺失后果 |
|---|---|---|
| 浏览器驱动(bsk 或 playwright 二选一) | 流程 A / B / C / F 全部页面交互 | 这些流程不可用 |
| Python ≥ 3.9 | flow.py、驱动层、自检 |
A / B 及所有浏览器操作不可用 |
| cloudflared | 仅流程 G | 无法建隧道 |
| Windows + PowerShell 7 | 仅流程 G 的保活、save_credentials.ps1 |
常驻与凭据落盘不可用 |
| Node ≥ 18 | 仅 verify_tencent.mjs |
不影响主流程 |
一、三大人工节点(铁律,AI 永不代劳)
| 节点 | AI 停下前必须做的事 | 交还用户时的话术要点 |
|---|---|---|
| ① 手机短信验证码 | 先点「获取验证码」,确认发码成功 | 明确告知验证码已发到哪个号码(掩码形式 138*****000);请用户转发 6 位码 |
| ② 人脸识别 | 把实名/核验页准备到可操作状态 | 说明需用户本人在手机 App 完成活体核验 |
| ③ 扫码支付 | 生成并保存付款二维码图片 | 输出二维码图片路径 + 金额 + 倒计时;提醒二维码有时效(约 15–25 分钟) |
其余全部由 AI 自主完成:填表、提交、注册登记、信息录入、流程办理、审核跟踪、凭据提取与入库、隧道建设与域名绑定。
默认手机号:13800138000(老规矩,用户级记忆已固化;除非显式传 --phone)。
固定域名绑定例外:若域名已注册且 NS 已切到 Cloudflare,整条绑定链路无人工节点,可全自动完成。
1.1 第零步铁律:新 API 必先读文档(2026-10-16 新增)
> 由「Codex 接 Agnes 免费 API」实战教训催生:拿到 Key 就凭直觉猜参数,连撞 4 次错;读一次官方文档,一次全对。
任何新注册 / 新接入的 API,在写第一行业务调用代码之前,必须先完成:
| 步 | 动作 | 判据 |
|---|---|---|
| 1 | 找到并读官方使用文档(API Reference) | 拿到 endpoint 全清单 + 认证头写法 |
| 2 | 抄下详细参数表(必填 / 类型 / 默认 / 枚举 / 参数所在层级) | 8 项核对清单逐项打勾 |
| 3 | 查计费页(单价 / 计费单位 / 免费额度 / 限流) | 找不到就按"可能收费"处理 |
| 4 | 核实模型 id(GET /v1/models 实测,不抄文档示例) |
建模型白名单 |
| 5 | 跑实测三连(models → 最小请求 → 读真实响应) | 返回产出物或业务错误码 |
| 6 | 落盘 API 使用卡 + 写入记忆 | 见 references/api-usage-research.md §六 |
⚠️ 两条硬红线
- 未读文档,不许写第一行业务代码(猜参数 = 浪费轮次 + 误判"Key 无效")。
- 文档与实际冲突,以实测为准,并把差异写进坑表。
📖 完整方法论(五步研究法 / 8 项参数核对清单 / 文档抓取技巧 / 使用卡模板)→ references/api-usage-research.md
1.2 已注册 API 使用卡索引(2026-10-16 补齐)
> 调用任何历史 API 前,先查卡,不要猜。 全部使用卡在 vault/credentials.md(每条凭证都附:认证方式 / 模型白名单 / 能力→端点 / 计费 / 限流 / 实测证据 / 已知坑)。
| 平台 | 用途 | 关键端点 | 计费 / 状态 |
|---|---|---|---|
| 火山方舟 ARK | 生图 / 生视频 / 文本 | POST /api/v3/images/generations、POST /api/v3/contents/generations/tasks |
生图 ≈¥0.22/张;视频 480p ≈¥0.44/秒 |
| MiniMax | 真声克隆 / TTS 配音 | POST /v1/t2a_v2、/v1/voice_clone、/v1/files/upload |
按字符计费;已克隆音色 junge_v2 |
| 蝉镜 | 数字人 / 对口型 / TTS | POST /open/v1/access_token → POST /open/v1/video_lip_sync/create |
蝉豆;audio 须公网 URL 或 TTS |
| 腾讯云 | TMT 翻译 / ASR 识别 | TC3 签名 → tmt.tencentcloudapi.com / asr.tencentcloudapi.com |
TMT 500 万字符/月免费 |
| TikHub | 社媒数据采集 | Authorization: Bearer;/api/v1/<平台>/… |
≈$0.001–0.01/次;国内用 api.tikhub.dev |
| 零一数科 | 内容合规预检 | POST /api/v1/content-quality/tasks |
需购点;余额 0 |
| 剪映 jcaigc | 云端草稿导出 | 基址 capcut-mate.jcaigc.cn |
已取得 token |
| 讯飞 xfyun | 听写 / 长语音转写 | IAT(WebSocket)/ LFASR(raasr.xfyun.cn) |
需控制台单独开通 |
| Agnes AI | 生图(免费)/ 生视频 | POST /v1/images/generations、POST /v1/videos |
生图 $0;视频 $0.025/秒起 |
| DeepSeek | LLM | POST https://api.deepseek.com/chat/completions |
走自有 Key |
⚠️ 安全:vault/credentials.md 含明文凭据 —— 永不复制进技能分发包、永不贴进对话/日志。给 Codex 的同步脚本已自动排除该文件。
📤 给 Codex 用最新版 → 把本包 SKILL.md + references/ + scripts/ 复制到 Codex 的 skills 目录即可(不要带 vault/;作者本机的自动同步脚本未随包发布)。
二、能力矩阵(8 条流程)
| 流程 | 场景 | 自动化程度 | 入口 |
|---|---|---|---|
| A. 手机号注册 + 取 Key | 短信验证类付费平台建号并自动拿到明文 API Key | 全自动(除短信码) | scripts/flow.py method1 |
| B. 扫码支付二维码 | 为平台发起最低金额支付,产出可扫二维码 | 全自动(除扫码付款) | scripts/flow.py method2 |
| C. 账户注册 + 配置模型 | 注册大模型平台账号 → 拿 Key → 写 WorkBuddy models.json |
半自动(AI 填表,人工收码/过验证) | 本文 §五·C |
| D. 付费 API 注册 + 读文档 + 实测验证 | 开通付费 API → 读官方文档摸清端点与参数 → 真实请求验证可调用 | 手册 + 1 个验证脚本 | references/api-register.md |
| E. 控制台开通/激活 | 控制台开通模型服务(火山方舟等) | 手册式(人工点击为主) | references/ark-console-activation.md |
| F. 域名注册 + 实名 + DNS | 注册域名 → 实名认证 → 改 NS → 接入 Cloudflare | 半自动(辅助上传证件) | references/aliyun-realname-cloudflare.md |
| G. 应用绑定固定域名 ⭐ | 给已完成的应用挂永久固定 HTTPS 公网域名 | 半自动(保活有脚本,隧道/路由人工) | references/app-to-fixed-domain.md |
| H. 账号权益核对 | 付了钱但平台里看不到 / 权益没到账 / 数据对不上 | 手册式 | references/account-mismatch-diagnosis.md |
> 口径说明:本技能是「流程手册 + 部分自动化脚本」,不是全自动引擎。A / B 有完整脚本;C / F / G 有脚本辅助一部分环节;D / E / H 是照着做的方法论。装之前先看清楚这条,别期待 8 条都能一键跑。
> F 与 G 的分工:F 解决"域名本身从无到可用"(注册、实名、NS 切换);G 解决"应用怎么挂到域名上"(隧道、路由、证书、常驻)。
> 若域名已就绪(zone = active),直接走 G,跳过 F。
2.1 执行范围与调用边界(重要:本技能是能力集合,不是线性向导)
核心原则:按需调用,能少跑就少跑。 description 只是"总入口";触发后只选择当前任务真正需要的那条流程,绝不自动把 A–H 跑一遍。
三条通用规则
- 粒度 = 流程级(A–H)。选中哪条就跑哪条,其余一律不碰。
- 流程内可分段终止。多阶段流程(A 两阶段 / C 五步 / F 两段 / G 八步)可在任一检查点达成目标后停下,不要求补齐后续阶段。
- 只有真实依赖才串流程。唯一硬依赖:G 需要"域名已 active"作为输入。
域名已就绪 → G 完全独立;域名未就绪 → 才需先跑 F 的前半段。
"只登录 / 只认证"等单点需求的处理
| 需求 | 走哪条 | 跑到哪停(终止条件) | 不需要做 |
|---|---|---|---|
| 只登录某平台 | ⚠️ 无独立"登录"流程——登录是 A/C/D 的前置步骤 | 登录成功(进入后台页面)即停 | 取 Key、创建密钥、支付 |
| 只做实名认证 | F 的实名段(域名列表→「未实名」→过户页「普通修改」) | 域名实名状态 = 正常 |
改 NS、接入 Cloudflare、建隧道 |
| 只生成支付二维码 | B | 二维码图片落盘并输出路径 + 金额 + 倒计时 | 扫码后的到账核对(属 H) |
| 只把应用挂到固定域名 | G | 各域名 curl 200 且 ssl_verify_result=0 |
域名注册 / 实名(前置由 F 完成) |
| 只查"权益没到账" | H | 结论写明"查的是哪个账号" + 已完成唯一性证伪 | 改动任何配置 |
| 只开模型服务 | E(+ D 做真实验证) | 控制台状态 + API 实测双通过 | 注册新账号(若已有) |
常见误解澄清
- ❌ "用了这个技能就得从注册一路跑到域名可用" → 错。A–H 是八条彼此独立的流程,不是一条长流水线。
- ❌ "登录是这个技能的一个能力" → 不准确。登录是多个流程的中间环节,没有独立入口;单点登录需求直接执行登录动作即可。
- ❌ "认证 = 必须走完域名全链路" → 错。实名认证只是 F 的前半段,到
实名状态=正常即可终止。 - ✅ 正确姿势:说清目标 → 选流程 → 跑到该流程的验收判据(见 §八)即停 → 汇报。
每轮任务结束必须报告:这次跑了哪条流程、停在哪个检查点,便于确认执行范围是否与预期吻合。
2.2 异常码与跨流程衔接(统一约定,三条能力线通用)
注册 / 登录 / 支付三条线共用同一套错误码,脚本输出与人工汇报都用它,不要各说各话。
| 错误码 | 含义 | 出现环节 | 处理动作 |
|---|---|---|---|
DAEMON_UNAVAILABLE |
bsk daemon 未存活 | A / B / C / F | 按 §4.1 以后台任务拉起,不要反复 detached 自启 |
NAVIGATION_TIMEOUT |
页面加载超时 | 全部 | 重试一次,仍失败则改为人工打开页面 |
SELECTOR_NOT_FOUND |
选择器未命中(平台改版) | A / B / C | 重新 bsk snapshot 取新状态,更新 platforms.json |
NOT_LOGGED_IN |
未登录就执行了需要登录的动作 | A / C / D | 先走登录段,登录后重取 ref |
CODE_INVALID |
短信码错误或已过期 | A / C | 重新发码,重发前必须重新 snapshot |
KEY_EXTRACT_FAILED |
取不到明文 Key | A / C | 依次尝试:会话 token → 剪贴板 → DOM 直读 |
PLAN_NOT_FOUND |
找不到最低价套餐 | B | 页面改版,更新 payment.min_plan_btn_text |
QR_NOT_RENDERED |
二维码未渲染完成 | B | 延长等待或重新点支付,别截半张图 |
TLS_BLOCKED |
目标站 TLS 被拦截 | A / B | 适配器标 tls_blocked,改为人工操作 |
NEED_HUMAN_SMS |
已发码,等待本人提供 6 位码 | A / C / F | 停下,报掩码号码,等码 |
NEED_HUMAN_FACE |
需要本人活体核验 | F / C | 停下,把页面准备到可操作状态 |
NEED_HUMAN_PAY |
二维码已生成,等待本人扫码 | B | 停下,报图片路径 + 金额 + 倒计时 |
退出码:0 成功或已停在人工节点(附 NEED_HUMAN_*);1 业务失败(附具体码);2 参数或前置条件错误。
三条能力线的衔接规则
- 注册 → 登录 → 支付 只在同一目标平台内串联,跨平台不串(例:不能在零一取完 Key 直接去火山方舟付钱)。
- 登录不是独立流程,它是 A / C / D 的前置步骤;只登录时跑到「进入后台」即停,不取 Key、不支付。
- 支付与到账核对分离:B 只负责生成二维码,付完是否到账归 H(
references/account-mismatch-diagnosis.md),B 不判断到账。 - 任一步遇到
NEED_HUMAN_*必须立即返回,不得继续往下跑,也不得替用户完成该动作。 - 幂等:A 的两个阶段共用
scripts/.state.json,重复执行同一阶段不会重复发码;换平台前先清该文件。
三、脚本与资源索引
| 文件 | 用途 |
|---|---|
scripts/preflight.py |
开工自检:检查浏览器驱动 / cloudflared / Python / Node / 目录权限 / 适配器表,输出 JSON + 退出码 |
scripts/flow.py |
主流程(方式一注册取 Key / 方式二支付二维码),仅依赖标准库 |
scripts/platforms.json |
平台适配器注册表(零一/蝉镜/剪映/讯飞/硅语…),新增平台只改这里 |
scripts/driver/ |
浏览器驱动适配层:cli.py 统一命令、base.py 四原语抽象、bsk.py 与 playwright_driver.py 两套实现(支持 Mac/Linux) |
scripts/upload_file.py |
文件注入通用实现:playwright 走原生 file input,其余走分块 base64 + DataTransfer |
scripts/page_helpers.js |
页面操作库 window.__J(事件穿透 fire、原生填值 fill、下拉 pick、错误 errs、toast toasts) |
scripts/inject_helpers.sh |
把 page_helpers.js 注入指定标签页(导航/刷新后必须重跑) |
scripts/inject_file2.sh |
upload_file.py 的兼容包装,原参数不变 |
scripts/verify_tencent.mjs |
腾讯云 TMT+ASR 真实调用验证器(含正确 TC3-HMAC-SHA256 签名,零依赖) |
scripts/save_credentials.ps1 |
凭据落盘到 vault/credentials.md(原子写、自动去重) |
scripts/keep-alive-template.ps1 |
通用应用保活脚本模板(改 2 个变量即可用;幂等、会话0安全) |
scripts/register-keepalive-task.ps1 |
一键注册计划任务(登录触发 + 每分钟保活,含父进程常驻校验) |
vault/credentials.md |
凭据库(Markdown 索引,gitignored,分发前必须清空) |
references/browser-driver.md |
⭐ 驱动适配层说明:切换方式、命令对照、两种模式的坑与边界 |
references/adapters.md |
平台适配器字段规范 + 新增平台步骤 |
references/api-usage-research.md |
⭐ 新 API 上手研究规范(拿到 Key 后必读):五步研究法 + 8 项参数核对清单 + 文档抓取技巧 + API 使用卡模板 |
references/api-register.md |
付费 API 注册 7 步流程(含读文档)+ 分平台速查 |
references/ark-console-activation.md |
火山方舟控制台开通(含 arco 三段法坑位) |
references/aliyun-realname-cloudflare.md |
域名注册 → 实名 → NS 切换 → Cloudflare 接入全流程实录 |
references/app-to-fixed-domain.md |
⭐ 应用绑定固定域名完整封装(建隧道→装服务→配路由→建DNS→开HTTPS→保活→验证→排障) |
references/account-mismatch-diagnosis.md |
账号不匹配 / 权益未到账核对流程 |
references/bsk-overlay-bypass.md |
遮罩层事件拦截破解法(必读基础设施) |
references/pitfalls-account-config.md |
大模型账户注册与配置坑点实录 |
references/credentials-convention.md |
凭证集中存放约定 |
四、开工前:先自检,再做三项准备
python scripts/preflight.py # 一条命令看全:依赖、daemon、cloudflared、适配器、vault 可写性
自检报 FAIL 的项按提示修完再往下走。下面三项是 preflight 覆盖不到的操作性准备。
4.1 确认浏览器驱动可用
python scripts/driver/cli.py doctor
输出里 resolved 非空即可开工。两种驱动二选一,默认 auto 自动挑:
| 驱动 | 适用 | 首次准备 |
|---|---|---|
bsk |
Windows,单次调用约 200ms | bsk daemon start --foreground 后台拉起,之后命令带 BSK_AUTO_START=0 |
playwright |
Mac / Linux / Windows 均可,单次约 1s | pip install playwright(复用系统已装 Edge/Chrome,不用额外下浏览器) |
强制指定:export SKILL_BROWSER_DRIVER=bsk(或 playwright)。细则与排障见 references/browser-driver.md。
bsk 报 cannot start an independent Windows daemon; Job Object breakaway; 拒绝访问 os error 5 → 不要反复 detached 自启,改后台任务方式拉起;实在拉不起来就 SKILL_BROWSER_DRIVER=playwright 绕过,不必卡在这。
4.2 锁定标签页(避免"点了没反应"的假象)
python scripts/driver/cli.py tabs --session <id>
agent 窗口可能残留上次会话的标签 → 不显式指定 --tab 时操作可能落在活动标签上。必须显式带 --tab,并顺手关掉无关残留。
4.3 注入页面操作库
bash scripts/inject_helpers.sh <session> <tab>
# 返回 {"ok":true,"value":"helpers ready"} 即可
⚠️ 每次导航/刷新后 window.__J 都会丢失,必须重新注入。
五、标准流程
A. 手机号注册 + 取 API Key(flow.py method1)
分两阶段,中间夹一个人工节点:
# 阶段 1:发码(用户会收到短信)
python scripts/flow.py method1 --platform lingyi
# → {"status":"AWAITING_CODE","phone":"13800138000",...}
# 用户转发 "401291" 后
# 阶段 2:填码登录 + 直取明文 Key + 入库 + 业务端点验证
python scripts/flow.py method1 --platform lingyi --code 401291
# → {"status":"DONE","api_key":"sk-xxx","verify":{"passed":true},...}
核心算法:
- 浏览器交互全走 bsk evaluate(按 CSS/text 在页面上下文填值、点击),不依赖 snapshot 的 @eN ref(发码后验证码框 ref 必失效)。
- 掩码 Key 直取:读站点 localStorage 会话 token → 页面上下文 fetch 「列出密钥」接口(带 Authorization: Bearer <token>)→ 响应含明文 api_key。运行时劫持 navigator.clipboard.writeText 无效(站点模块加载即缓存引用)。
- 两套鉴权:管理台接口(account/wallets)用会话 JWT,业务 skill 用 LY_API_KEY 之类——不是一套。verify 必须打业务端点(零一 /api/v1/content-quality/tasks 假 id 返 404 = 鉴权通过;返 401 才是 key 无效)。
- 已登录平台(如 jcaigc 会话持久化)自动跳过登录环节直接取 Key。
异常码:DAEMON_UNAVAILABLE / NAVIGATION_TIMEOUT / SELECTOR_NOT_FOUND / CODE_INVALID / KEY_EXTRACT_FAILED / TLS_BLOCKED。
B. 扫码支付二维码(flow.py method2)
python scripts/flow.py method2 --platform lingyi --pay-method wechat
# → {"status":"READY","amount":"¥19","qr_image_path":"...png","remaining_seconds":922,...}
> ⚠️ 参数名是 --pay-method(不是 --method),取值 wechat(默认)/ alipay。
选最便宜套餐 → 选支付方式 → 勾协议 → 截全视口 → 解析倒计时正则。
输出二维码路径给用户 → 人工扫码节点。
C. 账户注册 + 配置 WorkBuddy 模型(5 步半自动)
- 只读侦察(AI):
bsk session start --no-focus→bsk navigate <注册页>→bsk observe看表单结构。绝不提前填任何表单。 - 收集身份(问用户):邮箱 / 手机号 / 密码 / 平台。密码强度多为数字+字母+特殊符号,可在用户给定密码后补
!满足,并在交付时提醒记牢真实密码。 - 自动填表前半段(AI):填邮箱、密码+确认、手机号,勾选协议。受控复选框要 JS 触发:
js document.querySelector('input[type=checkbox]').click()
不发验证码——发码后必须人工收码。 - 人工节点:交还控制权(收短信码、过滑块/拼图 TCaptcha、人脸核验、绑卡付费)。
- 取 Key + 落盘(AI):进 API Key 管理 → 创建或启用 Key → 打开「API 调用」弹窗取明文 Key + Base URL + 模型名 → 写
~/.workbuddy/models.json(vendor/url/apiKey/maxTokens/supportsImages)→ 调save_credentials.ps1入vault/。
> 关键词:旧混元控制台 2026-09-30 停服,Key 入口改 TokenHub(console.cloud.tencent.com/tokenhub)。详见 references/pitfalls-account-config.md。
D. 付费 API 注册 → 读文档 → 真实调用验证(7 步)
侦察 → 注册/开通 → 建密钥 → ★读官方文档摸清端点与参数 → 实测三连 → 凭证入库 → 收藏 + 记忆
⚠️ ★ 是 2026-10-16 新增的强制环节:拿到 Key 后不许直接凭经验调接口,必须先读官方文档,
摸清 endpoint、参数层级、必填项、枚举取值、计费与限流,再落成一份「API 使用卡」。方法论 → references/api-usage-research.md。
⚠️ SecretKey 仅弹窗显示一次,必须当场完整复制落盘再关弹窗。
⚠️ "开通了"≠"能用",必须真实调用成功。
完整流程 + 分平台速查 → references/api-register.md。
E. 控制台开通 / 激活服务
references/ark-console-activation.md 全文。核心原则:
> 控制台显示「已开通」≠ 可调用。唯一权威判据 = 发一个真实请求看返回。
ModelNotOpen = Key 正常但模型未开通(去控制台开,别换 Key);InvalidEndpointOrModel.NotFound = 模型已下线(换模型)。
F. 域名注册 → 实名认证 → DNS → Cloudflare 接入
references/aliyun-realname-cloudflare.md 全文。链路:
邮箱验证 → 过户表单(普通修改模式)→ 身份证人像面注入 → 提交
→ 审核通过(实测 7 分钟)→ 阿里云「修改DNS服务器」→ 短信验证
→ 填入 CF 两条 NS → Cloudflare zone pending
(等 NS 传播 ≈9h,zone 自动转 active,无需再操作)
五条关键经验:
1. 阿里云账密登录若报「密码错误」→ 改走「手机号登录」(手机号 + 短信码);登录成功后还有一道「协议更新通知」拦截页,必须先点「我已阅读并同意」才进域名控制台。
2. cloudflared tunnel login 在此环境不可用(Authorize 无跳转、进程无本地回调监听、cert.pem 永不生成)→ 改用 Dashboard UI 建隧道 + 同源 API 取 token,全程无需 cert.pem。
3. 写 API 并非一律 403:POST /api/v4/zones(建 zone)确实 403,但 PUT .../cfd_tunnel/<id>/configurations 与 POST .../dns_records 均 ✅ 200 → 逐个实测,别凭先验放弃 API。
4. ?type=onboard 参数必须带,否则 add-site 页渲染成入口选择页。
5. 过户邮箱验证后表单会重置,标签回「快速过户」→ 重切「普通修改(过户)」重填。
G. 应用绑定固定域名 ⭐(Cloudflare Tunnel 全流程)
references/app-to-fixed-domain.md 全文(本技能 3.0 新增核心流程)。八步链路:
① 本地服务固化 计划任务保活(不依赖终端会话,否则域名必 502)
② 建隧道 Dashboard UI 建(tunnel login 不可用);路径必须是 /dash/<acct>/tunnels
③ 取 token 同源 API GET .../cfd_tunnel/<id>/token
④ 装 Windows 服务 cloudflared service install <token> → 开机自启
⑤ 配 ingress 同源 API PUT .../configurations(全量数组 + 404 兜底)
⑥ 建 DNS 同源 API POST .../dns_records(CNAME → <tid>.cfargotunnel.com, proxied:true)
⑦ 安全设置 SSL 模式 = full;Always Use HTTPS = on
⑧ 端到端验证 curl 各域名 → 200 且 ssl_verify_result=0
六条铁律:
| # | 铁律 | 违反后果 |
|---|---|---|
| 1 | 先固化本地服务,再上域名 | origin 不通 → 域名 502,且现象酷似 DNS/证书故障,极易误判 |
| 2 | ingress 是全量数组,PUT 必须带全部已有规则 | 老域名被整体覆盖失效 |
| 3 | ingress 最后一条必须 http_status:404 |
API 400 / 未匹配请求行为异常 |
| 4 | DNS 必须 proxied: true + content = <tid>.cfargotunnel.com |
源站暴露、拿不到免费 HTTPS |
| 5 | HTTPS 只用一级子域(app.dom.com) |
多级子域(a.b.dom.com)需 ACM 付费 |
| 6 | 本地服务必须计划任务托管 | 会话结束进程消失 → 域名立刻 502 |
费用(用户高频问):Tunnel + 一级子域 永久免费(1000 隧道/账号、流量不限、Universal SSL 免费);唯一付费场景 = 多级子域需 Advanced Certificate Manager。
一键固化本地服务:
Copy-Item "<skill_dir>\scripts\keep-alive-template.ps1" "D:\你的应用\keep-alive.ps1"
& "<skill_dir>\scripts\register-keepalive-task.ps1" -TaskName "MyAppKeep" `
-ScriptPath "D:\你的应用\keep-alive.ps1" -Port 3000
H. 账号权益核对("没到账 / 没生效 / 数据不对")
references/account-mismatch-diagnosis.md 全文。三条铁律:
- 先证明唯一性,再下结论 —— 断言"不存在"前,必须先排除"存在第二个账号/第二份数据"。举证责任在"不存在"一方。
- 结论会给第三方定性时(追责/投诉/维权),必须做反向证伪 —— 先问"如果我错了会看到什么",再去查那个东西。
- "用户说的"与"我看到的"冲突时,先怀疑自己样本不全 —— 不要先假定用户记错或客服敷衍。
> 输出红线:未做唯一性验证前,禁止使用"平台未建单""你没付成功""责任在平台"这类定性表述。
六、基础设施:破除 bsk 遮罩层拦截
> 仅 bsk 驱动需要。 SKILL_BROWSER_DRIVER=playwright 时不存在遮罩层,本节可整段跳过——这也是 playwright 模式反而更省心的原因。
这是 bsk 模式下所有浏览器操作的地基。 症状:bsk click 报 click ok、el.click() 无异常,但页面毫无反应。
根因:页面被注入 <browser-skill-overlay>(全屏 fixed、z-index:2147483647、捕获阶段拦截)→ CDP 点击 / JS 派发事件 / React onClick 全部失效。
三种破解法(详见 references/bsk-overlay-bypass.md):
// ① 事件穿透(通用,派发完整 over→down→up→click 序列)
window.__J.fire(el)
// ② 直接原生点击(最省事,绕过命中测试)
el.scrollIntoView({block:'center'}); el.click()
// ③ React 受控组件填值(原生 setter + input/change/blur)
window.__J.fill(id, val)
判据速查:
- 用 bsk snapshot 取 @eNN + bsk click(原生点击链路)→ 通常可用,优先。
- 原生点击无效 → 用 __J.fire(el)。
- 填值后提示未填 → 用 __J.fill。
- 下拉选项 → __J.openSel(id) + __J.pick(text)。
- 错误判定 → __J.errs()(只认 .next-form-item-help[role=alert],常驻帮助文本不是错误)。
- SPA 页面 @view 0x0(Zero Trust / Cloudflare Dash)→ bsk click/fill 全部失效 → 一律改用 bsk evaluate + 原生 setter。
七、收尾(不可省)
无论成功失败,任务结束必须停 bsk(守护进程永不自动退):
& "%USERPROFILE%\.workbuddy\skills\browser-skill-lifecycle\scripts\bsk-stop.ps1"
tasklist | grep -i bsk || echo "无 bsk 进程 ✓"
⚠️ 只停 bsk,不要杀 msedge.exe(那是用户日常浏览器)。
同时清理:临时 .b64 / .state.json / 中间截图。
敏感件(身份证图像/base64、邮箱凭据)→ 归档到独立目录,不要留在工作区根目录。
八、验收标准(= 各流程的终止条件)
> 跑到对应判据成立即可以停,不必继续往下跑(详见 §2.1 执行范围与调用边界)。
| 流程 | 通过判据 |
|---|---|
| A | status=DONE,api_key 非空,verify.passed=true,凭据文件已落盘 |
| B | status=READY,qr_image_path 文件存在且 >10KB,remaining_seconds>0 |
| C | models.json 已写入且格式合法;vault/credentials.md 有对应条目 |
| D | 真实 API 请求返回非错误(非"仅开通");且已落盘 API 使用卡(端点 / 参数 / 计费 / 模型白名单 四要素齐全) |
| E | 控制台状态 + API 实测双通过 |
| F | 实名状态=正常;Cloudflare zone status=active;权威 NS 返回 Cloudflare 两条地址 |
| G | 隧道 status=healthy 且 4 条 QUIC;ingress 最后一条为 http_status:404;各子域 CNAME → <tid>.cfargotunnel.com(proxied:true);Cloudflared 服务 = Running/Automatic;curl 各域名 200 且 ssl_verify_result=0;本地服务由计划任务保活(新进程父进程 = powershell.exe 而非会话 bash) |
| H | 结论中显式写明"查的是哪个账号";已做唯一性证伪或明确标注"尚无法排除" |
通用红线:凡付费 API,必须"真实调用成功"才算验证通过,绝不只停留在"服务已开通"。
九、坑位总表(跨流程高频)
| 症状 | 根因 | 解法 |
|---|---|---|
| 点击报成功但无反应 | BROWSER-SKILL-OVERLAY 捕获阶段拦截 |
__J.fire(el) 或 el.click(),别用坐标点击 |
| 操作打到了别的页 | agent 窗口残留标签 | bsk tab list --scope all 后 --tab-id 锁定 |
| 填值后 React 不识别 | 受控组件 | 原生 setter + input/change/blur(__J.fill) |
| 验证码框 ref 失效 | 发码后 DOM 重建 | 统一 evaluate 按 text/CSS 操作 |
| bsk daemon 起不来 | 沙箱拦 detached 启动 | bsk daemon start --foreground |
| 掩码 Key 取不到明文 | 剪贴板读不到,劫持无效 | localStorage token → 页面上下文 fetch 列密钥接口 |
| 站点打不开、证书失效 | 本环境 TLS 失效(如 meta.guiji.ai) |
标 tls_blocked,交用户手机/浏览器注册 |
bsk screenshot 超时 |
页面繁忙 | 改用 bsk evaluate 读状态 |
bsk session stop --session <id> 报 Usage |
session_id 是位置参数 | 写成 bsk session stop <id> |
POST /api/v4/zones 403 |
建 zone 需 Dashboard CSRF 头(特例) | 建 zone 走 UI;其他写 API(configurations/dns_records/settings)实测可用 |
cloudflared tunnel login 无反应 |
跨域 + 无本地回调,此环境不可用 | 弃用,改 Dashboard 建隧道 + API 取 token |
| 隧道页 404 | 路径写错 | 用 /dash/<account_id>/tunnels |
| Zero Trust 页 bsk click/fill 全失效 | 该 SPA @view 0x0 |
改 bsk evaluate + element.click() / 原生 setter |
| 用户问「要不要加钱」 | — | Tunnel 与一级子域全免费(1000 隧道/账号、流量不限);仅多级子域 a.b.dom.com 需 Advanced Certificate Manager 付费 → 坚持用一级子域即零成本 |
| 加了子域后域名 502 | 本地服务没启动 | 隧道通但 origin 不通,先做步骤 ① 固化服务 |
| 加了子域后老域名失效 | PUT ingress 时没带全量数组 | 重新 PUT,包含所有规则 |
| 域名 525 / 526 | SSL 模式错误 | 改成 full(源站是 http 时必须 full) |
证书无效 / ssl_verify_result≠0 |
用了多级子域 | 换成一级子域 |
| 域名打不开但 tunnel healthy | ingress 漏规则 / hostname 写错 | GET configurations 核对 |
| DNS 记录不生效 | proxied=false 或 content 写错 |
必须 <tid>.cfargotunnel.com + proxied:true |
| 隧道连接数是 8 不是 4 | 手动进程 + 服务进程双跑 | Stop-Process 掉手动那个,保留服务进程 |
| 输入 NS 报「DNS无效」 | 结尾多了点号 | 去掉末尾 . |
| 改 NS 后解析中断 | DNSSEC 未关 | 先在原注册商关闭 DNSSEC |
nslookup 返回旧 NS |
运营商 DNS 缓存 | 用 8.8.8.8 或权威查询 |
| 服务关了终端就没了 | 进程由会话 bash 启动 | 用计划任务跑 keep-alive.ps1;查父进程:powershell.exe=常驻,bash/WorkBuddy.exe=临时 |
| 计划任务启动服务失败 | 加了 -RedirectStandardOutput/Error |
去掉重定向(触发 Path/PATH 环境字典冲突);-NoProfile -WindowStyle Hidden 即可 |
LastTaskResult=255 |
脚本层启动失败(Action 路径/工作目录/脚本内路径) | 脚本内用 $PSScriptRoot 自解析路径,勿依赖 WorkingDirectory |
LastTaskResult=0x41301(267009) |
正在运行(手动触发撞自动触发),非错误 | 无需处理;IgnoreNew 下重复触发会返回「已在运行」 |
| 域名反复 502 / 服务反复重启 | 同一应用存在多份副本、端口相同 | 只给要用的那份启用计划任务,另一份保持 Disabled |
| PowerShell 脚本报「无法覆盖变量 PID」 | $PID 是只读内置变量 |
改用 $procId |
| 断言"没到账"却被推翻 | 只看了一个账号就下全称否定 | 先做步骤 F/H 的唯一性证伪 |
| 新 API 调不通、连撞 400 | 没读文档就凭直觉猜参数 | 先读 API Reference 逐项核对 8 项参数(§1.1) |
尺寸/时长参数被拒(width/height 400) |
参数名或层级与文档不符 | 按文档抄;顶层参数可能须放 extra_body 内(Agnes 实例) |
| 文档示例的模型 id 报"不存在" | 文档未同步下线 | 以 GET /v1/models 实测列表为准建白名单 |
| 以为"全模态免费",一跑就报余额不足 | 网传免费 ≠ 全模态免费 | 查官方计费页:Agnes 生图 $0、生视频 $0.025/秒 |
十、封装与分发
把本技能包分发给他人(或备份)时:
# 打包前必须确认 vault/ 已清空,仅留 README 模板
# 注意:包内不要有 .gitignore 这类以 . 开头的文件(SkillHub 会拒绝上传)
接收方:解压到自己的 ~/.workbuddy/skills/注册登录认证固定域名skill/ → 重启 WorkBuddy → 说「注册登录认证固定域名」即用 → 先跑 python scripts/preflight.py。
> ⚠️ 分发红线:vault/credentials.md 含明文账号密码与 API Key。确保 vault/ 为空或仅含 README.md 后再打包,否则凭据随包泄露。
发布渠道:SkillHub(网页/CLI/Agent 三种方式,需实名)或私有 Git 仓库。上架前用 python scripts/preflight.py --json 生成环境说明,附在版本说明里更省沟通。
前置依赖(接收方需自备):WorkBuddy 运行环境 + Python 3.9+ + 任一浏览器驱动(bsk 或 playwright)。绑定固定域名另需 cloudflared。Windows 保活另需 PowerShell 7。
十一、执行原则
- 能并行就并行:独立的分支(多平台注册、多凭据验证、zone 状态轮询与隧道准备、多子域 DNS 记录)并行推进,不串行等待;但不得牺牲准确性与可复现性。
- 只读侦察先行:任何变更前先用
bsk snapshot/observe/ 同源fetch确认真实状态,不信 DOM 表象、不信控制台显示。 - 幂等落盘:凭证一律原子写入(临时文件 +
os.replace),失败项明确记录,不用"看起来快"换"数据静默缺失"。 - 三节点必停:短信验证码 / 人脸识别 / 扫码支付,AI 绝不代劳。
- 先固化再对外:上域名前必须先让本地服务常驻,否则一切白干。
- 断言前先证伪:任何"不存在"的结论,先排除"存在第二个载体"。
- 先读文档再动手:接入任何新 API,一律先读官方使用文档与详细参数表,落盘「API 使用卡」后才写业务调用代码(见 §1.1)。