从一次「余额清零事故」说起,我开源了一个 DeepSeek 监控桌面应用

从一次「余额清零事故」说起

上个月跑了一个批量任务,用的 DeepSeek API。跑之前我看了眼余额,还有 60 多块,想着够用。结果那天晚上顺手点了好几次重试,等到第二天打开平台一看——余额归零,任务跑到一半全断了。

我打开 DeepSeek 官方控制台想看看钱到底是怎么烧的,结果发现更气人的事:

  1. 余额在一个页面,用量统计在另一个页面,消费明细又在第三个页面

  2. 用量看板连个刷新按钮都没有,想看最新数据得关掉重新进;

  3. 想知道"这个月 V4 到底花了多少、缓存命中率多少",得自己拿计算器算。

作为一个程序员,我当时的想法很朴素:

这活儿不该让用户干,应该让机器干。

于是我用业余时间写了个桌面应用——DeepSeek Monitor。先放成品:

深色毛玻璃、无边框、驻留托盘、余额和用量一屏看完,还能自动刷新。

Github 地址(求个 star,真的):

🔗 GitHub - guniang2/deepseek-monitor: A sleek desktop app for monitoring DeepSeek account balance, API usage, and spending trends in real time · GitHub


它到底能干什么

一句话:把你的 DeepSeek 账户余额、消费趋势、模型用量,全部塞进一个 380 宽的小窗口里,并自动盯着它。

具体来说:

功能 说明
💰 余额监控 实时显示账户余额与可用状态
📊 双模型用量 V4 Flash / V4 Pro 分别统计 Token、缓存命中率、消费金额
📈 7 日趋势图 命中/未命中/输出三段堆叠柱状图,悬停看明细
🧩 用量穿透 点模型卡片进详情页,按日看请求数和 Token
⏰ 自动刷新 1/5/30/60 分钟四档,后台静默更新
🪟 系统托盘 关窗口不退出,托盘一键唤出
🚀 开机自启 Windows/macOS 原生支持
🔑 Token 自动同步 内置登录窗口,自动捕获用量 Token

以及 v1.1.0 新增的三板斧(后面细讲):

  • 余额预警:跌破阈值弹系统通知,每个账户只提醒一次,不刷屏

  • 多账户管理:多个 Key 一键切换,余额汇总

  • 应用内自动更新:新版本自动下载,重启即生效


技术选型:为什么是 Electron + 零依赖?

做桌面工具,绕不开 Electron 和 Tauri 的争论。我选 Electron 的理由很实际:JS 一把梭,生态成熟,electron-builder 打包省心。而 Tauri 虽然包小,但 Rust 工具链 + WebView 兼容性对一个小工具来说试错成本有点高。

但我在依赖上做了个极端的选择:运行时零第三方依赖

  • HTTP 请求?用 Node 原生 http/https 模块,不引 axios;

  • 配置存储?手写 JSON 读写,不引 electron-store;

  • 开机自启?直接调 Windows 注册表命令 / macOS LaunchAgent,不引 auto-launch。

你猜结果是什么?dependencies 字段长这样:

"dependencies": {
  "electron-updater": "^6.6.2"
}

唯一的运行时依赖是自动更新组件。整个应用的核心逻辑就是主进程里那一千多行原生 Node 代码。好处显而易见:包体干净、供应链攻击面小、代码完全可控。


三个值得一提的实现细节

1. 用量 Token 的「自动捕获」是怎么做的

DeepSeek 的用量接口需要登录态的 Bearer Token,让用户手动去开发者工具里复制是反人类的。我的做法是:内置一个登录窗口,在它发出网络请求的瞬间拦下 Authorization 头

// 在主进程拦截登录窗口的所有请求头
usageSyncWindow.webContents.session.webRequest.onBeforeSendHeaders(
  { urls: ['<all_urls>'] },
  (details, callback) => {
    const auth = details.requestHeaders.Authorization;
    if (auth) maybeCaptureUsageToken(auth);  // 验证有效后加密保存
    callback({ requestHeaders: details.requestHeaders });
  }
);

用户只需要在弹出的窗口里正常登录,Token 自动进配置。配合渲染进程里的 fetch/XHR hook 双保险,登录一次管很久。

2. 凭证加密:用系统的钥匙串

之前 API Key 明文躺在 config.json 里,我自己都心虚。v1.1.0 换成 Electron 的 safeStorage——底层是 Windows DPAPI / macOS Keychain,加密和解密都不经过我们的代码逻辑

function encryptSecret(plain) {
  if (safeStorage.isEncryptionAvailable()) {
    return 'enc:v1:' + safeStorage.encryptString(plain).toString('base64');
  }
  return plain; // Linux 无钥匙串时回退明文
}

旧版本用户升级后,明文配置在首次启动时自动重写为加密格式,无需任何手动操作。

3. 余额预警的防刷屏设计

阈值触发通知不难,难的是别把用户烦死。我的状态机很简单:每个账户记录 ok / below 两种状态,只有状态跃迁时才发通知:

if (value < threshold && prev !== 'below') {
  state = 'below';
  notify(`账户「${name}」余额 ¥${value} 已低于阈值 ¥${threshold}`);
} else if (value >= threshold && prev === 'below') {
  state = 'ok';   // 回升后重置,下次跌破才会再提醒
}

这样即使 1 分钟刷一次,也不会疯狂弹窗。


开源路上的一点点心得

这个项目经历了 v1.0.0 到 v1.1.0 的迭代,也踩了不少开源项目的坑,分享给想开源的同学:

  1. README 要双语。中文社区和海外开发者吃两套文案,一份 README.md(英文)+ 一份 README.zh-CN.md,顶部互相跳转,成本极低但受众直接翻倍;

  2. 截图比什么都重要。README 里放一张真实界面截图,比十行功能描述都有说服力——用户 3 秒内判断要不要点 star;

  3. CI 一定要从第一天就搭好。我配了 GitHub Actions:推送 vX.Y.Z 标签自动构建 Windows/macOS/Linux 三平台安装包并发布 Release,latest.yml 自动生成,应用内自动更新直接复用这套产物。从此发布 = 打一个 tag;

  4. 安全敏感功能要写清楚。SECURITY.md 里明确"凭证加密范围、Token 捕获逻辑",既是给维护者看,也是给用户信任感。


安装 & 使用(30 秒上手)

方式一:下载安装包(推荐)

Releases 页面 下载 DeepSeek-Monitor-Setup-1.1.0.exe,Windows 直接装。macOS 有 dmg,Linux 有 AppImage。

⚠️ 未签名的 Windows 包会弹 SmartScreen,点「更多信息 → 仍要运行」即可。

方式二:源码跑

git clone https://github.com/guniang2/deepseek-monitor.git
cd deepseek-monitor
npm install
npm start

首次使用三步:设置页粘 API Key(sk- 开头)→ 点「网页登录自动同步」→ 完事。剩下交给它。


最后

这个项目的定位很纯粹:一个不打扰你、但替你盯着钱包的桌面小工具。

如果你也觉得"查个余额不该这么麻烦",欢迎来仓库逛逛:

GitHub - guniang2/deepseek-monitor: A sleek desktop app for monitoring DeepSeek account balance, API usage, and spending trends in real time · GitHub

点个 star 就是对我最大的支持,有使用问题提 issue,有想法直接提 PR,Contributing 指南都写好了。

也希望这帖子能给你一点启发:工具不是越复杂越好,而是越顺手越好。当你在某个场景反复被烦到的时候,可能就是一个值得做的小项目。

更多推荐