一个油猴脚本(UserScript),在 CodeBuddy 的「套餐用量」页面按天汇总积分消耗: 顶部居中的入口按钮,点开后从窗口右侧滑入一个抽屉面板,给出总量、趋势、明细、模型分布,并支持导出 CSV。
https://www.codebuddy.cn/profile/plans-usagecodebuddy-daily-credit-summary.user.jscodebuddy-daily-credit-summary.user.js 的全部内容粘贴进去,保存。https://www.codebuddy.cn/profile/plans-usage。脚本只在 /profile/plans-usage 这一页出现,站内其它页面不会加载出任何 UI。
📊 每日积分汇总。✕、按 Esc、或点击面板之外的页面任意位置。| 快捷键 | 含义 |
|---|---|
| 近 7 天 | 今天往前含今天共 7 天 |
| 近 30 天 | 今天往前含今天共 30 天(默认) |
| 本月 | 当月 1 日 ~ 今天 |
| 上月 | 上月 1 日 ~ 上月末日 |
| 自定义 | 直接用两个日期选择器指定起止日 |
跨度超过 180 天时会先给出提示,因为每一天都要单独发一次请求。
| 区块 | 说明 |
|---|---|
| 四张指标卡 | 总消耗积分、请求次数、日均消耗(按 N 天)、单日峰值(附对应日期) |
| 每日积分趋势 | 按日期正序的柱状图,悬停显示「日期 / 积分 / 次数」;无消耗的日期为灰色短柱 |
| 每日明细 | 表格:日期、消耗积分、请求次数、占比条;表头与合计行固定,峰值行有标记,可勾选「列出无消耗的日期」 |
| 模型消耗分布 | 按积分降序的 Top 6 模型,每条显示积分与次数 |
| 底部操作 | 导出 CSV、复制汇总;右侧显示更新时间与本次接口请求次数 |
CodeBuddy积分消耗_起始日_结束日.csv,列为「日期, 消耗积分, 请求次数」,末行是合计。带 UTF-8 BOM,Excel 打开中文不乱码。统计结果会写入 localStorage(键名 cb-usage-daily-summary-v2)。
再次打开面板时会直接载入上次结果并提示「已载入本地缓存(N 分钟前更新)」,避免每次都重新请求。
点「开始统计」可随时刷新。
这是这个脚本最关键的部分。直接照搬浏览器里那次 curl 的宽区间查询会算错数,
实测到接口有三个坑:
total 硬上限 3000,且会静默丢弃最新的数据查询 8/24 ~ 9/10,实际有 3346 条记录,接口只返回 3000 条,并且不是丢掉最旧的,而是丢掉最新的——
9/9、9/10 两天整天返回 0,合计少算 809 积分(8.3%)。区间越宽丢得越多,
而且返回结果不是按时间排序的,从数组里完全看不出被截断了。
32 天正常返回,35 天直接返回 total: 0——不是报错,是空数据,很容易被当成「这段时间没消耗」。
credit 会随查询窗口变化同一条记录(requestId=4a7946d6…,requestTime=2026-08-26 23:56:00),
用不同窗口去查,拿到的积分不一样:
| 查询窗口 | 该记录的 credit |
|---|---|
| 8/26 单日 | 8.43 |
| 8/25 ~ 8/26 | 8.43 |
| 8/26 ~ 8/27 | 8.74 |
| 8/24 ~ 8/31 | 8.74 |
| 8/01 ~ 8/31 | 8.74 |
窗口一旦延伸到该记录之后,取值就稳定在饱和值;窗口卡在当天会漏掉尾部结算。
逐日查询,每天独立发一次请求,窗口为 [当天 00:00:00, 次日 23:59:59],再按 requestTime 归属回当天。
pageSize 翻页,结果一字不差。代价是请求次数等于天数(30 天 = 30 次请求)。脚本用 4 路并发压住,30 天约 4~5 秒。
接口与采集:
POST /billing/meter/get-user-request-usage,请求体 { startTime, endTime, pageNum, pageSize },时间格式 YYYY-MM-DD HH:mm:ss,pageSize 最大可用 1000。requestId / credit / model / client / requestTime / input / agentPurpose。1275.39999926 这类值,直接浮点相加会累积偏差。credit 存在大量 0 值记录(hy3、hy4-preview 等),计次时保留,不参与求和但会计入请求次数。401 / 403 提示登录已失效,需刷新页面重新登录。new Date('2026-08-17') 会按 UTC 解析,手工 split 更安全)。UI 与挂载:
@match https://www.codebuddy.cn/profile/*,运行时再用 /^\/profile\/plans-usage(\/|$)/ 守卫展示范围。
收窄到精确路径会导致站内侧边栏点击(客户端路由跳转)时脚本根本不注入,只能手动刷新。:host { all: initial } 与宿主页面隔离。setInterval + popstate / hashchange 兜底重挂载;离开目标页时把宿主节点整个移除,
并摘掉挂在 document 上的监听。visibility 而非 display: none 控制显隐(display: none 的元素不参与过渡),
收起态把 visibility 的切换延迟到滑出动画结束。pointerdown 的捕获阶段:宿主页面若 stopPropagation
也拦不住;且不拦截事件,所以这次点击会照常传给底下的页面元素。按钮没出现?
先确认当前地址是 https://www.codebuddy.cn/profile/plans-usage。若地址正确,按 F12 看 Console 有无报错;
在 Console 里执行 document.getElementById('cb-usage-summary-host'),返回元素就说明已挂载成功。
只点侧边栏进入本页而没有整页刷新时,如果脚本版本较旧可能不会注入,刷新一次即可。
数值和我自己在页面上看到的不一致?
本脚本按 requestTime 把记录归属到自然日,并以「向后多含一天」的窗口取饱和值。
如果拿宽区间查询的结果来对比,会看到页面上少算(见上文坑 ① 与坑 ③)。
为什么会发起几十次请求? 逐日查询的必然代价,用来换取准确性。面板底部会显示本次实际请求次数。
天数很多时很慢? 按天数线性增长,180 天以上会先提示。可以改成先按月查、只对边界日逐日补查, 但需要额外处理 3000 上限,目前没有做。
换电脑 / 换浏览器后没有缓存了?
缓存在 localStorage,不跨设备。重新统计一次即可。
| 版本 | 变更 |
|---|---|
| 1.5.0 | 点击抽屉之外的页面区域自动收起 |
| 1.4.0 | 面板改为贴窗口右缘、自右侧滑入的抽屉 |
| 1.3.0 | 入口按钮改为顶部居中 |
| 1.2.0 | 限定只在 /profile/plans-usage 展示 |
| 1.1.0 | 改为逐日查询,修复宽区间查询丢数据的问题 |