定时查询多个火山方舟和智谱 GLM Coding Plan 账号的额度快照,并通过企业微信群机器人、飞书群自定义机器人发送汇总。程序统一展示 session/5小时、weekly 和模型 monthly 额度的已用百分比;只有周期严格超过 alert.threshold_percent 时才显示距重置剩余时间(如 15天08时30分钟),并且只展示每个账号实际返回的周期。
- 火山 AK/SK + Signature V4(HMAC-SHA256)调用
GetCodingPlanUsage - 智谱 Coding Plan API Key 查询 5 小时和每周额度,兼容
TOKENS_LIMIT与积分制CREDIT_LIMIT - 同一进程可混合监控火山和智谱账号
- 最多 5 个账号并发查询,单账号失败不影响整体汇总
- 默认每 10 分钟检查,可配置每天多个固定日报时刻
- 任一账号的一个或多个周期严格大于 90% 时,只发送一次整体提醒和统一账号摘要
- 只对任一周期达到 100% 的账号按该周期的重置时间升序排列;其他账号保留采集顺序
- 按账号、周期、重置时间去重,重启后不会反复提醒
- 企业微信使用 Markdown V2,飞书使用交互式消息卡片;均按平台大小限制自动拆分
- 企业微信、飞书可任选其一,也可同时推送;飞书支持可选的签名校验
- 支持企业微信智能机器人 URL 回调,成员发送消息即可异步查询最新用量
- 提供内存型状态页,展示进程启动时间、当天预警次数和主动查询次数
- 支持单次推送、只读预览和纯配置校验
- 提供非 root Docker 镜像与 Compose 配置
复制示例并填写真实凭证:
cp config.example.yaml config.yaml
chmod 600 config.yamlversion: 1
accounts:
- name: volc-account
provider: volcengine
access_key_id: AK...
secret_access_key: SK...
- name: zhipu-account
provider: zhipu
api_key: ZHIPU_CODING_PLAN_API_KEY...
wecom:
webhook_url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...
bot:
listen_address: :8080
token: 企业微信智能机器人回调 Token
encoding_aes_key: 43 位 EncodingAESKey
feishu:
webhook_url: https://open.feishu.cn/open-apis/bot/v2/hook/...
secret: 飞书机器人签名校验密钥
schedule:
timezone: Asia/Shanghai
poll_interval: 10m
daily_at:
- "09:00"
- "18:00"
alert:
threshold_percent: 90
state:
file: ./data/state.jsonprovider 支持 volcengine 和 zhipu;为兼容旧配置,省略时默认为 volcengine。火山账号必须配置 access_key_id 与 secret_access_key,智谱账号只配置 api_key。
wecom.webhook_url 和 feishu.webhook_url 至少配置一个。只使用一个通知渠道时,删除另一个渠道的整个配置块;两个都配置时,每次通知会分别发送到两个群。飞书机器人启用了“签名校验”安全设置时必须填写对应的 feishu.secret,未启用时可省略 secret。
wecom.bot 为可选配置,listen_address、token 和 encoding_aes_key 必须同时填写。启动后将同时提供企业微信智能机器人 API 模式所需的 URL 回调:
GET/POST /api/v1/vendor/wecom/bot/callback
GET /status
GET /usage
在企业微信智能机器人管理页选择“使用 URL 回调”,公网 URL 填写 https://你的域名/api/v1/vendor/wecom/bot/callback,Token 和 EncodingAESKey 必须与配置一致。服务会完成 GET 验证、POST 验签与解密;用户发送消息后,回调先快速返回,再通过企业微信提供的一次性 response_url 异步回复最新用量。重复的 msgid 在两小时内只处理一次。公网 HTTPS、域名证书和反向代理由部署环境提供。
状态页复用 wecom.bot.listen_address,返回便于查看和采集的纯文本:alerts_today 是当天成功发出的阈值预警批次数,active_queries_today 是去重后实际启动的主动查询次数。“当天”按 schedule.timezone 计算并在跨日后自动归零。统计只保存在进程内存中,因此服务重启后会从 0 开始;它适合运行状态观测,不作为审计数据。
GET /usage 会实时查询各账号并返回适配桌面端、移动端和系统深浅色模式的 HTML 用量汇总;GET /usage?format=markdown 可获取原始 Markdown。查询不发送群通知,也不修改预警去重状态;每次有效调用会计入 active_queries_today。生产环境建议只允许内网或受信任且具有访问控制的反向代理访问 /status 和 /usage,尤其不要将包含账号名称与用量的 /usage 直接暴露到公网。
schedule.daily_at 必须是 "HH:MM" 时刻列表,使用 24 小时制;列表不能为空,时刻不能重复。
相对状态路径以配置文件所在目录为基准。config.yaml 同时包含平台凭证、机器人 webhook、回调 Token 和加密密钥,已经加入 .gitignore,仍应限制为仅运行用户可读。
每组 AK/SK 必须属于要查询的火山账号,并具备方舟用量查询权限。推理使用的 ark-... API Key 不能替代控制面 AK/SK。
智谱必须使用 GLM Coding Plan API Key。智谱官方用量查询插件目前明确以个人版套餐为主;团队版 Key 的返回结构和附加请求头没有在公开接口中形成稳定约定,应先使用 once --dry-run 验证。
企业微信智能机器人 URL 回调的验签、AES-256-CBC 加解密、被动欢迎语和 response_url 异步 Markdown 回复遵循企业微信的智能机器人 API 文档。智能机器人场景的 ReceiveId 按官方约定使用空字符串。
本地构建:
go build -o coding-plan-usage ./cmd/coding-plan-usage配置校验(不访问网络):
./coding-plan-usage validate --config config.yaml查询并预览通知摘要,不调用任何 webhook、也不写状态:
./coding-plan-usage once --config config.yaml --dry-run立即查询并推送完整汇总:
./coding-plan-usage once --config config.yaml启动常驻调度:
./coding-plan-usage run --config config.yaml智能机器人回调只在 run 常驻模式下监听。Docker Compose 部署时还需取消 compose.yaml 中 ports 的注释;使用反向代理时将上述固定路径转发到 wecom.bot.listen_address。
常驻模式启动后立即检查一次。每个日报时刻后如果该时段尚未成功发送,之后每次轮询都会继续补发;如同一天错过多个时刻,只补发最近一个。高用量提醒会先列出本次检测到的高用量账号,再按日报规则列出全部账号用量统计。阈值消息和所有分片全部发送成功后才记录去重状态。
.github/workflows/deploy.yml 会在代码推送到 main 后运行测试和静态检查,交叉编译无 CGO 依赖的 Linux 二进制,通过 appleboy/scp-action 上传到服务器,再由 appleboy/ssh-action 原子替换目标文件并重启 systemd 服务。也可以在 GitHub Actions 页面手动触发。
仓库需要配置以下 Actions Secrets:
DEPLOY_HOST:服务器域名或 IPv4 地址DEPLOY_USER:SSH 登录用户DEPLOY_PASSWORD:SSH 登录密码DEPLOY_PORT:可选,SSH 端口,默认22
可选的 Actions Variables:
DEPLOY_PATH:二进制安装路径,默认/srv/coding-plan-usage/coding-plan-usageDEPLOY_SERVICE:systemd 服务名,默认coding-plan-usage.serviceDEPLOY_GOARCH:服务器架构,支持amd64(默认)或arm64
Workflow 只更新二进制,不上传 config.yaml,也不会自动覆盖 systemd 服务定义。仓库提供了 deploy/coding-plan-usage.service 样板,默认使用以下服务器布局:
/srv/coding-plan-usage/
├── coding-plan-usage
├── config.yaml
└── data/
└── state.json
首次部署前,在服务器上创建目录:
sudo install -d -m 0755 /srv/coding-plan-usage
sudo install -d -m 0700 /srv/coding-plan-usage/data将填写完成的 config.yaml 放入 /srv/coding-plan-usage/config.yaml,再设置权限:
sudo chown root:root /srv/coding-plan-usage/config.yaml
sudo chmod 600 /srv/coding-plan-usage/config.yaml安装并启用 systemd 服务定义:
sudo install -m 0644 deploy/coding-plan-usage.service /etc/systemd/system/coding-plan-usage.service
sudo systemctl daemon-reload
sudo systemctl enable coding-plan-usage.serviceservice 样板没有指定 User 或 Group,因此 systemd 默认以 root 运行程序。完成初始化后,推送到 main 或手动运行 Workflow。它会把二进制部署到 /srv/coding-plan-usage/coding-plan-usage,然后启动或重启服务。服务器必须启用 SSH 密码认证;部署用户还必须可以通过无密码 sudo 执行 install、mv 和 systemctl,SSH 登录密码不会被用于 sudo。
cp config.example.yaml config.yaml
chmod 600 config.yaml
docker compose up -d --build
docker compose logs -f配置以只读方式挂载到 /config/config.yaml,示例中的相对状态路径会落到命名卷 /config/data/state.json。常驻模式按单实例设计,不要同时启动多个副本。
0:配置有效或所有账号查询、推送成功1:配置/状态/API/webhook 失败,或单次执行存在账号查询失败2:命令或参数错误
常驻模式遇到单轮查询或推送失败时会记录脱敏日志并继续下一轮,不会退出进程。
go test -race ./...
go vet ./...
docker build -t coding-plan-usage:test .真实 AK/SK 或 API Key 只应通过本地 once --dry-run 做 smoke test,不要写入测试 fixture、提交记录或 CI 变量输出。
- Endpoint:
POST https://open.volcengineapi.com/ - Query:
Action=GetCodingPlanUsage&Region=cn-beijing&Version=2024-01-01 - Signature service/region:
ark/cn-beijing - 响应:
Result.QuotaUsage[]中的Level、Percent、ResetTimestamp ResetTimestamp <= 0表示当前没有可展示的重置时间
实现参考火山引擎的 Signature V4 文档、官方 Go SDK 签名代码和 ark-cli Coding Plan 用量说明。
- Endpoint:
GET https://open.bigmodel.cn/api/monitor/usage/quota/limit - 鉴权:
Authorization: <GLM Coding Plan API Key>,不主动添加Bearer前缀 - 5 小时窗口:
unit=3、number=5,归一化为session - 每周窗口:
unit=6、number=1,归一化为weekly nextResetTime同时兼容秒和毫秒时间戳,内部统一为秒用于提醒去重- 当
percentage缺失时,尝试通过currentValue / usage或currentValue / (currentValue + remaining)计算
该监控端点由智谱官方用量查询插件使用,但未列入版本化的公开 OpenAPI,返回结构可能随套餐升级变化。实现会兼容当前常见的 TOKENS_LIMIT、CREDIT_LIMIT、对象型及数组型 data,接口发生变化时单账号会显示查询失败,不会影响其他账号汇总。
实现参考智谱的 Coding Plan 套餐说明、官方用量查询插件说明及其 查询脚本源码。