WorkBuddy 每日签到 · 免令牌版
特色(与市面同类技能的根本差别)
| 维度 | 读令牌类技能(市场多数) | 本技能(CDP 路线) |
|---|---|---|
| 凭据处理 | 读本地登录态文件取 accessToken |
完全不读、不解、不存任何凭据 |
| 客户端 2026-09 起启用凭据静态加密后 | 集体失效 | 不受影响(加密只保护磁盘上的令牌,本技能不碰它) |
| 客户端 2026-10 起关闭网页 cookie 认证路由后 | 裸调网页接口的方案集体失效 | 不受影响(改调客户端自身已鉴权的接口,不依赖 cookie) |
| 令牌过期 / 轮换 | 需重新取令牌,易断 | 由客户端会话自动续期,长期有效 |
| 附带能力 | 多为单一签到 | 签到 + 派猫猫旅行闭环 + 实时余额 |
一句话:别人在门口想办法撬锁、或去敲一扇已经关上的窗,本技能走的是厂商自己开的那道门。
何时使用
- 用户要签到:
每日签到 / 补签 / 今天签到了吗 / Buddy加油站 / 领积分。 - 用户报障:
签到失败 / 收不到签到消息 / 之前能签现在不行了。 - 用户要旅行玩法:
派猫猫旅行 / 猫猫旅行 / 领旅行奖励 / Buddy 在旅行吗 / 还有多久回来。 - 用户要定时化:
设置每天自动签到 / 建个签到定时任务。
原理(为什么要绕这一道)
「Buddy 加油站」是 WorkBuddy 客户端的内置功能,其接口鉴权由客户端自己的会话携带。
自 2026-09-23 起,客户端把本地登录态里的敏感字段(accessToken / refreshToken)改为
{"$wbEncrypted":1,"envelope":"…"} 的 AES-256-GCM 信封存储,解封钥为客户端编译期载荷、
磁盘无可读副本 —— 于是所有「读文件取令牌」的签到方案同时失效。
而客户端主包内的 apply-cli-command-line-switches 载明:当环境变量
WORKBUDDY_REMOTE_DEBUGGING_PORT 为合法数字端口时,会启用
--remote-debugging-port 与 --remote-allow-origins,原文注释为
「供 super-workbuddy skill 等外部自动化工具连接。默认不开。」
即:厂商为外部自动化预留的官方入口。本技能通过该端口(CDP)在客户端渲染进程内发起请求,
鉴权由客户端自动携带,与令牌文件彻底解耦。
⚠️ 请勿改回「在页面里裸 fetch 网页接口」
本技能 v1.0.0–v1.0.2 曾采用「在渲染进程里 fetch('https://www.workbuddy.cn/billing/...'),
靠浏览器 cookie 认证」。2026-10-02 起该网页端路由被网关整体关闭:同一枚 session cookie
确实随请求发出(CDP 抓包证实未被拦截),但 /billing/meter/* 与 /v2/billing/meter/*
一律返回 401 Authorization Required(openresty/APISIX 网关页);补 X-User-Id / Referer /
Origin 均无效。
根因(客户端主包注释原文):
> 计费接口路径前缀:Web(Cloud):空串 → /billing/meter/...(走浏览器 cookie 认证);
> Desktop:覆盖为 /v2 → /v2/billing/meter/...(走 IDE 网关 Bearer token)。
桌面端本就该走 Bearer token(Authorization: Bearer <accessToken> + 设备风险头
X-Device-Token)。正解不是去拿 token,而是让客户端自己发请求。
现行做法:调用客户端自身暴露的接口
客户端渲染进程全局有 window.wb(客户端自己的 API 聚合对象,其界面即用它):
| 用途 | 调用 |
|---|---|
| 查签到状态 | wb.account.checkinStatus()(客户端已映射为驼峰字段 todayCheckedIn / streakDays / totalCredits …) |
| 领取签到 | wb.account.checkin()(领完须复查 checkinStatus()) |
| 其他接口 | wb.http.get(path) / wb.http.post(path, body)(直接返回解析后的 body:{code,msg,requestId,data}) |
鉴权由客户端自己加,脚本不读令牌、不用 cookie、不落盘。
wb.http 的路径口径与桌面端一致:签到类 /v2/billing/meter/...,余额 /billing/meter/get-user-resource-summary。
> wb 属客户端内部接口(非公开 API)。客户端大版本升级后若改名,报 phase=api;
> 此时用 CDP Runtime.evaluate 列 Object.keys(window.wb) 重探即可,思路同本节。
前置条件(一次性)
- 本机已安装并登录 WorkBuddy 客户端。
- 设置用户级环境变量(Windows):
```powershell
```
(macOS / Linux 等价做法:写入 shell 配置或系统环境变量。)
- 完全退出并重新打开客户端一次(Electron 单实例锁:旧实例不退,新参数不生效;
注意托盘图标右键「退出」,确保进程真的结束)。 - 验证端口已开:
bash
curl -s http://127.0.0.1:9222/json/version
返回含 "Browser" 与 "webSocketDebuggerUrl" 的 JSON 即为就绪。
> 环境变量只影响重启之后新启动的客户端进程;若客户端先于设置就已运行,需重启一次。
执行步骤
1. 跑核心脚本(签到 + 旅行 + 余额)
node scripts/checkin_cdp.mjs
- 输出一行 JSON,字段见下节。
- 退出码:
0成功(含今日已签到)/3客户端未开调试端口/2需重新登录/1其他失败。 - 端口解析顺序:
WB_CDP_PORT→WORKBUDDY_REMOTE_DEBUGGING_PORT→ 配置目录下
app/session/DevToolsActivePort→9222。可用WB_CDP_PORT=9222显式指定。
2. 若要「自动拉起客户端 + 状态判定 + 推送」(推荐用于定时任务)
python scripts/checkin_task.py # 完整流程
python scripts/checkin_task.py --no-launch # 端口不通时不尝试拉起客户端
python scripts/checkin_task.py --webhook https://example.com/hook # 结果推送到任意 Webhook
该封装体会:确保端口可达(客户端未运行时按常见安装位置探测并拉起,最多等 120 秒;
客户端已在运行但端口未就绪时,先在 30 秒宽限内每 3 秒重探,用于消化「刚开机、端口尚未监听」的空窗期)
→ 调用核心脚本 → 按结果决定是否推送(每天每类至多一条,已签到静默)→ 写日志与状态。
标准输出同样是一行 JSON。
3. 设为每日自动化(可选)
把 templates/automation-prompt.md 的内容交给 WorkBuddy 建定时任务,
或直接在自动化里调用上面的封装体命令。建议每天 09:00 触发。
输出字段与汇报口径
| 字段 | 含义 |
|---|---|
ok |
本次流程是否成功执行 |
action |
claimed=本次领取成功;already=今日已签 |
checkin.streak_days |
连续签到天数 |
checkin.total_credits |
本期活动累计签到积分(=连续天数 × 100) |
balance.total_remain |
账户实时可用积分余额(各资源包 CycleRemainCapacity 求和) |
travel.log |
派猫猫旅行的动作记录(领取 / 派遣 / 无需派遣) |
> 两本账务必分清、不得混称:balance 才是「账户余额」;total_credits 是
> 「本期活动累计」,不含旅行奖励等其它来源。汇报时分别称「实时余额」与「本期累计」。
排错速查
| 现象 | 判据 | 处置 |
|---|---|---|
exit 3,报「无法连接客户端调试端口」 |
客户端未运行或未开端口 | 确认客户端在运行;未运行则先启动(本技能封装体会自动尝试) |
| 报「客户端在运行但未开调试端口」 | 进程在、端口不通(脚本会先宽限重探 30 秒) | 重探满 30 秒仍不通时,多为旧实例先起未继承环境变量 → 完全退出后重开客户端;若只是刚开机的数秒空窗期,重探即自愈 |
| 刚设完环境变量仍不通 | 桌面会话未刷新变量 | 注销并重新登录系统一次 |
exit 2 / phase=auth |
wb.account 不可用或返回空 |
客户端未登录 → 在客户端内重新登录一次 |
phase=api |
客户端未暴露 wb 接口 |
客户端版本过旧,或大版本升级改了内部接口名 → 用 CDP 重探 Object.keys(window.wb) |
phase=claim |
领取已下发但复查仍未签 | 稍后重试;连续多日则反馈接口异常 |
no page target |
客户端无可用渲染页 | 打开客户端主窗口后重试 |
| 在页面里裸 fetch 网页接口一律 401 | 网页 cookie 认证路由已关闭(2026-10 起) | 不要裸 fetch,改走 wb.account / wb.http(本技能 v1.0.3 起) |
| 旅行接口 404 | 域名或前缀写错 | 旅行接口经 wb.http 调用,路径不带 /v2 |
| 余额接口异常 | 前缀写错 | 余额接口经 wb.http 调用,路径不带 /v2(签到类才带 /v2) |
| 报出的余额比实际少了当日签到所得 | 余额查询早于签到 | 余额须在签到等写操作之后再查;本脚本 v1.0.1 起已修正(旧版把查询放在签到前,报到的是签到前的旧值) |
| 「今日派遣次数已用完」 | 服务端每日限额 | 正常,次日自动恢复 |
安全边界(须向使用者说明)
- CDP 端口只绑回环地址(
127.0.0.1),外网不可达。 - 但它允许本机任意进程驱动客户端(读页面、执行 JS)。这是官方为外部自动化预留的设计,
端口开启即等于放宽本机安全边界 —— 只在可信机器上开启。 - 随时收回:删除
WORKBUDDY_REMOTE_DEBUGGING_PORT环境变量并重启客户端即可。 - 本技能不读取、不写入、不外传任何登录态文件与令牌。
参考资料
- 接口口径、字段与错误码:@references/api-spec.md
- 一键建每日自动化的提示词模板:@templates/automation-prompt.md