Files
eink-push/main.py
YANG JIANKUAN 7378d6bb88 feat: AI 用量改账户级本机采集(Claude 钥匙串/Codex RPC)+宽版 7d 合并行
- Claude:复用 Claude Code 钥匙串登录态直调 /api/oauth/usage,零依赖 statusline 与 Claude Code 进程;只读不刷新 token
- Codex:经 codex app-server JSON-RPC 读 ChatGPT 订阅的 Codex 额度池(普通聊天额度无账户级途径,右块改名 Codex Usage)
- 两路采集共用 TTL 缓存+失败退避(CLAUDE_USAGE_TTL/CODEX_USAGE_TTL,语义同 WEATHER_TTL),推送端两路独立上报
- E1002:Claude 7d 与 fable 7d 合并为一行(单边框内上下对半实心,数字取较大者)、标签去 all 前缀、空值按 00% 00 占位等宽
- E1002/网页版:今日实时环比同比改涨绿跌红,与 K 线一致

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-14 14:08:21 +08:00

59 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
入口 —— 取数据 → 渲染 → 推送到设备。
用法:
python3 main.py # 渲染并推送(设备 host 取自 .env 的 EPD_HOST
python3 main.py --render-only # 只渲染生成图片不推送output/dashboard.png
python3 main.py --target e1002 # reTerminal E1002渲染 800x480 六色图 + 固定尺寸 index.html 到 output/e1002/
# 不推送(静态部署形态;动态形态见 server.py
python3 main.py --target push # 本机采集 Claude钥匙串登录态 → /api/oauth/usage与 Codexcodex app-server RPC
# 两路账户级用量并推送到 server.pyPUSH_URL + PUSH_TOKEN服务端渲染时现算 pace
配置统一从同目录 .env 读取(见 .env.example真实环境变量优先。
"""
import argparse
import config
from data import get_dashboard_data
from renderer import DashboardRenderer
def main():
parser = argparse.ArgumentParser(description="墨水屏仪表盘:渲染并推送")
parser.add_argument("--render-only", action="store_true", help="只渲染,不推送")
parser.add_argument("--target", choices=("miao", "e1002", "push"), default="miao",
help="miao=喵喵固件 400x300 三色屏默认局域网推送e1002=reTerminal E1002 800x480 六色(产出静态 HTML 页);"
"push=本机采集 Claude/Codex 账户级用量并推送到 server.py")
args = parser.parse_args()
if args.target == "push":
from push_client import push_usage
push_usage()
return
data = get_dashboard_data()
if args.target == "e1002":
from renderer_e1002 import E1002Renderer, write_page
png = E1002Renderer().render_to_file(data, config.E1002_PNG_PATH)
html = write_page(config.E1002_HTML_PATH, png)
print(f"[渲染] 已生成 {png}")
print(f"[页面] 已生成 {html}(部署到公网 HTTPS 后填入 SenseCraft HMI 的 HTML 控件)")
return
path = DashboardRenderer().render_to_file(data, config.OUTPUT_PATH)
print(f"[渲染] 已生成 {path}")
if args.render_only:
return
from pusher import push_image
host, resp = push_image(path)
print(f"[推送] 设备 {host} 成功:{resp}")
if __name__ == "__main__":
main()