把 WorkBuddy 每日签到搬上云端:10 分钟部署实操
WorkBuddy 有个「Buddy 加油站」,每天签到领积分、还能派猫猫出去旅行领积分。攒得不多,但天天要手动点一下很烦。
这个仓库把整套流程搬到了云端(CNB 的云原生构建)定时跑:每天 00:05(北京时间)自动签到 + 领积分 + 派猫猫旅行,电脑关机、客户端不开也能签。
- 云端只存明文 JWT,不需要账号密码;脚本纯标准库,零第三方依赖
- 每条流水线日志都会输出完整结果,方便你自己接通知
- 实测有效,部署一次之后基本不用管
下面是一份照着抄就能跑通的部署流程,含每一步的具体操作。
仓库地址
源码(建议直接 Fork):cnb.cool/holzwege.co…
Fork 之后就得到了你自己的「签到仓库」,下面所有操作都在你自己的仓库里进行。
你需要准备
| 项目 | 说明 |
|---|---|
| WorkBuddy 客户端 | Windows 版,部署当天需要开着并登录一次(用于导出登录态) |
| Python 3.8+ | 本机执行「生成密钥」命令时需要;云端已自带 python:3.12-slim,不用你操心 |
| CNB 账号 | cnb.cool,免费,用于托管代码和跑流水线 |
| Git(可选) | Fork 和本地跑命令会用到;不想装也可以全程在 CNB 网页端操作 |
部署:4 步
第 1 步:建两个仓库
- 打开上面的源码仓库,点右上角 Fork,把代码复制到你的账号下 —— 这就是你的签到仓库(建议设为 Private)。
- 再新建一个密钥仓库,用来单独存放登录凭据(与代码库隔离,务必 Private),名字随意,例如
workbuddy-checkin-secrets。
为什么是两个库?密钥是敏感凭据,单独放在一个私有库里,避免跟代码混在一起被误提交或误公开。
第 2 步:把密钥仓库接进来
在你自己的签到仓库根目录找到 .cnb.yml,把里面的 imports 地址改成你的密钥仓库(把下面的 <你的用户名> 换成你的 CNB 用户名):
imports:
- https://cnb.cool/<你的用户名>/workbuddy-checkin-secrets/-/blob/main/.cnb/workbuddy-secrets.yml
凭据只能经
imports从这里注入,所以密钥仓库这一步不能省。
第 3 步:本机生成密钥文件
在签到仓库目录下,且 WorkBuddy 客户端正在运行且已登录的状态下,打开 PowerShell 执行:
python tools/make_min_auth.py --out secrets.yml --slug auto
这一步会自动完成:读取本机登录态 → 解密(5.6.2+ 加密态也能自动处理)→ 导出明文 JWT → 生成一份可直接整份复制的密钥文件 secrets.yml。--slug auto 会用 git remote 自动填好仓库名,无需手改。
如果
--slug auto没生效(比如没有 git remote),就手动把产物里的<你的用户名>/<签到仓库名>替换成你的签到仓库。
生成的文件长这样(直接复制它即可):
allow_slugs:
- "<你的用户名>/<签到仓库名>"
allow_events:
- "crontab: 5 0 * * *"
WORKBUDDY_AUTH_JSON: "{"auth":{"accessToken":"eyJhbG...","domain":"www.codebuddy.cn"}}"
第 4 步:粘贴 + 首次运行
- 在密钥仓库里新建文件,路径填
.cnb/workbuddy-secrets.yml,把上一步secrets.yml的内容全选复制进去,提交 - 回到签到仓库的「代码构建」页,点「执行」,展开日志核对:
| 日志位置 | 期望看到 |
|---|---|
| 注入登录态 | 登录态字符数:N + 登录态剩余有效期:xx 天 |
| 签到 + 派猫猫旅行 | 领取成功 / 今日已签到 + 账户剩余积分 … |
看到 领取成功 / 今日已签到 即代表跑通。之后每天 00:05(北京时间)自动执行,无需任何操作。
日常维护
换 Token(约 55 天一次)
登录态是 JWT,实测有效期约 55 天。流水线每天打印剩余天数,不足 7 天会给 warning。到期前做三件事:
# 1. 打开并登录 WorkBuddy 客户端(保持运行)
# 2. 在签到仓库目录重新生成
python tools/make_min_auth.py --out secrets.yml --slug auto
# 3. 全选复制 → 覆盖密钥仓库的 .cnb/workbuddy-secrets.yml → 提交
第 1 步不能省:密钥只存在于运行中的客户端进程内存,关掉客户端就只能拿到密文。
改签到时间
- 改签到仓库
.cnb.yml里的"crontab: 5 0 * * *" - 推到
main - 重新生成一次密钥文件覆盖过去(
allow_events从.cnb.yml自动推导,不重新生成会校验失败)
常见问题速查
| 现象 | 原因 / 处理 |
|---|---|
本地报「解密 accessToken 失败」/ 定位不到 atRestSecretKey | 密钥只在运行中的客户端进程内存里。确认:客户端正在运行且已登录、与脚本同一 Windows 用户、是 Windows 平台 |
报 No module named 'six.moves' | 与本机 cryptography 装坏有关,不影响签到——脚本会自动降级。想根治:pip install -U six 或 pip install -U cryptography |
日志报 Secret 内容疑似被截断:只收到 81 字符 | 密钥值粘贴时被截断。删掉旧变量 → 重新生成整份 → 覆盖 |
allow_events 报 does not conform to allow_events | 密钥里的事件键与 .cnb.yml 不一致,改完签到时间要重新生成密钥文件 |
| 到点没跑 / 手动能跑定时不动 | 按序查:① allow_events 是否对齐 ② 配置是否在 main 分支 ③ cron 时区固定 Asia/Shanghai,直接写北京时间 |
.cnb.yml 删掉 docker.image: python:3.12-slim 后报错 | 不能删,CNB 默认构建环境不含 python3 |
关于通知
本项目不内置推送配置——脚本每次运行会输出完整的结果 JSON 并写入 checkin.log,你可以据此自行接入任意通知渠道。不希望产生任何通知副作用时加 --no-notify。
小结
整个部署的核心就一句:Fork 仓库 → 建个密钥仓库 → 一条命令导出密钥 → 粘进私有密钥仓库 → 点一次执行。 剩下的换 Token、改时间也都是「跑命令 → 覆盖提交」两步。
仓库纯标准库、零依赖;登录态在本机解密后才导出,云端拿不到任何密钥。如果你也想把每天那一下手动签到省掉,照着上面的步骤走一遍即可。
仓库地址再贴一次:cnb.cool/holzwege.co…。