Skip to content

About

95598 State Grid browser sidecar + its HA config surface (pairs with tiejiang29/state_grid)

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

6 Commits

Folders and files

Repository files navigation

国家电网 · 浏览器兜底容器(state_grid_docker)

95598 站点 2026-09 升级后,网页接口把会话密钥挪进了浏览器页面:服务端用客户端公钥加密每一个响应,私钥只存在于页面的 Vuex 里。离线 HTTP 客户端因此解不开响应,抓下来的 header/cookie 也没法重放(2026-09-26 实测)。要拿网页那份数据,就必须真的开一个浏览器。

这个仓库是那条兜底路的家,分两半:

半边 是什么
custom_components/state_grid_docker/ HA 集成:保存容器要读的 LLM 配置与登录标识,并显示容器每轮跑完的回执
sidecar/ Docker 容器:真浏览器登录、解验证码、抓响应,POST 给 state_grid 的 webhook

电表实体仍然全在 state_grid 那边,这个集成不复制第二套。装不装它都不影响 state_grid 的 App 通道取数——它是给"网页那份数据"和"知道容器昨天跑没跑成"准备的。

为什么还需要它

state_grid 自带的 App 通道已经能供日电量、余额、表清单、按年与按月账单;下面这些是网页那条路独有的:

  • 阶梯 / 抄表读数(c04/f03)。⚠️ 实测站点升级后这个接口回来的载荷里已经没有 readList/billRead 那组键,两条路都算不出读数,"上个月抄表"目前恒为 0。留着这条路的理由只剩"以后接口再变回来"。
  • 任何只有真实浏览器能过的页面(比如以后新增的报表)。

安装

1. HA 集成(HACS)

  1. HACS → 集成 → 探索并添加自定义仓库:https://github.com/tiejiang29/state_grid_docker,类别 集成
  2. 下载 → 重启 HA
  3. 设置 → 设备与服务 → 添加集成 → 搜「国家电网 · 浏览器兜底容器」
  4. 填:容器登录用的手机号、备用邮箱(选填)、LLM API Key、LLM Base URL、模型 ID

LLM 两项在这个集成里是必填的——浏览器兜底一定要能解点选/滑块验证码,没大模型等于装一个跑不动的容器。

配置写进 .storage/state_grid_docker.config(键:llm_api_key/llm_base_url/llm_model/account/email_account/status_webhook_id),容器只读它,改完不用重启容器。

升级:集成那半边和 state_grid 一样——HACS → 集成 → 「重新下载」→ 重启 HA(HACS 只认已发布的 release,草稿不算新版本)。容器那半边必须重建镜像才拿到新代码:sgcc_sidecar.py 等是 build 时 COPY 进镜像的,git pull 之后 docker compose up -d 不会更新它们,要走 docker compose build 再 up -d。

2. 容器

cd sidecar
cp docker-compose.env.example .env      # 填真值,然后 chmod 600 .env
docker compose up -d --build
docker compose exec sgcc-sidecar /app/run_once.sh     # 手动跑一轮看看

想让 HA 界面当配置的权威,就打开 docker-compose.yml 里那行只读挂载(挂 HA 的配置目录,不是那个文件),并在 .env 里设:

SGCC_HA_STORE=/ha-config/.storage/state_grid_docker.config

必须挂目录:HA 写 .storage 是"新建临时文件再改名",绑单个文件会把容器钉在旧 inode 上,之后 HA 改多少遍容器里读到的都是老内容。

HA_WEBHOOK_URL / HA_WEBHOOK_TOKEN 指向的是 state_grid 的 webhook(它首启时把 id 打进 HA 日志)。

密码只能从 .env 来

store 里的 password 是 32 位大写 MD5 摘要,而登录框要明文——填摘要进去前端会再哈希一次,等于密码错误。所以 SGCC_PASSWORD 继续只放 .env(chmod 600,不进 argv、不进日志、不提交)。

状态实体

容器每轮结束会往这个集成的 webhook 回执一次,HA 里得到一个诊断实体「上次成功运行」(属性带本轮结果、原因、电表数、推送份数、入库份数)。超过 36 小时没有成功过就说明这条路断了。

只有"逐表取数 + 推送"那条日更路径才回执;--check、dry-run、探针都不算一轮,不会把时间写成假的。容器连浏览器都没起来的那条失败分支(缺标识/缺密码)由 run_once.sh 用 --report-fail 补一次。没挂 store 时只是没有状态可见性,取数不受影响。

轮询与登录策略

run_once.sh 一轮的做法:先 --harvest-only 复用 profile 里还没过期的会话(不花登录额度),拿不到才真登录;主标识被拒就换备用邮箱只换一次——同一标识短时间内反复打会招来 RK001(实测过两次)。run_daily.sh(容器默认 CMD)按 SGCC_RUN_AT 每天一轮,失败后 SGCC_RETRY_MIN 分钟重试一次。

退出码:0 成功 / 2 参数或缺标识或缺密码 / 3 登录没完成 / 5 profile 里没有可用会话(含"会话看着还在但逐表一页都取不到数")/ 7 登录成功却没取到数据。

浏览器身份存在 /data

/data 里是 Chrome profile、最近一次抓取结果和每轮日志。那个 profile 就是浏览器身份(瑞数 / TDID / TDC_itoken 都在里面),删掉它等于要靠真实登录重新养一个——卷可以重建容器,身份不能重建。

Vendored 代码与许可

  • sidecar/captcha_solver/ 从 https://github.com/renxiaoyaoo/ha-95598 原样复制(Apache-2.0,见 sidecar/LICENSE.ha-95598),保持不改动以便继续跟上游合并。
  • sidecar/click_captcha_solver.py 是从 state_grid(MIT)搬过来的那份点选解算器。它以前住在集成包里、容器再 COPY 过去复用;集成删掉网页登录后它就只有这一个主人,不再有"两处漂移"的问题。
  • 其余按根 LICENSE(MIT)。

Windows 上直接跑(不进容器)

pip install -r requirements.txt
SGCC_PASSWORD='...' python sgcc_sidecar.py --account [email protected] --check     # 不花登录额度
SGCC_PASSWORD='...' python sgcc_sidecar.py --account [email protected] --captcha llm --by-meter /electricityCharge --push

--user-data-dir 必须是绝对路径,否则 chromedriver 会在启动时崩(DevToolsActivePort file doesn't exist)。

免责声明

只访问您自己账号的数据,凭证只留在本地 .env 与 HA 的 .storage 里。国网接口非公开、随时可能变更;请勿用于商业用途。

About

95598 State Grid browser sidecar + its HA config surface (pairs with tiejiang29/state_grid)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages