中文 English

话费接进 Home Assistant 报 3006 设备未信任:一次 Agent 拆解电信协议与手搓零云端授权实录

发布时间: 2026-10-26 · 阅读量 --
homeassistant 智能家居 AI Agent 自动化 Automation 故障排查 Troubleshooting 中国电信 China Telecom

把电费账单接进 Home Assistant 之后,我自然的下一步,就是把全家手机的话费余额与通用流量也放上家庭概览大屏。

查阅社区插件,填入手机号与电信服务密码,点击提交。等待我的不是清爽的余额图表,而是一行冰冷的报错:resultCode 3006,设备未信任。

查阅社区讨论,有人建议使用网关免密,有人甚至推荐把手机号、服务密码和短信验证码提交给第三方的未知反代托管网站。把掌握电信业务核心控制权的服务密码交由陌生服务器中转?这是任何重视家庭隐私与底层安全的人都绝不能触碰的红线。

于是,今天我让本机 AI Agent 彻底拆解了中国电信官方登录协议链:从抓包验证家庭宽带免密为何失效,到手搓一个仅在本地内存运行、零外部云端依赖的局域网授权工具;从离屏 Canvas 像素扫描攻克滑块拼图的几何漂移陷阱,到重构 Home Assistant 集成生命周期解决首刷崩溃与并发竞态。

这是一次历时整整一天的软硬件与协议攻防实录。

题图:Home Assistant 中国电信集成与 3006 破局

图 1:本文原创配图。涵盖运营商 3006 拦截分析、本地零云端授权架构与 Home Assistant 优雅接入两张手机卡的全流程。

一、需求背景:家庭数字资产的最后一块拼图

在现代家庭中,电费、水费、燃气费与通信费共同构成了家庭运行的基础消耗账本。继上次成功把网上国网电费接入 Home Assistant 后,家庭大屏已经可以直观展示每日耗电与电费结余。

然而,每个月手机套餐的花费同样是一笔不可忽视的开销。尤其是办理了宽带绑定的主副卡全家桶套餐,主卡每个月扣除固定套餐费,副卡共享通用高速流量。一旦某些月份流量超标产生扣费,或者账户余额不足导致欠费停机,宽带网络和家庭网络都会受到直接冲击。

我希望达到的目标非常明确:

  1. 在 Home Assistant 我的家概览面板中,专门开辟一个手机套餐专属分区。
  2. 实时呈现每个号码的电信账户余额、当月实际消费、剩余通用流量、已用流量以及剩余通话分钟数。
  3. 当流量使用超过 90% 或者余额低于预警值时,触发家庭自动化语音播报与推送提醒。

我们选用了社区主流的电信集成组件。原以为只需在集成配置界面输入手机号与六位服务密码便能大功告成,但现实往往在第一步就给你当头一棒。

二、问题表现:3006 设备未信任与凭空消失的实体

点击保存配置后,Home Assistant 前端直接弹出了红色叹号:未知错误。进入后台日志排查,终端赫然打印着电信网关的真实拦截响应:

2026-10-26 15:42:11.890 ERROR (MainThread) [custom_components.china_telecom.api] 
Telecom login failed: resultCode=3006, resultMsg=设备未信任, deviceId=None

不仅登录被拒,更奇怪的是:打开 Home Assistant 实体注册表,关于该集成的传感器数量竟然为 0。

真实截图:Home Assistant 后台日志打印的 3006 设备未信任与加载中断

图 2:Home Assistant 核心日志真实截图。错误码 3006 表明电信服务端执行了设备可信度校验,而旧版集成因异常中断导致实体完全未能完成注册。

这构成了双重打击: 首先,电信服务端明确拒绝未授权设备仅凭服务密码查询敏感财务数据; 其次,开源集成在设计上存在缺陷,它在 setup 初始化阶段直接执行了阻塞刷新,刷新失败即刻抛出未捕获异常,导致本该生成的 18 个传感器实体连一个占位符都没留下。

翻阅开源社区 Issues,许多玩家对此束手无策,有的甚至被引导去访问某些不知名个人搭建的“DeviceId 算号授权工具站”。

三、小学生秒懂比方:银行柜台、口头密码与专用门禁芯片卡

为了让所有人,包括对计算机底层不熟悉的小朋友,都能彻底搞明白这背后的逻辑,我们来打一个非常形象的生活比方:

想象一下,电信运营商的服务器是一家戒备森严的银行金库。金库里放着你家手机号码的所有账单资产。

  1. 服务密码好比是口头暗号:它是一串只有六位数的简单数字。哪怕是个小学生也明白,只要有人在旁边偷听或者猜密码,很容易就能冒充你。如果仅凭口头暗号就能从柜台取走账单和明细,银行柜员一定会心惊胆战。
  2. 短信验证码好比是现场排队号票:银行柜员当着你的面,往你的手机上发了一张印着 6 位随机数的一次性号票。你必须把手机带在身上,亲眼看到号票并递给柜员。这能证明你本人此刻确实在场。但问题在于:智能家居每小时都要查一次余额,总不能每小时往你手机发一条短信把你吵醒吧?
  3. 授权设备标识 DeviceId 好比是银行颁发的专属门禁芯片卡:你亲自带着口头暗号和排队号票去了一次柜台,柜员确认是你本人后,把一张经过硬件加密的专属门禁芯片卡发给了你的 Home Assistant。以后,Home Assistant 每次只要刷这张芯片卡并附带口头暗号,柜员就知道:这是主人亲口批准过的家庭管家设备,允许安全放行!
  4. 报错 3006 的本质:Home Assistant 刚装好的时候,就像一个两手空空的陌生人,跑到银行柜台只喊了一句口头暗号。柜员立刻按响警报大喊:设备未信任!你的专属门禁芯片卡在哪里?

原创比方图:银行柜台与专用门禁芯片卡

图 3:原创概念图解。用口头暗号、排队号票和专属门禁芯片卡,通俗拆解电信服务密码、短信验证码与 DeviceId 的信任链条。

换句话说,要让 Home Assistant 获得持续查询数据的特权,核心就在于:合法合规地走完一次官方信任绑定,为你的机器取得这一枚 DeviceId 门禁卡。

四、踩坑排查一:家庭宽带尝试免密登录为何必定失败?

在寻求解决方案时,我们最先想到的捷径是:电信 App 不是支持一键免密登录吗?电信开放平台也有一个天翼免登网关。能不能直接通过网关取号,连短信都不用发就拿到凭据?

带着这个设想,Agent 编写了网关探测脚本,模拟电信移动客户端发起请求: 访问目标:open.e.189.cn 的 autoLogin 接口,调用 getPreMobileUrl.do。 为了防止被识别,我们还在 HTTP 请求头中将网络制式伪装为蜂窝网络。

然而,服务端返回的页面却泼了一盆冷水: 当前环境不支持免密登录。

真实截图:家庭宽带网络下探测电信一键免登接口的报错页面

图 4:真实手机浏览器与探针截屏。即便伪装了网络环境,家庭宽带仍然无法通过电信免密登录检测。

底层根本原因剖析: 免密登录的本质,是运营商基站对手机 SIM 卡硬件芯片的直接 RADIUS/AAA 鉴权。当手机处于 4G 或 5G 移动蜂窝网络下时,基站数据链路层直接感知到了 SIM 卡的 IMSI 与物理密钥。 但是,当你的电脑或手机连接了家里的 WiFi 宽带时,数据包走的是光猫、EPON/GPON 光纤和以太网协议。运营商接入网只认宽带的 PPPoE 账号,物理上根本不存在任何 SIM 卡通道!服务端检测不到底层蜂窝鉴权头,自然拒绝签发免密凭证。

结论:放弃利用家庭宽带免密取号的幻想,必须直面标准的官方验证码与短信挑战流程。

五、踩坑排查二:第三方云端托管代验的致命安全陷阱

在 GitHub 和各大智能家居论坛上,有部分作者提供了一些临时的第三方 Web 工具,号称输入手机号就能一键获取 DeviceId。

我们在安全审计阶段,坚决否决了这种路径。

原创架构对比图:第三方云端代验与本地零云端自授权

图 5:原创安全架构对比图。左侧第三方反代存在严重隐私出境与撞库隐患,右侧自研本地内存工具实现端到端安全闭环。

让我们看看第三方代验工具潜藏的巨大风险:

  1. 撞库与提权风险:普通用户的电信服务密码通常是 6 位纯数字,很多人为了省事,家庭各张副卡甚至银行查询密码都高度相似。一旦第三方服务器记录了你的手机号与服务密码,黑客极易进行撞库攻击。
  2. 短信拦截与增值业务订购:在授权过程中,需要输入短信验证码。短信验证码在电信体系内具备最高权限,可以用于开通收费套餐、变更实名业务。将实时短信验证码交由第三方服务器转发,等同于将自己的通信底裤拱手让人。
  3. 凭据被持久化记录:生成的 DeviceId 是长效受信任设备标识。如果第三方平台将 DeviceId 偷偷落盘,对方日后就能随时以你的受信任设备身份发起登录。

家庭自动化的核心前提是安全与自控。我们绝不能为了在看板上看个话费,把全家的通信安全押注在陌生服务器的人品上。

唯一正确的工程道路:手搓一个完全运行在本机、只和官方 189.cn 通信的纯本地授权工具!

六、深度排障:滑块拼图对齐悬案与离屏 Canvas 像素扫描

明确了方向后,Agent 开始还原中国电信官方客户端登录协议链:

然而,在开发本地 Web 界面时,一个极其诡异的前端现象出现了: 用户在界面上手动拖动滑块,明明肉眼看着拼图已经分毫不差地嵌入了背景缺口,点击发送短信,官方接口却频频返回:验证码错误或滑块位置不匹配!

原创技术图解:滑块透明留白与离屏 Canvas 像素级扫描计算

图 6:原创技术细节解析。电信拼图图片边缘存在透明留白,直觉映射会导致严重坐标漂移;通过离屏 Canvas 扫描非透明像素成功实现像素级对齐。

Agent 迅速启动了 systematic-debugging 深入排查,终于揪出了元凶: 电信接口下发的滑块拼图(slider_piece)PNG 图片,并不是紧凑裁切的! 图片本身的画布宽度可能有 150 像素,但实际带颜色的拼图碎片仅仅位于中间的 44 像素范围,周围全是一圈完全透明的 Alpha 留白通道!

如果前端开发者偷懒,直接将滑动条的 0 到 100 映射为整张图片的 left 坐标,那么滑动条计算出的坐标是基于透明画布原点的,而肉眼对准的却是中间的不透明碎片。两者之间存在高达 18 到 30 个像素的物理偏差!

解决方案: 我们在前端实现了一个智能的离屏 Canvas 扫描算法(opaqueBounds):

  1. 在内存中创建一个隐形 Canvas,将拼图绘制上去。
  2. 通过 getImageData 获取所有像素的 RGBA 原始字节数组。
  3. 循环遍历每个像素的 Alpha 透明度通道,只有当 Alpha 大于 128 时,才判定为有效实体像素,从而动态计算出不透明碎片的精确外接矩形(bounds.left、bounds.top、bounds.width)。
  4. 计算出真实的滑动总行程:travel = background.naturalWidth - bounds.width。
  5. 最终滑动偏移换算公式:nativeLeft = normalizedDistance * travel - bounds.x。
  6. 再乘上客户端当前视口缩放比例 scale = background.clientWidth / background.naturalWidth。

经过这一套严密精确的数学转换,滑动条的移动与背景缺口达到了物理级严丝合缝。拖动滑块,一次成功通过官方校验!

七、HA 架构重构:解决丢实体与多账号并发崩溃

在拿到 DeviceId 之前,我们回过头来彻底根治了 Home Assistant 集成代码里的两处严重缺陷。

原创架构图:集成生命周期修复与并发安全锁

图 7:Home Assistant 集成补丁架构图。预注册 18 个实体确保容错,加设异步并发锁杜绝多账号前端资源冲突。

缺陷一:首刷失败导致实体未能注册

旧版集成代码中,async_setup_entry 第一件事就是 await coordinator.async_config_entry_first_refresh()。在没有 DeviceId 的情况下,这次刷新必然抛出 3006 异常。异常直接中断了整个加载函数,排在后面的 async_add_entities 永远没有机会执行!这就导致用户在界面上永远看不到实体。

修复逻辑: 将生命周期颠倒过来:先无条件向 Home Assistant 注册全部 18 个传感器(此时状态优雅标记为 unavailable),随后通过 hass.async_create_task 触发后台非阻塞刷新。这样一来,即便网络波动或凭据未配,所有实体依然稳稳驻留在注册表中;一旦补齐 DeviceId,数据立即热加载点亮!

缺陷二:多号码并发注册前端卡片导致 setup_error

家庭往往有两张甚至多张卡。当我们在 Home Assistant 中配置了两个电信号码时,系统在重启时会并发加载两个条目。旧版集成在条目启动时都会调用 hass.http.register_static_path 注册自定义卡片资源。 由于缺乏互斥保护,第二个条目在注册同一个路径时直接抛出路由已存在的致命异常,导致副卡永远显示 setup_error。

修复逻辑: 在 Python 模块全局引入 asyncio.Lock(),并维护一个全局 card_registered 标记位。当第一个账号获得锁并成功注册资源后置位,后续账号检测到标记直接安全跳过。从此,无论添加多少个家庭号码,系统都能平滑并发启动!

八、交付物:自研开源电信设备授权工具

我们将上述完整的协议链、安全防护机制与离屏 Canvas 算法,封装成了一个完全本地运行的标准化开源工具:telecom-phone-device-id-tools。该项目现已在 GitHub 完全开源,提供开箱即用的本地服务脚本与完备的单元测试集。

真实截图:自研本地授权工具成功完成滑块、短信登录并签发 DeviceId

图 8:本地 Web 授权工具真实截屏。支持局域网设备打开,内存短期会话,安全输出由电信官方签发的合规 DeviceId。

该工具具备以下硬核安全特性:

  1. 官方端到端直连:所有 HTTP 请求仅允许发往 appgologinsz.189.cn、appgologin.189.cn 和 appfuwu.189.cn,强制启用 HTTPS 证书指纹校验,禁止一切重定向。
  2. 纯内存会话生命周期:手机号、服务密码、短信验证码和生成的 DeviceId 全部保存在 Python 进程内存中,不记日志、不落盘、不上传任何服务器。
  3. 局域网访问控制:支持绑定局域网 IP(–host 0.0.0.0),启动时仅在终端打印一次高熵随机访问令牌(Token)。任何无令牌或令牌错误的请求一律返回 401 拒绝。
  4. 阅后即焚与超时销毁:每次授权使用独立会话,单次授权完成后访问令牌立即注销,会话在 10 分钟后强制过期清空内存。

真实截图:53 项单元测试与协议契约测试全部通过

图 9:本地自动化测试控制台截图。53 项覆盖官方协议契约、会话过期、访问控制与实体生命周期的单元测试全部通过。

九、全平台一键自动化套件与执行双路径

为了方便所有读者直接复用今天的成果,我将整个工具链整理成了可直接下载的 电信设备授权与集成持久化套件,内附适用于三大操作系统的脚本入口。

套件完全基于标准 Python 与各操作系统原生 Shell,无需安装 Docker,也不依赖任何第三方付费或自动化服务。

方法一:人工参数配置与脚本自动化执行

首先确保本地已安装 Python 3.10 及以上环境,并安装两个官方加密依赖库:

pip install requests pycryptodome

在终端私下导出你的 Home Assistant 访问地址与专用长期令牌(非必选,用于自动化验收):

export HOME_ASSISTANT_URL="http://<YOUR_HA_IP>:8123"
export HOME_ASSISTANT_TOKEN="<YOUR_LONG_LIVED_TOKEN>"

根据你当前的操作系统,选择对应的脚本执行:

1. macOS 27 入口

# 检查网络连通性与官方网关状态
./scripts/telecom_auth_toolkit_macos27.zsh check

# 启动本地授权服务(支持手机局域网扫码/打开)
./scripts/telecom_auth_toolkit_macos27.zsh serve

# 在浏览器中完成短信授权后,只读核对 HA 实体状态
./scripts/telecom_auth_toolkit_macos27.zsh verify

2. Ubuntu 26.04 入口

# 检查运行依赖与环境
bash scripts/telecom_auth_toolkit_ubuntu2604.sh check

# 启动本地隔离授权服务
bash scripts/telecom_auth_toolkit_ubuntu2604.sh serve

# 验证实体与实时话费流量数据
bash scripts/telecom_auth_toolkit_ubuntu2604.sh verify

3. Windows 11 PowerShell 入口

# 执行系统连通性检查
.\scripts\telecom_auth_toolkit_windows11.ps1 check

# 启动本地设备授权服务
.\scripts\telecom_auth_toolkit_windows11.ps1 serve

# 验收 Home Assistant 实体传感器上线状态
.\scripts\telecom_auth_toolkit_windows11.ps1 verify

执行流程:

  1. 运行 serve 命令,终端会打印出形如 http://192.168.x.x:8765/?token=… 的唯一私密地址。
  2. 用同一 WiFi 下的手机或电脑浏览器打开该地址,输入手机号并点击获取滑块。
  3. 拖动滑块对准缺口,点击发送短信;输入收到的 6 位短信验证码,点击提交。
  4. 页面瞬间返回由中国电信官方颁发的专属 DeviceId。点击复制按钮。
  5. 打开 Home Assistant,在已配置的中国电信集成选项中,将该 DeviceId 粘贴到短信授权 DeviceId 栏目中并保存。
  6. 集成瞬间重载,18 个传感器全部点亮!

方法二:把验收与配置任务托管给本地 Agent

如果你习惯使用本地 AI 编程助手(如基于命令行或 IDE 的 Agent),你可以将下面的标准任务说明直接交付给 Agent:

目标:完成中国电信集成在 Home Assistant 中的设备授权与面板搭建。
原则:严禁将手机号、密码、短信验证码和凭据写入日志或上传外部网络;所有外发请求必须使用 HTTPS 且仅限 189.cn 官方域名。
步骤:
1. 运行本地电信授权套件 check 模式,验证官方网关与 HA API 可达性。
2. 启动 serve 服务,打印单次随机令牌 URL,等待用户在本地浏览器人工完成滑块与短信校验。
3. 捕获生成的官方 DeviceId,安全注入对应手机号的 HA 集成 options 配置条目。
4. 触发集成热重载,持续轮询 /api/states 直至 18 个传感器状态脱离 unavailable。
5. 自动检查剩余流量、话费余额、当月消费和通话时长字段是否为真实非空数字。
6. 构建 Lovelace 概览看板中的“手机套餐”卡片分区,并生成前后配置对比报告。

这种模式把琐碎的 API 交互、配置刷新和数据校验交给 Agent,而把涉及资金安全的人工短信核验牢牢掌握在自己手中。

十、终态验收:让数字在家庭大屏上优雅流动

两张手机卡分别完成授权后,数据如同清泉一般涌入了 Home Assistant。

真实截图:Home Assistant 概览面板手机套餐分区实时卡片

图 10:Home Assistant 我的家面板真实截图。话费余额、剩余通用流量、本月消费与通话时长清晰呈现。

真实截图:Home Assistant 开发者工具中展示的电信实体详细属性

图 11:Home Assistant 开发者工具实体状态截图。涵盖通用流量、专用流量、使用率、更新时间等 18 个完整传感器。

我们编写了自动生成仪表盘分区的维护脚本 phone_section.py。无论日后增加副卡还是更换号码,重跑一次脚本便能自动从 china_telecom 实体中提取号码标签,并在家庭概览中重构优雅的卡片排版。

回顾整个验收过程,我们严格恪守以下六项完工指标:

  1. 官方网关直连性:所有鉴权均有 TLS 证书担保,无第三方中转;
  2. 实体完整性:每个号码均保留 18 个标准传感器,无遗漏字段;
  3. 数据真实性:余额精确到分,流量精确到 0.01 GB,非模拟假数据;
  4. 并发安全性:多账号在 Core 重启时串行化加载,无 setup_error 冲突;
  5. 重启自愈性:HA 重启后自动读取配置内 DeviceId,无需再次人工发短信;
  6. 隐私零外泄:本地授权服务进程退出后,内存瞬间归零,磁盘无任何敏感残留。

原创排障决策树图解

图 12:原创排障决策树矩阵。汇总 3006 报错、滑块位移偏差、并发冲突与宽带免密失败的诊断逻辑。

Q&A:你可能关心的几个硬核疑问

问:获取一次 DeviceId 后,有效期有多长?后续还需要反复发短信吗?

答:中国电信官方签发的 DeviceId 属于长效受信任硬件绑定凭证。在运营商不发生重大风控策略调整的前提下,该凭证通常长期有效(数月至数年)。只要不主动在电信营业厅解绑设备,日常每小时的轮询只需使用 DeviceId 配合服务密码即可完成静默鉴权,无需再次人工接收短信。

问:既然已经有了 DeviceId,为什么还需要电信服务密码?

答:回到我们之前的银行比方:DeviceId 是门禁芯片卡,服务密码是口头暗号。电信 v1 查询接口要求两者同时出示,以防止仅持有硬件标识的盗刷行为。两层保护相辅相成。

问:这个本地工具支持中国移动或中国联通吗?

答:本项目专注解决中国电信集成独特的 3006 设备未信任与滑块短信协议链。对于中国联通,社区方案通常依赖微信小程序的 OpenID 抓包;对于中国移动,目前我们实现了通过纯 HTTP 抓包 autoLogin 会话的方式接入。三家运营商的安全鉴权体系各不相同。

问:为什么工具一定要用 –host 0.0.0.0 开放局域网?只在 127.0.0.1 运行不行吗?

答:完全可以。如果你的电脑本身带有图形界面和桌面浏览器,使用默认的 127.0.0.1 最为安全。之所以支持局域网开放,是因为许多用户的 Home Assistant 和辅助脚本运行在没有显示器的软路由、NAS 或 Linux 服务器上,开放局域网允许用户舒服地躺在沙发上,用同一局域网下的手机浏览器滑动拼图并收取短信。

参考资料与开源致谢

本文所涉及的六张真实截图均采集自本人家庭运行环境,已隐去完整 IP、内部主机名与手机号码;六张原创架构图与图表均为矢量绘制。

评论

使用 GitHub 登录后即可评论,中英文版本共用同一讨论。 在 GitHub 上参与讨论

本文阅读量 --