WorkBuddy积分加油站
自动领取 WorkBuddy「Buddy 加油站」每日签到积分,并跑通派猫猫旅行奖励。
脚本:scripts/wb_points.py。零第三方依赖,跨平台,输出单行 JSON,退出码 0 成功 / 1 失败。
通道设计
「通道」是本技能的一等公民:不赌某一种实现,握手或首个请求失败即换下一条。
| 通道 | 原理 | 是否接触凭据 | 适用 |
|---|---|---|---|
wbipc-module |
客户端内置 workbuddy_ipc 模块,走官方宿主通道 |
否 | 首选,客户端 5.6.2+ |
wbipc-raw |
按官方 wbipc 协议完成握手,读客户端开放的本机 IPC 端点 ~/.workbuddy/wbipc/endpoint.json |
否 | 内置模块路径找不到时的兜底 |
longtoken |
长效令牌自续期,客户端不开也能签 | 仅用户本人录入的那一条 | 无头 / 客户端不常开 |
前两条通道里,请求由客户端完成签名,脚本进程内完全拿不到 token。
安全边界
- 登录态文件只读,绝不修改、绝不删除;不向任何地址外传凭据。
- 长效令牌只由用户本人录入(
--save-token/--save-token-file),或由
--sync-token从用户自己已登录的客户端同步(见「5.6.2+ 加密登录态兼容」)。 --export-token*只导出本人此前自行录入的那一条令牌,供换机迁移用。- 静态加密密钥仅在内存中参与派生校验,绝不写盘、绝不打印。
- 开机自启补签只在用户显式执行
--setup/--install-autostart时注册,不做隐式安装。 - 输出与日志中的 token 一律脱敏(
eyJhbG...xxxx),绝不回显完整值。 - 除签到、派遣与令牌刷新接口外,不访问其它地址;不引入任何第三方依赖。
5.6.2+ 加密登录态兼容
客户端 5.6.2 起对登录态启用静态加密。本技能与客户端保持兼容:在用户已登录的客户端上
可一键同步长效令牌(refresh token),录入后客户端不运行时也能继续签到。
python scripts/wb_points.py --sync-token # 同步并落盘(只读,不联网、不触发轮换)
python scripts/wb_points.py --setup --sync-token # 同步 + 注册开机补签,一步到位
- 令牌来源:用户本机客户端的登录态文件,只读。
- 密钥来源:静态加密密钥由客户端在运行时提供,按多级策略定位——
环境变量(客户端约定的名称)WORKBUDDY_ATREST_KEY/WORKBUDDY_ATREST_KEY_FILE
→ 本机以当前用户身份加密保存的密钥块 → 运行中的客户端(仅 Windows,且需与本脚本同一用户)。
客户端提权运行而本脚本未提权时会被系统拒绝,属预期。 - 默认不联网:只在本地完成解封,不触发令牌轮换,因此不会打断客户端当前登录态。
需要联网确认有效性时加--sync-token-verify(会触发轮换,等于消耗掉客户端持有的
那一份,客户端下次刷新可能需重新登录,慎用于日常)。 - 其它平台:macOS / Linux 标准安装下客户端受系统完整性保护,没有上述途径,
请改用--save-token-file手动录入。 - 令牌平时由本技能自动续期,正常不会过期。
> AES-256-GCM 为纯标准库实现(已用 FIPS-197 与 NIST GCM 向量自测),零第三方依赖。
> 若客户端大版本调整了登录态格式,同步会失败并如实报错——此时退回 --save-token 即可。
用法
python scripts/wb_points.py # 签到 + 派猫猫旅行(默认完整闭环)
python scripts/wb_points.py --check-only # 只读查询(不领取、不派遣)
python scripts/wb_points.py --no-travel # 只签到
python scripts/wb_points.py --travel-only # 只跑旅行闭环
python scripts/wb_points.py --location 3 # 指定派遣地点 1-4(缺省随机)
python scripts/wb_points.py --diagnose # 环境自检:逐通道探测并报可用性
python scripts/wb_points.py --channel wbipc-raw # 强制指定通道
python scripts/wb_points.py --retries 5 # 请求重试次数(默认 3)
python scripts/wb_points.py --no-lock # 跳过并发守卫
python scripts/wb_points.py --pretty # 缩进输出
python scripts/wb_points.py --version # 打印版本
# 开机补签(显式注册,可先预览)
python scripts/wb_points.py --setup # 注册开机补签 + 写入默认配置
python scripts/wb_points.py --setup --save-token-file <令牌文件> # 同时录入长效令牌
python scripts/wb_points.py --setup --dry-run # 仅预览将写入的自启文件,不落盘
python scripts/wb_points.py --install-autostart # 只注册开机补签
python scripts/wb_points.py --uninstall-autostart # 撤销开机补签
python scripts/wb_points.py --autostart-status
# 长效令牌(免客户端签到)
python scripts/wb_points.py --sync-token # 从已登录的客户端同步(只读,默认不联网)
python scripts/wb_points.py --sync-token --sync-token-verify # 同上 + 联网确认(会触发轮换,慎用于日常)
python scripts/wb_points.py --save-token <refresh_token> # 录入(先验证后落盘)
python scripts/wb_points.py --save-token-file <path> # 从文件录入(明文不经命令行)
python scripts/wb_points.py --token-status # 查看配置(脱敏)
python scripts/wb_points.py --forget-token # 删除本机令牌
python scripts/wb_points.py --export-token-file <path> # 换机迁移:导出本人录入的令牌到文件
python scripts/wb_points.py --export-token # 换机迁移:导出本人录入的令牌到 stdout
# 推送
python scripts/wb_points.py --notify # 本次结果推送(桌面通知 + 已配置渠道)
Windows 上建议用托管 Python 绝对路径:
C:\Users\<你>\.workbuddy\binaries\python\versions\3.13.12\python.exe
输出字段
{"status":"ok","channel":"wbipc-module","action":"clicked|skip_already_signed|skip_check_only|inactive|skip_concurrent",
"balance":200,"streak_days":2,"credit_gained":100,
"travel":{"state":"traveling","state_text":"旅行中","location_name":"咖啡馆",
"reward_credit":9,"remaining_min":59,"log":[]},
"msg":"签到成功 +100 积分,当前余额 300","channel_fallbacks":{...},"notify":{...}}
channel_fallbacks 出现在发生降级时,记录被跳过的通道及原因。
最近一次结果同时写入 logs/last_result.json,运行日志追加到 logs/wb_points.log。
稳定性设计
- 通道级降级:任一通道握手或首个请求失败,自动换下一条。
- 请求级重试:网络异常 / 429 / 5xx 指数退避(默认 3 次,
--retries可调)。 - 接口路径 / 域名主备降级:每个接口留一条备用路径,另备域名
www.codebuddy.cn
自动降级;首次命中即缓存,后续请求复用。 - 领取后二次复核:领取成功后再查一次状态确认
today_checked_in=true,
杜绝「接口返回成功但实际没签上」的假成功。 - 幂等:
today_checked_in=true或code=10001(今日已签)一律跳过,绝不重复领取。 - 派遣请求体按实测确认:
POST /activity/growth/buddy/travel/depart必须带
{"location_id": 1-4};发空 body 服务端返回400 invalid request。 - 旅行与主流程隔离:旅行任何异常都不改变签到结论。
- 并发守卫:5 分钟内的重复触发自动跳过,避免开机自启与定时任务撞车(
--no-lock可关)。 - 凭据脱敏:任何输出与日志都不回显完整 token。
- 超时可控:握手 15s、单次请求 45s,卡住不会挂死。
- 开机补签:开机 45 秒后自动跑一次,覆盖「定时任务到点时电脑没开」的场景。
- 失败必达:
--notify或失败时自动推送,不会漏签了还不知道。 - 录令牌前实测验证:
--save-token先打一次刷新接口,服务端认可才落盘,
并按token format error/unmarshal claims分类给出可操作的重取指引。
长效令牌(客户端不开也能签)
长效令牌就是账号的 refresh token,录入(或从已登录的客户端同步)一次后本技能可自行续期,
无需客户端运行。
> 装有并运行 WorkBuddy 客户端的机器通常不需要它——wbipc-module / wbipc-raw
> 两条通道会自动工作。长效令牌是「客户端完全不开 / 无头环境」的兜底。
获取与录入
① 从已登录的客户端同步(推荐,一次搞定)
python scripts/wb_points.py --sync-token
只读本机登录态 → 解开 5.6.2+ 加密字段 → 落盘,全程自动、纯只读、不触发令牌轮换。
详见「5.6.2+ 加密登录态兼容」。
② 手动录入 / 换机迁移
python scripts/wb_points.py --save-token-file <令牌文件路径> # 明文不经过命令行
python scripts/wb_points.py --save-token "<refresh_token>" # 直接录入
也可以在注册开机补签时一步完成:
python scripts/wb_points.py --setup --save-token-file <令牌文件路径>
> 临时明文文件请在录入后立即删除,避免泄露。
录入即验证
--save-token 会先真打一次刷新接口,服务端认可才落盘;不认可就原样退回并说明原因,
不会把一条永远失败的令牌存进本机:
{"status":"error","action":"token_rejected","code":12153,
"msg":"12153:refresh token failed:10000:token format error",
"hint":"服务端判定「格式不对」。长效令牌必须是 eyJ 开头的三段式 JWT;…"}
记录在案的错误码:10000 token format error(不是 JWT)/
unmarshal token to claims failed(是 JWT 但已过期或吊销)。
离线录入可加 --no-verify 跳过验证。
录入后
python scripts/wb_points.py --token-status # 确认已配置(脱敏显示)
python scripts/wb_points.py --channel longtoken --check-only # 单独验证该通道能否查询
- 存储:Windows 用 DPAPI 以当前用户身份加密(
~/.workbuddy/wb_points_token.bin),
其它平台 0600 权限并在--token-status里标注encryption: plain-0600。 - 续期:
POST https://copilot.tencent.com/v2/plugin/auth/token/refresh,
头X-Refresh-Token/X-Auth-Refresh-Source: plugin/X-Domain: copilot.tencent.com;
刷新回来的新令牌自动回写轮换。 - 撤销:
--forget-token删除本机令牌。 - longtoken 排在通道序列首位(纯 HTTPS、不依赖客户端,客户端未启动也能签);wbipc-module / wbipc-raw 作为客户端在线时的补充路径。
跨机器迁移
长效令牌的存储文件(DPAPI / 0600)与机器和用户绑定,不能整文件拷贝到别的机器——
换机器后无法解密。但其中包裹的 refresh token 本身是账号绑定、可跨机器的,
因此迁移做法是导出 → 可信渠道转移 → 在目标机器重新录入:
# 源机器:导出本人此前录入的令牌(属凭据,谨慎处理)
python scripts/wb_points.py --export-token-file token_export.txt
# → 用可信渠道带到目标机器,录入后立即删除该文件
# 目标机器:重新录入,本地重新加密
python scripts/wb_points.py --save-token-file token_export.txt
python scripts/wb_points.py --channel longtoken --check-only # 验证可用
消息推送
配置文件 ~/.workbuddy/wb_points_notify.json,只写你要用的渠道:
{
"desktop": true,
"always_notify": false,
"notify_on_error": true,
"wecom": {"webhook": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx"},
"dingtalk": {"webhook": "https://oapi.dingtalk.com/robot/send?access_token=xxx", "secret": ""},
"feishu": {"webhook": "https://open.feishu.cn/open-apis/bot/v2/hook/xxx", "secret": ""},
"bark": {"server": "https://api.day.app", "device_key": "xxx"},
"telegram": {"bot_token": "xxx", "chat_id": "xxx"},
"serverchan": {"key": "xxx"},
"pushplus": {"token": "xxx"},
"slack": {"webhook": "https://hooks.slack.com/services/xxx"},
"generic": {"url": "https://your/hook", "method": "POST",
"headers": {"Authorization": "Bearer xxx"},
"payload": {"title": "{{title}}", "text": "{{content}}"}}
}
- 桌面通知:Windows Toast / macOS
osascript/ Linuxnotify-send。 - 推送时机:
--notify强制推;always_notify: true每次推;
notify_on_error: true(默认)失败即推——即使没配任何渠道也会弹桌面通知。 - 全部 best-effort,推送失败只记在返回里,不影响签到与退出码。
开机自启补签
由用户显式注册(不做隐式安装),各平台均无需管理员权限:
| 平台 | 位置 |
|---|---|
| Windows | %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\wb-points-pro.vbs(pythonw 静默 + 延迟 45s) |
| macOS | ~/Library/LaunchAgents/com.wbpoints.pro.plist(RunAtLoad) |
| Linux | ~/.config/autostart/wb-points-pro.desktop |
先 --dry-run 预览内容再安装;--uninstall-autostart 完全撤销。
注册后每天开机 45 秒自动跑一次完整闭环(签到 + 派猫猫旅行)。
排错
| 现象 | 原因 / 处理 |
|---|---|
| 三通道全不可用 | 客户端未登录或已退出;先在客户端登录,再跑 --diagnose |
longtoken 报"未配置长效令牌" |
还没录入,见「长效令牌」章节 |
| 长效令牌某天突然失效 | 客户端大版本更新可能改变了登录态格式。重新 --sync-token 一次即可(令牌平时会自动续期,正常不会过期) |
--sync-token 提示未能取得 静态加密密钥 |
客户端未启动/未登录,或客户端与本脚本不在同一 Windows 用户下(客户端提权运行时会被系统拒绝)。启动并登录后重试;macOS / Linux 请改用 --save-token-file 手动录入 |
刷新返回 code=12153 |
refresh token 无效或格式不对,请重新同步或重新确认录入内容 |
10000:token format error |
录进来的不是 JWT。常见误取:requestId(36 字符 UUID,是响应里的追踪编号不是凭据)、localStorage 的加密串、长 base64 密文、时间戳\|hex\|\|hex 缓存条目 |
领取返回 HTTP 400 + code=10001 |
正常:「今天已签到」就是这个返回(不是 200)。按 code 判定,不会误报失败 |
already traveling |
Buddy 正在旅行,到达后下次运行自动补领,官方无召回接口 |
| "今日派遣次数已用完" | 服务端每日限额,次日恢复,不是故障 |
action: skip_concurrent |
5 分钟内已跑过,正常跳过(防并发);需强跑加 --no-lock |
| 旅行接口 404 | 域名必须是 www.workbuddy.cn 且路径不带 /v2(脚本已按此写死,并带主备路径) |
| 签到接口 404 | 内置主域名 www.workbuddy.cn,另备 www.codebuddy.cn 自动降级 |
| 开机弹「Microsoft VBScript compiler error / 语句未结束」 | 旧版开机补签 .vbs 含中文注释,WSH 按本机 ANSI 代码页(GBK)解析 UTF-8 字节导致错解。v1.6.8 起已修复:自启脚本只写英文 ASCII 注释,并用 Chr(34) 拼引号规避转义歧义;若路径含非 ASCII(如中文用户名)则自动以 UTF-16LE(BOM) 落盘,WSH 原生可读。重跑 --install-autostart 即可消除弹窗 |
| 开机后弹 PowerShell 窗口提示「签到失败 / 积分领取失败」 | 旧版开机补签脚本没强制通道,默认顺序先试客户端相关的 wbipc 通道;客户端还没起来时命名管道打不开(无法打开命名管道),失败触发错误桌面通知,顺带闪出 PowerShell 控制台。v1.6.9 起已修复:开机补签在所有平台都强制 --channel longtoken(纯 HTTPS、不依赖客户端),并把默认通道顺序改为 longtoken 优先;同时通知改用 -WindowStyle Hidden,即使真出错也不会再闪 PowerShell 窗口。重跑 --install-autostart 并确认 .vbs 命令行含 --channel longtoken 即可 |
开机早于 WorkBuddy 启动仍整体失败 / open_channel 抛未捕获异常 |
v1.6.10 加固:① 通知的 powershell 子进程加 CREATE_NO_WINDOW,彻底消除控制台闪窗;② open_channel() / diagnose() 把通道构造 ch = cls() 移入 try,冷启动读不到 endpoint.json 只会被捕获并降级到 longtoken,不再冲出循环导致崩溃。已用「WORKBUDDY_CONFIG_DIR 指向空目录」模拟冷启动严格复测通过 |