作者:一闲人(和 AI 一起折腾出来的)
适用版本:WorkBuddy 桌面端 v5.3.14(Windows)
阅读时长:约 8 分钟
我一闲人,平时用 WorkBuddy 做两件事:一是盯 A 股 ETF 的每日复盘,二是处理一些办公文档。
用着用着就发现一个糟心事:积分跑得比我想象的快。
去查了一圈才知道,WorkBuddy 的「Buddy 加油站」每天能免费领 100 积分,连续签到第 7 天还有 1000 积分的大奖。听起来很香,但有个致命问题——
必须手动点,不点就断签,断签连续天数直接归零。
我当时已经连签十几天了。有一次忘了,前面攒的全白费。那种感觉,就像养了十几天的电子宠物一夜回到解放前。
于是我跟 AI 说了这么一句话:
「我要你每天帮我领积分,这是日常性的工作,由你来做。」
然后我们真把它做出来了。这篇文章就是完整过程,从踩坑到跑通,每一步都有代码。
我和 AI 前后试了三种方案,前两种都失败了。把失败过程写出来,是不想你再走一遍弯路。
这是最直觉的想法,也是网上不少教程推荐的做法。
问题:这叫提醒,不叫自动化。 我还是要记得打开电脑、记得点那一下。某天出门办事,照样断签。
AI 给我写了个 Python 脚本,用 uiautomation 库去找 WorkBuddy 窗口、定位左下角头像、点击展开菜单、再找「领取」按钮。
脚本确实能跑,我一度以为成了。结果实测发现一个坑:
侧栏里「Buddy 加油站」那个按钮,右边还粘着「去邀约」的跳转区域。 整个区域是一个大的 ButtonControl,名字里同时含着「Buddy 加油站」「签到领积分」「去邀约」「最高得 650 积分/人」。脚本点中心位置,弹出的不是签到页,是邀请好友的浏览器页面。
我改成点左边 25% 的位置,还是跳邀请页。
结论:客户端 UI 自动化这条路不稳定,版本一改就废,还容易误点。放弃。
这是最终跑通的方案。核心认知是:
签到这件事,本质上就是一次带登录态的 HTTP 请求。
只要能从本机拿到登录凭证,就能用脚本完成签到,不碰界面、不依赖窗口、不怕版本更新。
WorkBuddy 登录之后,会把登录信息以明文 JSON 存在本机:
%LOCALAPPDATA%\CodeBuddyExtension\Data\Public\auth\workbuddy-desktop.info也就是类似:
C:\Users\你的用户名\AppData\Local\CodeBuddyExtension\Data\Public\auth\workbuddy-desktop.info用记事本打开,能看到 accessToken、uid、nickname 这些字段。
⚠️ 安全提醒(本文最重要的一段):accessToken 等同于你的登录密码,千万不要发给别人、不要提交到公开仓库、不要贴到群里、不要写进要发布的文章里。
这里有个很多人会踩的坑:以为"只露前 15 位、后 8 位"就叫脱敏,其实尾部 8 位同样是真实字符,照样算泄露。我第一版脚本就是这么写的,后来才发现。
正确做法是:一个真实字符都不输出,只打印"已加载(内容已隐藏)"。下面脚本就是这么做的。
用途 | 方法 | 地址 |
|---|---|---|
查今天签了没 | POST |
|
执行签到 | POST |
|
请求头需要两个:
Authorization: Bearer <accessToken>
X-User-Id: <uid>这里有个坑我踩了半小时:网上有些教程写的域名是 copilot.tencent.com,我实测那个域名下的签到接口返回 404。当前可用的是 www.codebuddy.cn。如果你照着老教程做,八成会卡在这里。
下面这段脚本只用了 Python 标准库,不用 pip 装任何东西,复制保存成 每日签到.py 就能跑。
# -*- coding: utf-8 -*-
"""
WorkBuddy 每日自动签到(API 直签版)
不点界面,直接读本地登录态调官方接口
"""
import json
import os
import sys
import time
import urllib.error
import urllib.request
AUTH_FILE = os.path.join(
os.environ.get("LOCALAPPDATA", os.path.expanduser("~") + "\\AppData\\Local"),
"CodeBuddyExtension", "Data", "Public", "auth", "workbuddy-desktop.info"
)
STATUS_URL = "https://www.codebuddy.cn/v2/billing/meter/checkin-activity-status"
CHECKIN_URL = "https://www.codebuddy.cn/v2/billing/meter/daily-checkin"
def mask_token(t):
"""安全脱敏:一个真实字符都不输出。
注意:不要写成 t[:15] + "..." + t[-8:],
尾部 8 位同样是真实 token 字符,属于泄露。
"""
if not t or len(t) < 20:
return "(无)"
return "已加载(内容已隐藏)"
def load_auth():
if not os.path.exists(AUTH_FILE):
return None, "找不到登录态文件:%s" % AUTH_FILE
try:
data = json.load(open(AUTH_FILE, encoding="utf-8"))
except Exception as e:
return None, "登录态文件解析失败:%s" % e
tok = data.get("auth", {}).get("accessToken")
uid = data.get("account", {}).get("uid")
if not tok:
return None, "登录态文件里没有 accessToken"
if not uid:
return None, "登录态文件里没有 uid"
# 留出 5 分钟余量判断是否过期
expires = data.get("auth", {}).get("expiresAt", 0)
if expires and expires < (time.time() * 1000 + 5 * 60 * 1000):
return None, "accessToken 快过期或已过期,请先打开一次 WorkBuddy 刷新登录态"
return {"token": tok, "uid": uid,
"nickname": data.get("account", {}).get("nickname", "")}, None
def api_post(url, token, uid):
req = urllib.request.Request(
url,
method="POST",
data=b"{}",
headers={
"Authorization": "Bearer " + token,
"X-User-Id": uid,
"Content-Type": "application/json",
"Accept": "application/json",
},
)
try:
r = urllib.request.urlopen(req, timeout=20)
return r.status, json.loads(r.read().decode("utf-8"))
except urllib.error.HTTPError as e:
body = e.read().decode("utf-8", errors="ignore")
try:
return e.code, json.loads(body)
except Exception:
return e.code, {"msg": body[:200]}
except Exception as e:
return -1, {"msg": str(e)}
def main():
print("WorkBuddy 每日签到 %s" % time.strftime("%Y-%m-%d %H:%M:%S"))
auth, err = load_auth()
if err:
print("❌ %s" % err)
return 3
print("用户:%s token:%s" % (
auth["nickname"] or auth["uid"][:8], mask_token(auth["token"])))
# 1. 查状态
status, resp = api_post(STATUS_URL, auth["token"], auth["uid"])
if status != 200 or resp.get("code") != 0:
print("❌ 查询签到状态失败:HTTP %d / %s" % (status, resp.get("msg", resp)))
return 4
d = resp.get("data", {})
active = d.get("active", False)
today_done = d.get("today_checked_in", False)
streak = d.get("streak_days", 0)
daily = d.get("daily_credit", 0)
today_got = d.get("today_credit", 0)
theme = d.get("theme_name", "") or d.get("activity_name", "")
if not active:
print("ℹ️ 当前没有进行中的签到活动,无需领取。")
return 0
print("活动:%s 每日 %d 积分 连签 %d 天" % (theme or "Buddy加油站", daily, streak))
if today_done:
print("✅ 今天已经签到过了,获得 %d 积分,明天再来。" % today_got)
return 0
# 2. 执行签到
print("🔔 今天还没签,正在领取...")
status2, resp2 = api_post(CHECKIN_URL, auth["token"], auth["uid"])
code2 = resp2.get("code")
msg2 = resp2.get("msg", "")
if status2 == 200 and code2 == 0:
status, resp = api_post(STATUS_URL, auth["token"], auth["uid"])
if status == 200 and resp.get("code") == 0:
today_got = resp.get("data", {}).get("today_credit", today_got)
streak = resp.get("data", {}).get("streak_days", streak)
print("✅ 签到成功,获得 %d 积分,当前连签 %d 天。" % (today_got, streak))
return 0
elif code2 == 10001:
print("✅ 今天已经签到过了(%s),明天再来。" % msg2)
return 0
else:
print("❌ 签到失败:HTTP %d / code=%s / %s" % (status2, code2, msg2))
return 5
if __name__ == "__main__":
sys.exit(main())先手动跑一次验证:
WorkBuddy 每日签到 2026-08-31 10:38:19
用户:你的昵称 token:已加载(内容已隐藏)
活动:Buddy加油站 每日 100 积分 连签 N 天
✅ 今天已经签到过了,获得 100 积分,明天再来。看到这一行,说明接口通了。
这一步最简单,用一句话就行。在 WorkBuddy 对话框里说:
每天早上 9:10 帮我运行 每日签到.py 完成 WorkBuddy 自动签到,把结果用一两行中文告诉我。状态成功就报积分和连签天数,失败就把错误原样告诉我。
WorkBuddy 会自动创建定时任务,到点自己跑,跑完给你报告。
如果今天已经签过,再调 daily-checkin 会返回:
{"code":10001,"msg":"今天已签到,请明天再来"}注意它返回的是 HTTP 400,不是 200。 所以脚本里不能只看 HTTP 状态码,要判断 code 字段——code=0 是成功,code=10001 是已签到,这两种都算正常。
我还加了个晚间二次确认的定时任务(每天 20:00):如果早上漏了,晚上补上。因为幂等,重复跑零风险。
定时任务依赖本机,电脑关机或 WorkBuddy 没启动,任务就跑不了。
我的应对是设两个时间点:早上 9:10 主打卡,晚上 20:00 补漏。只要电脑在任意一个时间点开着,就不会断签。
赚积分是一方面,省积分其实更关键。同一个需求,用不同模型,消耗差十倍。
我从本机 WorkBuddy 的配置缓存里读出了真实的积分倍率表:
模型 | 倍率 | 说明 |
|---|---|---|
Hy4 preview | x0.00 | 完全免费 |
Hy3 | x0.00 | 完全免费 |
GLM-5.3-Flash | x0.06 | 最便宜的付费档 |
GLM-4.6V | x0.11 | |
Deepseek-V4-Flash | x0.17 | |
快速 / 均衡 / 极致 | x0.21 / x0.65 / x1.20 | |
GLM 系列 | x0.79 | |
Kimi-K3 | x1.62 | 最贵,慎用 |
日常问答用 x0.00 的免费模型,一分不花。 只有复杂任务才切高倍率模型。
另外还有个错峰技巧:每晚 23:00 到次日 8:00,GLM 系列打 5 折。不急的活儿留到晚上跑,直接省一半。
以我现在这套配置:
项目 | 月收益 |
|---|---|
每日签到 | 3000 - 4000 积分 |
每月免费额度 | 500 积分 |
省下的(用免费模型 + 错峰) | 按使用量,通常能省 30% 以上 |
对轻度到中度使用来说,基本不用再花钱买套餐。
更重要的是——我不用再记着这件事了。连签天数从我接手那天起,再没断过。
坑 | 现象 | 解法 |
|---|---|---|
域名写错 | 接口返回 404 | 用 |
请求方法写错 | GET 返回 404 | 两个接口都是 POST |
只判断 HTTP 状态码 | 已签到被误报为失败 | 要判断 |
UI 自动化点歪 | 弹出邀请页 | 放弃 UI 方案,改用 API |
token 过期 | 报「找不到登录态」 | 手动打开一次 WorkBuddy 即自动刷新 |
电脑关机 | 定时任务不执行 | 设早晚两个时间点兜底 |
本人电脑水平一般,这次能跑通,靠的不是技术底子,是把需求说清楚,然后让 AI 去试错。
我从头到尾只说了三句话:
剩下所有的事——查配置、找接口、试 UI 自动化、失败、换方案、写脚本、挂定时任务——全是 AI 干的。
所以如果你也想省下这笔积分钱,别去学 Python,先学会把需求说清楚。
#WorkBuddy#
本文所有接口、截图、脚本均经本人实测,环境为 Windows + WorkBuddy v5.3.14。如后续版本接口有变,以官方为准。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。