Tongji AGI Credit
实时获取同济大学 AGI 平台(agi.tongji.edu.cn)的积分余额;已接入余额小鲸鱼挂件;可作为独立面板使用;个人信息加密保存在本地。
当前版本:v0.3.0
一、简介
| 项目 | 说明 |
|---|---|
| 插件名 | tongji-agi-credit |
| 数据来源 | 同济 AGI 官方接口(agi.tongji.edu.cn/api/v1/*),登录统一身份认证后读取 |
| 账密存放 | 只存在本插件自己的金库(<插件目录>/.vault/config.json),密码用系统级加密(Windows DPAPI / Electron safeStorage) |
| 对外接口 | 进程内服务 + 本地回环 HTTP + 面板 UI |
| 已适配 | dsh-whale-widget@0.4.2(一键接入 / 解除关联) |
| 不影响 | 鲸鱼的 DeepSeek 官方余额、其他厂商 API 模型的余额与账本 |
入口:页面左下角的「济」按钮。
1.1 兼容性
| 项目 | 要求 |
|---|---|
| DSH | >= 0.2.0 < 0.3.0(声明在 engines.dsh,不满足会被宿主拒绝加载并提示 allow-version) |
| Node | ^22.19 || >= 24(跟随 DSH 自带的运行时) |
| 平台 | Windows(DPAPI 加密仅在 Windows 生效;其他平台自动退到内置 AES-256-GCM) |
| 可选 | dsh-whale-widget@0.4.2(不装也能用独立面板) |
1.2 隐私与安全声明
- 本插件需要学号与统一身份认证密码,因为它要以你的身份登录
iam.tongji.edu.cn才能读到积分。 - 账密只写入本插件目录下的金库
<插件目录>/.vault/config.json,密码字段永远是密文(enc:v1:ss./enc:v1:dp./enc:v1:wk.),从不存明文、从不写入日志。 - 学号、密码、登录会话、回环 token 只在插件进程内使用:鲸鱼挂件拿到的只有一个占位密钥和一条本机 URL,拿不到你的个人信息。
- 本地回环接口只监听
127.0.0.1、只允许 GET、必须带 Bearer token、拒绝非回环 Origin、只返回白名单字段(纯数字与时间)。 - 插件只访问
iam.tongji.edu.cn与agi.tongji.edu.cn,不向任何第三方上报数据。 - 删除:面板「清除个人信息」=删除整个金库;卸载插件=插件目录(含金库)被物理删除。
二、安装与配置
2.1 安装顺序
- 安装本插件(二选一):
# 从本地 tgz 安装
dsh plugin --profile desktop add C:/path/to/Tongji-AGI-Credit-0.3.0.tgz
# 或从源码目录安装(改代码重启即生效)
dsh plugin --profile desktop add link:C:/path/to/Tongji-AGI-Credit
- 安装(或确认已装)小鲸鱼挂件:
dsh plugin --profile desktop add dsh-whale-widget@0.4.2 - 重启 DSH(必须;两个插件的注入脚本都在启动时装)。
- 打开本插件面板:点左下角「济」按钮。
- 填写账号密码并保存:学号 + 统一身份认证密码 → 保存(密码加密后落盘;面板顶部应出现剩余积分)。
- 接入小鲸鱼:点面板右侧「配置 ⚙️」→「插件接入」→ 一键接入(会在鲸鱼里写入「同济AGI」这一行)。
- 再重启一次 DSH,然后检查小鲸鱼挂件里是否出现「同济AGI」。
2.2 检查与排障
| 现象 | 处理 |
|---|---|
| 挂件里没有「同济AGI」 | 面板里点 解除关联 → 再点 一键接入 → 重启 DSH |
挂件里出现了但数字是 -- |
确认面板顶部能取到积分(能取到说明登录正常);再等鲸鱼下一次轮询(约 60 秒)或重启 |
| 面板顶部取不到积分 | 确认学号、密码能在 iam.tongji.edu.cn 正常登录;确认网络能访问 agi.tongji.edu.cn |
| 面板要求输入图形验证码 | 学校风控偶尔会要求,输入图中字符即可;验证码只在本机内存里,不落盘 |
| 要求短信/邮箱验证码 | 账号触发了「增强认证」,按面板提示发送并填入验证码即可 |
2.3 在鲸鱼泡泡里显示余额
重启 DSH 后,打开小鲸鱼挂件的「按压泡泡设置」,在可选模块里能看到:
余额·同济AGI—— 剩余积分(无单位);今日已用·同济AGI—— 今日消耗积分(无单位)。
2.4 解除关联 / 清除个人信息
- 解除关联:回滚鲸鱼侧全部改动,本插件自己的账密保留。
- 清除个人信息(二次确认):删除整个金库(账密、登录会话、回环 token、绑定快照)。
- 直接删除插件目录(或用包管理器卸载)也会连同
.vault/一起物理删除。 - 建议顺序:先「解除关联」,再卸载插件——这样鲸鱼侧的模型条目、用量设置、泡泡模块、占位凭据会一并回滚干净。
三、核心功能与接口调用
3.1 核心功能
| 功能 | 说明 |
|---|---|
| 积分余额 | 剩余 / 本周期总额度 / 已用 / 周期起止 / 下次重置时间 |
| 今日用量 | 今日 0:00 至此刻消耗的积分 |
| 账密保管 | 学号和密码加密保存在本地 |
| 对外供数 | 只输出白名单字段(数字与时间),学号/密码/token/昵称/邮箱永不出网 |
| 一键接入鲸鱼 | 自动写模型条目、用量提醒、泡泡模块、占位凭据;解绑可完整回滚 |
| 自动休眠 | 10 分钟无调用 → 空闲,30 分钟 → 休眠(可在配置里改) |
3.2 数据接口(三种调法)
① 进程内服务(推荐给其他 DSH 插件)
const tac = ctx.get('tongjiAgiCredit')
await tac.getSnapshot() // { ok, remaining, total, used, todayUsed, planName, resetCycle, periodStart, nextResetAt, updatedAt }
await tac.refresh() // 同上,但强制重新取数
await tac.getTodayUsage() // { ok, todayUsed }
tac.status() // { level: 'active'|'idle'|'deep', lastActivityAt, hasConfig }
② 本地回环 HTTP(给鲸鱼或任何本机程序)
GET http://127.0.0.1:47821/tac/v1/balance
GET http://127.0.0.1:47821/tac/v1/today
GET http://127.0.0.1:47821/tac/v1/health
Authorization: Bearer <token> # token 在 <插件目录>/.vault/bridge.token
- 端口从 47821 起,被占用自动顺延到 47830(可用配置
ports改); - 只监听
127.0.0.1、只允许 GET、必须带 Bearer token、带非回环Origin一律 403; - 返回字段固定为:
ok / remaining / total / used / todayUsed / planName / resetCycle / periodStart / nextResetAt / updatedAt / stale / manual / code / error / connected。
③ 插件自身路由(面板用,宿主认证)
/dsh-tongji-credit/ 下:ui.js、whale-ui.js、state.json、balance.json、save.json、refresh.json、captcha.json、otp.json、bridge.json、bubble-today.json、clear.json。
这些路由只接受回环/同源请求,用于面板读写;第三方直接调用请走 ②。
3.3 配置项
不写配置即用默认值;需要时在 cordis.patch.yml 的 insert 行里加 config:
- insert:
- id: tongji-agi-credit
name: tongji-agi-credit
config:
modelName: 同济AGI
renewAheadMinutes: 30
| 字段 | 默认 | 说明 |
|---|---|---|
routePrefix |
/dsh-tongji-credit |
面板路由前缀 |
host |
127.0.0.1 |
回环监听地址(只允许回环) |
ports |
47821…47830 |
回环端口候选 |
idleMs / deepMs |
10 分钟 / 30 分钟 | 空闲 / 休眠阈值(deepMs 必须 ≥ idleMs) |
ttlActiveMs / ttlIdleMs / ttlDeepMs |
25 秒 / 5 分钟 / 15 分钟 | 三档休眠下的取数缓存 |
renewAheadMinutes |
20 | 到期前多少分钟提前静默续期,0 表示关闭 |
modelName |
同济AGI |
鲸鱼账本里的显示名 |
serviceName |
tongjiAgiCredit |
进程内服务名(其他插件 ctx.get 用) |
maxBodyBytes |
64 KiB | 面板请求体上限 |
tokenLength |
24 | 回环 token 长度 |
3.4 UI 入口
| 入口 | 怎么用 |
|---|---|
| 「济」按钮 | 页面左下角,可拖动、位置记忆;单击开/关面板 |
| 鲸鱼模型面板 | 打开小鲸鱼 → 模型面板 →「同济AGI」卡片多一行「同济账号密码 → 打开配置面板」 |
| 控制台 | window.__TAC_OPEN__() 直接打开面板 |
| 配置 ⚙️ | 面板右侧齿轮,展开「同济账号密码 / 插件接入 / 隐藏图标 / 清除个人信息」 |
| 隐藏图标 | 勾选后隐藏左下角「济」按钮;每次启动 DSH 默认显示 |
3.5 接入小鲸鱼挂件
在面板「插件接入」里点 一键接入,本插件会做四件事:
~/.dsh/.dshw-api.json:新增模型tongji-agi(币种零宽字符、balance.url指向本插件回环、json映射remaining/total/used←todayUsed);~/.dsh/.dshw-usage.json:settings.models['tongji-agi'](余额预警默认开、阈值 100;当日预算默认关);~/.dsh/.dshw-bubble.json:模块库加一条「今日已用·同济AGI」,并清掉不该出现的额度模块;- DSH 凭据服务:写入占位密钥
TONGJI_AGI_TAC_KEY(真正的账密仍在 TAC 金库里)。
重启 DSH 后,在小鲸鱼挂件里打开「按压泡泡设置」,可选模块中会出现
余额·同济AGI 与 今日已用·同济AGI,勾选即可显示。
点 解除关联 会按绑定时的快照完整回滚(模型条目、用量设置、泡泡模块、占位凭据),本插件自己的账密保留。
四、目录结构
Tongji-AGI-Credit/
├─ package.json 插件元数据(main=lib/index.js,files 含 lib/adapter/web/locale/icon)
├─ cordis.patch.yml 插件声明(dsh.profile.bundles 里有名字即生效)
├─ README.md 安装与使用说明(本文件)
├─ CHANGELOG.md 版本变更记录
├─ icon.png 插件图标(512×512)
├─ locale/ 插件卡片文案(zh / en)
├─ dist/ 发布包
├─ LICENSE
├─ lib/
│ ├─ index.js 装配层:注入脚本、起回环、注册路由、休眠状态机、快照缓存
│ ├─ config-schema.mjs 配置字段(Standard Schema,宿主加载时校验)
│ ├─ schema.mjs 最小 Standard Schema 实现(宿主不向第三方插件暴露 SDK)
│ ├─ agi-session.mjs 协议层:登录、会话缓存、取余额/今日用量、金库加密
│ └─ api-server.mjs 接口层:只读回环 HTTP(白名单字段、Bearer token、只 GET)
├─ adapter/ ← 宿主插件适配层(一个宿主一组文件)
│ ├─ whale-bridge.mjs 主进程侧:鲸鱼注册表 / 用量设置 / 泡泡模块 / 占位凭据 / 快照回滚
│ └─ whale-ui.js 渲染进程侧:往鲸鱼 DOM 补「同济账号密码」入口行、修模块库 chip 文案
├─ web/
│ └─ ui.js 面板 UI(自绘、可拖动;只走 lib/index.js 的 HTTP 路由)
└─ dev/
├─ smoke.mjs 自检:金库加解密 → 回环接口 → 适配层 bind/status/unbind
└─ make-icon.py 重新生成 icon.png
分层原则:协议层不认识宿主插件,适配层不碰账密,UI 不直接读写文件。
以后若要适配别的宿主插件,在 adapter/ 下新增一组 <宿主>-bridge.mjs + <宿主>-ui.js 即可,lib/ 不用动。
五、安全 / 自检 / 限制
5.1 安全设计
| 面 | 做法 |
|---|---|
| 账密存放 | <插件目录>/.vault/config.json,只存 passwordEnc(enc:v1:ss. / enc:v1:dp. / enc:v1:wk.) |
| 加密实现 | 优先 Electron safeStorage(系统密钥链,ss);其次 Windows DPAPI 当前用户(dp);都不行才退到 AES-256-GCM + 机器派生口令(wk) |
| 个人信息范围 | 学号、密码、会话 JWT、回环 token 只在本插件内;鲸鱼侧只有一个占位 key TONGJI_AGI_TAC_KEY 和回环 URL |
| 回环接口 | 只监 127.0.0.1、只 GET、必须 Bearer token、拒绝非回环 Origin、字段白名单 |
| 路由 | 插件 HTTP 路由只接受回环/同源请求 |
| 卸载清理 | 金库在插件目录内,删目录即物理删除;另有「清除个人信息」按钮 |
| 日志 | 只打「登录成功/失败、休眠级别、端口」等状态,不打印账密与 token |
5.2 开发自检
# 语法(用 DSH 自带运行时)
ELECTRON_RUN_AS_NODE=1 "D:/Program Files/DSH/DeepSeek Harness.exe" --check lib/index.js
ELECTRON_RUN_AS_NODE=1 "D:/Program Files/DSH/DeepSeek Harness.exe" --check adapter/whale-ui.js
# 全链路自检(金库 → 回环 → 适配层 bind/unbind,无需联网)
ELECTRON_RUN_AS_NODE=1 "D:/Program Files/DSH/DeepSeek Harness.exe" dev/smoke.mjs
自检覆盖:配置默认值与非法值、apply() 装配(11 条路由 + 进程内服务 + dispose 清理)、明文密码自动迁移为密文、密文可解密、回环鉴权与字段白名单、绑定后四处写入、解绑后四处回滚。
5.3 已知限制
- 平台接口变更:AGI 是 SPA,接口与页面元素由上游决定;
billing/overview、my-usage/stats若改字段,需要更新lib/agi-session.mjs的取值路径(字段缺失时返回code:'SHAPE'与中文错误,不会显示假数据)。 - 会话有效期:AGI 侧登录会话按天计;TAC 在到期前会用登录时保留的认证会话尝试静默续期,续期不成才需要重新登录。
- 无单位显示:靠币种写零宽字符实现;若鲸鱼某天对币种做
trim(),会退化成显示「积分」。 - 鲸鱼 DOM 依赖:入口行与 chip 文案修正依赖
.dshwv-usage-card/.dshwv-bubpal等选择器,鲸鱼大改版可能需要同步调整adapter/whale-ui.js。 - 今日已用:按平台按天聚合接口取值,跨零点重新计数,不作为记账依据。
- 多实例:回环端口在 47821–47830 顺延;全部被占用时鲸鱼侧会显示取数失败。
- 升级会清金库:用 tgz 覆盖升级会重建插件目录,
.vault/需要重新填写账密;想保留就用link:方式安装。
No comments yet. Be the first to write one.