# workbuddy-credit **Repository Path**: joinjold/workbuddy-credit ## Basic Information - **Project Name**: workbuddy-credit - **Description**: 常驻桌面的悬浮小窗,实时显示 WorkBuddy 剩余积分与今日签到、喵喵旅行状态;可选自动签到、自动派喵喵并领取奖励。C++ 编写,单文件绿色免安装,凭据本机加密存储。 - **Primary Language**: C++ - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2026-10-19 - **Last Updated**: 2026-10-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # WorkbuddyCredit [![stars](https://gitee.com/bruceliu998/workbuddy-credit/badge/star.svg?theme=dark)](https://gitee.com/bruceliu998/workbuddy-credit/stargazers) [![forks](https://gitee.com/bruceliu998/workbuddy-credit/badge/fork.svg?theme=dark)](https://gitee.com/bruceliu998/workbuddy-credit/members) [![license](https://img.shields.io/badge/license-MIT-3DA639.svg)](LICENSE) [![platform](https://img.shields.io/badge/platform-Windows%2010%20%7C%2011-0078D6.svg)](#系统要求) [![C++](https://img.shields.io/badge/C%2B%2B-17-00599C.svg)](#构建) **把 WorkBuddy 的积分和每日任务挂在桌面上** —— 一个半透明、置顶、不打扰的 Windows 悬浮小窗。 [![Download](https://img.shields.io/badge/Download-latest-2ea44f?style=for-the-badge&logo=windows&logoColor=white)](https://gitee.com/bruceliu998/workbuddy-credit/releases/latest) **[下载最新版(zip,约 500 KB)](https://gitee.com/bruceliu998/workbuddy-credit/releases/latest)** · [全部版本](https://gitee.com/bruceliu998/workbuddy-credit/releases) · [使用说明](#快速开始) · [常见问题](#常见问题) · [反馈问题](https://gitee.com/bruceliu998/workbuddy-credit/issues/new) > Windows 10 / 11(64 位)· 绿色免安装 · 解压即用,无需 .NET 或 VC++ 运行库 ![面板](docs/panel.png) C++17 + Win32 + Dear ImGui 写成,单文件 exe。 ## 特性 - **一目了然的余额**:超大数字 + 进度条,还有「燃烧进度 vs 时间进度」对照,今天花快了还是省着用,看颜色就知道([怎么看](#燃烧进度对比)) - **每日任务状态**:右上角两行显示签到与喵喵旅行,圆点判色(绿=完成、黄=待办、蓝=进行中、红=失败),详见[界面说明](#面板) - **可选自动化**:每天自动签到(+100 分)、自动派喵喵出门、回来自动领奖励;完成后在右下角弹提示([怎么配](#自动化)、[长什么样](#完成提示)) - **凭据只粘一次**:从浏览器复制一段 cURL 即可,网址、请求头、HttpOnly Cookie 全部自动解析([获取步骤](#获取-curl)) - **凭据本机加密**:Windows DPAPI + 程序内置的额外熵,配置文件被拷走也解不开([安全细节](#凭据与安全)) - **绿色无痕**:单文件、不写注册表、不留缓存,全部数据只落在 `%LOCALAPPDATA%` 的一个 json 里([存放位置](#数据存放与绿色运行)) - **不打扰**:置顶但不抢焦点,鼠标移开自动变淡,托盘双击显隐([操作方式](#界面与操作)) ## 系统要求 | 项 | 要求 | |---|---| | 系统 | Windows 10 / 11(64 位) | | 运行 | **无需安装**,双击 exe 即可;不依赖 .NET、不依赖 VC++ 运行库 | | 图形 | 系统自带的 DirectX 11(Win10/11 均内置) | | 磁盘 | exe 约 1 MB,配置文件几十 KB | | 网络 | 能正常访问 `workbuddy.cn` 即可 | ## 快速开始 1. 浏览器登录 [workbuddy.cn](https://www.workbuddy.cn/),确认右上角是你的头像(已登录); 2. 按 `F12` 打开开发者工具 → 网络面板,复制一条积分请求的 **cURL**([详细步骤见下节](#获取-curl)); 3. 程序设置 → 「录入凭证」→ 粘贴 → 「测试」→ 通过后「保存」。 完成后面板就会显示余额,之后按设定间隔自动刷新。 > ⚠️ **必须复制 cURL,不要只复制 Cookie。** > 手动复制 Cookie 一定会得到 401 —— 关键的会话 Cookie 带 `HttpOnly` 标记,浏览器不允许脚本读取, > 也不出现在「Application → Cookies」以外的普通复制路径里;而且很容易误复制成第三方统计请求。 ## 获取 cURL 这一步是唯一需要手动操作的地方,做一次就行(Cookie 过期后重做一次)。下面以 Chrome / Edge 为例, Firefox 的差异在最后单独说。 程序之所以要 cURL,是因为它需要**完整复刻你浏览器发出的那条请求**——包括网址、请求方法、 十几个请求头(`x-client-platform`、`referer`、`user-agent` 等)以及全部 Cookie。 只给 Cookie 是复刻不出来的,服务端会判定为非浏览器请求。 ### 第 1 步:登录并打开开发者工具 1. 用 Chrome / Edge 打开 ,**确认已登录**(右上角显示头像或昵称); 2. 按 `F12`(或 `Ctrl` + `Shift` + `I`)打开开发者工具; 3. 切到顶部的 **「网络 / Network」** 标签。 > 如果面板是空的,按 `F5` 刷新一次页面,请求会重新出现。 ### 第 2 步:让页面发出一次积分请求 两种方式,任选一种: **方式 A(推荐):筛选 + 刷新** 1. 在「筛选 / Filter」输入框里输入 `resource`; 2. 按 `F5` 刷新页面; 3. 列表里会出现一条名字类似 `get-user-resource-summary` 的请求。 **方式 B:直接在控制台触发** 如果列表里一直找不到,切到 **「控制台 / Console」** 标签,粘贴下面这行并回车: ```js fetch('/billing/meter/get-user-resource-summary',{method:'POST',headers:{'Content-Type':'application/json'},body:'{}'}) ``` 执行后回到网络面板,会立刻多出一条同名请求。 ### 第 3 步:确认是正确的那一条 点一下这条请求,在右侧检查三项: | 检查项 | 应该是 | |---|---| | 请求地址(Headers → Request URL) | 含 `/billing/meter/get-user-resource-summary` | | 状态(Status) | **200**(绿色) | | 响应(Response / Preview) | 能看到剩余积分、总量之类的数字 | **不要选**这几种: - 状态 `304`(走缓存了)—— 勾上「停用缓存 / Disable cache」再刷新; - 状态 `401` / `403` —— 说明没登录或登录已过期,重新登录后再来; - 名字相近的其它接口,比如 `get-user-resource-paid-packages`(那是套餐包,不是余额)。 ### 第 4 步:复制为 cURL 在这一条请求上**右键** → 「**复制 / Copy**」→ 「**以 cURL 格式复制 / Copy as cURL**」(选 `bash` 那个)。 浏览器可能给出多个变体,注意区分: | 菜单项 | 能否用 | |---|---| | Copy as cURL (bash) | ✅ **推荐**,格式最标准 | | Copy as cURL (cmd) | ⚠️ 一般也能解析,失败就换 bash 版 | | Copy as fetch / Copy as PowerShell | ❌ 解析不了,别选 | Firefox:右键 → 「**复制 / Copy**」→ 「**以 cURL 复制 / Copy as cURL**」,只有一种。 ### 第 5 步:粘贴到程序里 1. 打开程序设置(面板右上角齿轮); 2. 点 **「录入凭证」**,框会清空并变成可编辑(按钮此时显示「取消录入」); 3. `Ctrl` + `V` 粘贴(框里支持 `Ctrl` + `A` 全选,方便整段覆盖); 4. 点 **「测试」**,右侧出现 **`连通 · 剩余 xxx · 总量 xxx`** 说明这条 cURL 可用; 5. 点 **「保存」**,面板立刻用新凭据刷新一次。 ### 复制出来是什么样子 正常情况下,粘贴进去的内容长这样(为了方便阅读加了换行,实际是一整段): ``` curl 'https://www.workbuddy.cn/billing/meter/get-user-resource-summary' \ -H 'accept: application/json' \ -H 'content-type: application/json' \ -H 'user-agent: Mozilla/5.0 ...' \ ... 十几个请求头 ... -b 'gcl_au=...; session=...; session_2=...' \ --data-raw '{}' ``` 程序会自动做这些事,你不需要改动它: - 从网址里解析出**主机**与**接口路径**; - 取走**全部请求头**,但剔除 `Host`、`Content-Length` 这类会冲突的头; - 从 `-b`(或 `-H 'cookie: ...'`)里取出 **Cookie**,自动去重、补空格; - 识别请求方法(`-X POST`)与请求体(`--data-raw`)。 ### 常见问题 **测试提示「失败:HTTP 401」** 登录态不对。可能原因是:没登录 / 登录已过期 / 复制到的是其它站点的请求。 重新登录后按上面步骤再来一次,注意状态必须是 200。 **测试提示「失败:…(其它原因)」** 多半是复制成了 `Copy as fetch` 或 `Copy as PowerShell`,或者只复制了网址。 重新右键,确认选的是 **cURL (bash)**。 **过一段时间又变红了** Cookie 有生命周期,过期了重新复制一次即可,其它设置不用动。 **能不能不重新复制,让它自动续期?** 不行。程序没有你的账号密码,无法自行续期;这也正是它安全的地方—— 凭据只是你主动粘贴的那一份,且加密存在本机。 **这段 cURL 里包含我的隐私吗?** 包含,它就是你的登录凭据。所以:不要贴到聊天窗口、issue 或截图里; 程序侧已经用 Windows DPAPI 加密保存,并且界面只显示脱敏摘要。 ## 界面与操作 ### 面板 三列布局:**余额** | **燃烧状态** | **每日任务**,下方是两个信息块。 ``` 剩余积分 ● 更新于09:33:30 ⟳ ⚙ ✕ 9337 ● 燃烧正常 0% ● 已签到100分 11-18 15:35 重置 ● 喵已领9分 ┌────────────────────┐ ┌────────┐ │ 套餐 9000 已用 0 剩余 9000│ │奖励 5600│ │ │▓▓▓▓▓▓▓▓▓▓▓│ │ │已用 5263│ └────────────────────┘ │剩余 337 │ └────────┘ ``` | 区域 | 内容 | |---|---| | 左侧大数字 | 总剩余积分(套餐剩余 + 奖励剩余);位数过长时先砍小数位、仍放不下再缩字号 | | 中间两行 | 燃烧判定(`燃烧正常` / `燃烧偏快12%` / `燃烧偏慢12%`)+ 下次重置时刻 | | 右侧两行 | `已签到100分`、`喵已领9分`,圆点判色(绿=完成、黄=待办、蓝=进行中、红=失败) | | 左下信息块 | 套餐三段:`套餐` / `已用` / `剩余`,下方是进度条与时间刻度 | | 右下信息块 | 奖励三行:总量 / 已用 / 剩余,只作参考,不参与进度判定 | | 操作 | 效果 | |---|---| | 在面板空白处按住拖动 | 移动窗口,位置自动记忆(连带记住所在显示器) | | 鼠标移入 | 面板变清晰(85% → 97%),右上角淡出刷新 / 设置 / 关闭三个图标 | | 点「刷新」 | 立即拉一次数据 | | 点「齿轮」 | 打开设置窗口 | | 点「✕」 | 退出程序(想临时收起请用托盘) | 面板四角是真圆角(半径 22 像素),角外完全透明、鼠标可穿透到下层窗口。 静置与悬停两档不透明度都能在[设置窗口](#设置窗口)里调,拖动滑条时面板**实时预览**。 ### 托盘 | 操作 | 效果 | |---|---| | **双击**图标 | 显示 / 隐藏面板 | | 右键图标 | 弹出菜单:显示 / 隐藏、立即刷新、打开设置、退出 | 菜单是自绘的深色面板(系统菜单改不了配色),悬停高亮、点外部自动收起。 ### 设置窗口 三块内容:**登录凭据**、**刷新与外观**、**自动化**,外加底部按钮。 ![设置窗口](docs/settings.png) 凭据卡的按钮分两组: ``` [录入凭证] [测试] 测试结果... [删除] [保存] ``` | 按钮 | 行为 | |---|---| | **录入凭证** | 把只读摘要切成可粘贴状态;再点(此时显示「取消录入」)可还原 | | **测试** | 用框里的凭据真实请求一次,结果显示在旁边(连通 / 失败原因) | | **删除** | 仅在本机已存凭据时可用;点击弹出确认窗,确认后**立即删除并落盘** | | **保存** | 默认灰色,测试通过且框里有新内容才亮;点它写入凭据**并立即落盘** | 底栏三个按钮: | 按钮 | 行为 | |---|---| | 诊断信息 | 打开诊断窗口(左侧),查看接口、字段与自动化记录 | | 确定 | **只保存刷新间隔 / 不透明度 / 置顶 / 自启 / 自动化开关**,不碰凭据 | | 取消 | 放弃外观类改动并关闭(凭据已保存的不会回滚) | 刷新间隔可选:30 秒 / 1 分钟 / 2 分钟 / 5 分钟 / 10 分钟 / 30 分钟。 ## 自动化 两个开关默认**关闭**。打开后程序每 5 分钟检查一次成长计划并自动执行;关闭时只查询与显示状态,不做任何动作。 | 开关 | 打开后做什么 | |---|---| | **自动签到** | 当天没签 → 调用签到接口(一次调用即签到并到账积分),随后立刻刷新面板 | | **自动派喵喵旅行** | **先领后派**:已到达 → 先领奖励;在途中 → 不动;空闲且今日未满 → 派去咖啡馆(1~4 小时随机回来) | 实现上的几个约定: - **每天只做一次**:签到、派发、领取成功后当天不再发起同类请求(跨天自动重置); - **幂等**:已签过不会重复签,在途中或今日已满不会重复派; - **低频**:当天旅行完成后,检查频率从 5 分钟降到 30 分钟; - **可追溯**:每次动作都写进诊断窗口的「自动化记录」(保留 40 条,倒序); - **有提示**:动作完成后屏幕右下角弹一条提示,见[完成提示](#完成提示)。 ### 完成提示 动作执行完,屏幕右下角会弹出一条提示——不抢焦点、不进任务栏,不会打断你正在做的事: ![右下角提示](docs/toast.png) 几个约定: - **一次执行里干了多件事,合并成一条**逐行显示,不拆成好几条轮流弹; - **每行单独判色**:绿点=成功、红点=失败(上图第二行就是派发失败的例子),一眼能看出哪一项没成; - **不会自动消失**,要看过之后点右上角的 **×** 关掉;关掉当前这条才会显示下一条; - 点提示的**其他区域不会关闭**,避免误触;鼠标移到 × 上会变亮; - 提示是独立的置顶浮层,面板隐藏或在别的虚拟桌面时照样会弹出来。 > ⚠️ 这两项是**写操作**:真的签到、真的派猫、真的领奖。用的是活动接口,活动结束即失效。 ## 燃烧进度对比 面板底部把**时间进度**和**积分燃烧进度**放在一起比,一眼看出消耗节奏: | 进度 | 算法 | |---|---| | 时间进度 | (现在 − 周期开始)÷(周期结束 − 周期开始) | | 燃烧进度 | 1 − 本期剩余 ÷ 本期总量(**只算套餐部分**) | **积分分两类**(依据接口 `CreditGroups.Kind`): | 类别 | Kind | 用途 | |---|---|---| | **套餐积分** | `plan_base`(套餐基础)+ `plan_bonus`(套餐赠送) | 算总量 / 已用,**用进度条 + 时间刻度展示**,参与燃尽判定 | | **奖励积分** | `benefit`(平台奖励)、`addon`(附加/定额包)、`purchase`(购买积分)等其余类别 | **只展示剩余量**,不参与进度与判定 | 原因:只有套餐那两类一定随套餐续费日刷新,时间进度与燃尽才有可比性; 奖励积分各有自己的到期时间(比如平台奖励是「最近到期时间」而非周期结束), 用掉的部分也不属于本周期——混进来会让周期刚重启就显示「燃烧偏快34%」这种误判。 面板把这两类分成左右两块信息区: ``` 9337 ← 总剩余积分 ┌────────────────────┐ ┌────────┐ │ 套餐 9000 已用 0 剩余 9000│ │奖励 5600│ │ │▓▓▓▓▓▓▓▓▓▓▓│ │ │已用 5263│ └────────────────────┘ │剩余 337 │ └────────┘ ● 燃烧正常 0% 11-18 15:35 重置 ``` - **左块(套餐)**:进度条 + 套餐总量 / 已用 / 剩余,参与燃尽判定 - **右块(奖励)**:总量 / 已用 / 剩余,只作参考,不参与判定 - 大数字仍是**总剩余**(套餐剩余 + 奖励剩余) 判定阈值 5 个百分点: | 显示 | 颜色 | 含义 | |---|---|---| | 燃烧偏快N% | 红 | 消耗偏快 | | 燃烧正常 | 蓝 | 两者相差 5 个百分点以内 | | 燃烧偏慢N% | 绿 | 消耗偏慢、有富余 | | 积分已用尽 | 红 | 余额为 0 但周期未结束 | | 无周期数据 | 灰 | 拿不到套餐周期 | 进度条上的**白色竖线**是时间刻度:剩余块的左边界压在线上,就代表消耗与时间同步。 > 计费周期只有资源包接口返回,主接口不含时间字段,所以拿到积分后会补查一次周期。 > 取不到周期时这一行显示「无周期数据」,其余显示不受影响。 ## 数据存放与绿色运行 程序是**绿色单文件**:不写注册表、不装服务、不改系统设置、不留缓存、不产生日志。 ### 它只会碰这两个位置 | 位置 | 内容 | 什么时候产生 | |---|---|---| | `%LOCALAPPDATA%\WorkbuddyCredit\config.json` | **全部**配置:凭据(加密)、刷新间隔、两档不透明度、窗口位置、置顶 / 自启 / 自动化开关 | 首次保存时创建,之后每次「确定」「保存凭据」都会更新 | | `%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\WorkbuddyCredit.lnk` | 开机自启的快捷方式 | **只有勾选「开机自动启动」才会创建**,取消勾选立即删除 | 展开成完整路径大致是: ``` C:\Users\<用户名>\AppData\Local\WorkbuddyCredit\config.json C:\Users\<用户名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WorkbuddyCredit.lnk ``` `%LOCALAPPDATA%` 是 Windows 分配给当前账户的私有目录,同一台电脑上的其它 Windows 账户看不到, 也不会参与漫游同步——所以配置放在这里既"不污染系统",也不会跟着云同步跑出去。 ### 明确不会做的事 - 不写注册表(没有任何 `RegSetValue` 调用) - 不安装服务、驱动、浏览器插件 - 不改文件关联、不改系统设置、不动环境变量 - 不在 exe 旁边生成 `imgui.ini`、`.dll`、日志或缓存(ImGui 的 ini 写入已在代码里禁用) - 不写临时文件,卸载不需要「卸载程序」 - 不含任何统计、埋点或上报;网络请求只发往你 cURL 里那个域名 ### 怎么彻底清除 1. 删除 `WorkbuddyCredit.exe`; 2. 删除 `%LOCALAPPDATA%\WorkbuddyCredit` 整个目录; 3. 如果开过自启,在程序里取消勾选即可(或手动删掉那个 `.lnk`)。 没有任何残留。 ### 拷到别的电脑能用吗 能——exe 是自包含的,拷过去双击就跑。 但**配置文件拷过去没用**:凭据用 Windows DPAPI 绑定当前登录账户加密,换账户或换机器都解不开 (这是有意的安全设计)。新电脑上重新粘贴一次 cURL 即可,其它设置本来也不需要带。 ## 凭据与安全 - 凭据(cURL 与 Cookie)与其它设置一起存在 `%LOCALAPPDATA%\WorkbuddyCredit\config.json`([位置说明](#数据存放与绿色运行)); - 使用 **Windows [DPAPI](https://learn.microsoft.com/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata) 叠加程序内置的 32 字节熵**加密,只有本程序能解开: - 换 Windows 账户或换电脑,配置文件拷过去也解不开(这是有意设计); - 被别的脚本读取,同样解不开; - 界面上**只显示脱敏摘要**(网址、请求头数量、Cookie 长度),原文既看不到也复制不出来; - 凭据只发往你 cURL 里指定的那个域名,程序不含任何统计或上报。 > 说明:内置熵编译在程序里,能完整逆向二进制的攻击者仍可提取。 > 客户端软件能做到的上限大致如此,它挡住的是「配置文件被拷走」「随手写脚本读一读」。 ## 常见问题 **面板显示「登录已过期,请更新」** Cookie 过期了。浏览器重新复制一份 cURL → 设置里「录入凭证」→ 粘贴 → 测试 → 保存。 **数字没显示对 / 显示「无周期数据」** 接口字段名可能随版本变化。右键(托盘)→ 诊断信息,查看命中接口与本机识别到的字段名; 重新复制一份新 cURL 通常就能恢复。极端情况下可手工编辑 `config.json` 里的 `pathRemaining` / `pathTodayUsed` / `pathTotal`(形如 `data.remainingCredits`),改完重启。 **右下角提示挡住了别的窗口** 点提示右上角的 **×** 关掉;或关掉自动化开关,提示就不会再出现。 **换台电脑后凭据失效** 设计如此:加密密钥绑定当前 Windows 账户。新机器上重新粘贴一次 cURL 即可。 ## 构建 依赖: - Visual Studio 2022(MSVC,C++17) - CMake 3.20+ - [Dear ImGui](https://github.com/ocornut/imgui)——已作为 **git submodule** 挂在 `third_party/imgui` ```powershell # 克隆时一并拉取子模块(推荐) git clone --recursive https://gitee.com/bruceliu998/workbuddy-credit.git cd workbuddy-credit # 如果已经普通 clone 过,补拉一次即可 # git submodule update --init --recursive cmake -S . -B build -G "Visual Studio 17 2022" -A x64 cmake --build build --config Release ``` 也可以直接用仓库里的脚本(结束旧进程 → 增量构建 → 成功后启动): ```powershell .\build-and-run.ps1 .\build-and-run.ps1 -NoRun # 只构建 ``` 想用本机已有的 ImGui 副本时,加 `-DIMGUI_ROOT=<路径>` 覆盖默认位置即可。 产物是单个 `WorkbuddyCredit.exe`(约 1 MB,静态链接运行库,无需 VC++ Redistributable)。 ## 目录结构 ``` src/main.cpp 程序入口:窗口、D3D11 + ImGui 主循环、托盘图标与自绘菜单 src/ui.cpp 悬浮面板绘制(大数字、进度条、状态行、图标) src/settings_window.cpp 设置窗口 / 诊断窗口 / 删除确认弹窗(全部自绘) src/app.cpp 后台轮询线程、全局状态、自动化调度 src/credits.cpp 积分接口请求、cURL 解析、字段自动识别 src/growth.cpp 成长计划:签到与喵喵旅行的查询与写操作 src/toast.cpp 右下角提示浮层 src/config.cpp 配置读写与 DPAPI 加密 src/http.cpp WinHTTP 封装 src/json.cpp 极简 JSON 解析(无第三方依赖) src/autostart.cpp 开机自启(「启动」文件夹快捷方式,不写注册表) resources/app.ico 图标(16/32/48 三种尺寸,由 tools/make_icon.py 生成) ``` ## 免责声明 - 本项目是**个人自用工具**,与 WorkBuddy 官方无关,未获其授权或背书; - 程序调用的是官方网页端自身使用的接口,接口随时可能变更、失效或受到限制; - 自动化功能会真实改变你的账号状态(签到、派发、领取),请自行判断是否开启, 并自行确认是否符合活动规则; - 使用本程序产生的任何后果由使用者自行承担。 ## 许可 本项目代码采用 [MIT License](LICENSE)。 界面渲染使用 [Dear ImGui](https://github.com/ocornut/imgui)(MIT 许可),以 **git submodule** 形式引用, 未在本仓库中修改其源码,其版权归原作者所有。