用户的脚本连续数月开关着 Tapo 插头(Tapo plug),插头悄然更新固件后,下一次请求返回 403 Forbidden,代码却未改动。原因在于 Tapo 应用(Tapo app)中一个名为 Third-Party Compatibility 的开关,自固件 1.4.0 起,仅当该开关开启时插头才像过去那样与第三方客户端通信,这已困扰许多人,至少九个 issue 讲述了相同情形。到了 tapo(tapo) v0.11.1 版,即作者开发的非官方 Rust 与 Python 客户端,此开关可保持关闭,仅有少数例外将在下文说明。
正文
你的脚本几个月来一直开关着 Tapo 插头。然后插头悄悄更新固件,下一次请求返回了 403 Forbidden,你的代码没改任何东西。
原因是一个叫“第三方兼容性”的开关,藏在 Tapo 应用的“我 > 第三方服务”里。自 1.4.0 固件起,插头只有开关打开时才像以前那样和第三方客户端通信。这反复坑了很多人,至少九个 issue 反映了同样情况,包括 #441、#449 和 #473。
在我非官方的 TP-Link Tapo 设备 Rust 和 Python 客户端 tapo 的 v0.11.1 版本中,这个开关可以保持关闭了,少数例外下文讲。
这是近四个月工作的核心,落在相隔一周内的三个版本:9月28日 v0.10.0、10月2日 v0.11.0、10月4日 v0.11.1。期间库还新增一类设备和两个用户呼吁已久的 Tapo 应用功能。更新日志有全部细节,下文覆盖重点与示例。
这些都适用于库的两个语言版。Python 包只是 Rust crate 的薄封装,改动同步发布、版本号相同。下面例子用 Rust,Python 调用与之对应。
我们怎么走到这一步
这是三年来第三次安全变更悄悄把第三方客户端挡在 Tapo 设备外。那个开关是第二次变更留下的。
2023:灯和插头。 当年2月,三名研究人员报告了 Tapo 设备与 app 通信的四个漏洞,范围内的人可接管账户、获知 Wi-Fi 密码。几个月后固件把原始 AES 协议换成 KLAP。TP-Link 未说明关联也未宣布,论坛提问被锁无答。所有第三方客户端包括本库都得学 KLAP。
2024:摄像头。 2023年11月,Home Assistant 集成维护者 Juraj Nyíri 报告漏洞。TP-Link 修复后,2024年4月新固件摄像头不再接受原登录。Nyíri 做了经云端的绕行方案请求发布被拒。2024年12月 TP-Link 推出应用内开关“第三方兼容性”,集成发布说明称其为本地控制的胜利。
2025:插头和灯再次中招。 2025年10月,1.4.0 固件带来新协议 TPAP,插头被塞到同一个开关后。灯在2026上半年跟进(1.4.1 至 1.4.3)。出路之前已存在:开关自2024年12月就在但默认关。TP-Link 的 FAQ 说默认禁用为确保安全,开启降低安全性。论坛里插头变砖的用户被回复 Home Assistant 不是官方支持平台。TPAP 本身从未文档化。
这个开关是个冠以友好名称的安全降级。打开它会用旧登录替代新登录,而新的更好。下文细说。
TPAP 支持
近期固件上,第三方兼容性开关决定设备说哪种协议。灯、插头、插线板或 H100 集线器开时讲 KLAP,关时讲 TPAP。摄像头从没讲过 KLAP,老协议是 AES SSL,有些关开关时拒绝它。库原本不说 TPAP,只能连开关开着的设备。
v0.11.1 加入 TPAP。需要它的灯、插头、插线板、集线器、摄像头现在可在开关关时通过 IP 或 discover_devices 使用。代码无需改:客户端自判协议并登录。
三件事需知道:
- 错误密码会锁设备。多次失败登录后 TPAP 设备暂时拒所有登录。库将错密码报为 TPAPCREDENTIALS,锁报为 TPAPAUTHATTEMPTSLIMIT。不要循环重试。
- 摄像头集线器还不说 TPAP。H200(v0.10 新增)在 1.7.5 固件无论开关都宣告 AES SSL,库走这个登录。
- 部分摄像头也不说 TPAP,看型号固件。C220 和 C510W 在 1.3.4 说 TPAP,关开关可用。C210 在 1.5.2 不说,库走 AES SSL,而关开关时摄像头拒登录,暂时只能开开关用。
新协议来的同时旧协议走了。2023年被 KLAP 替掉的原始 AES 协议还在库里,连 IP 时逐个探测灯插头要哪个,长久无固件带它,v0.11.0 删了。摄像头和摄像集线器说的 AES SSL 是近亲:同类加密包但走 HTTPS 且登录不同,这个留着。
为何 TPAP 更安全
能无视开关挺好,更有趣的是 TPAP 怎么登录。
KLAP 双方用凭据和明发随机值算哈希证明知密。密码不上线,但谁录了一次登录就能拿回家随意猜密码。会话密钥同源,猜中就能解密后续全部。
TPAP 用 SPAKE2+(RFC 9383)登录。两处改变:
- 录下的登录无法用于猜密码。交换中无可离线核对候选密码的东西。唯一试法是直连设备逐次尝试,而上文的锁止正好杜绝。
- 录下的流量保持私密。每会话密钥依赖双方为本次登录现编绝不发送的秘密。日后知密码者也解不开之前抓的会话。
开关开着时灯或插头仍宣告 KLAP 并走它登录,所以上述两点仅在关时才成立。若网络里没别的东西需第三方兼容性,现在有好理由关掉它。
其他新内容
TPAP 是大改但不是唯一。
摄像头集线器:H200 和 H500
v0.10 前库只能连 H100 集线器。H200 和 H500 不同:像 H100 那样配传感器开关,但也配摄像头存录像。
现在两者都有处理器,用 ApiClient 的 h200 或 h500 创建。discover_devices 也能找着并返回可用状态而非报错。
配对的传感器开关像 H100 那样通过 getchilddevice_list 和子处理器工作。新的是录像:可列配对摄像头、找有录像的日子、列时段内录像、下成可播 MPEG-TS 片段。
download_recording 写入任何 AsyncWrite,片段可进缓冲或直写文件;Python 版接文件路径。时间全为 UTC。完整例子在仓库的 Rust 和 Python 版。
多亏 @dominiquefournier(约30轮测 H200)和 @supermimai(测 H500)的支持。
插头日程和定时器
Tapo 应用早就有插头的“日程”和“定时器”,v0.10 库也在 PlugHandler 等加上,由 @Hueburtsonly 贡献。
日程规则在时刻或日出日落偏移触发,单次或按星期。规则存插头按自身钟走,脚本服务器网断时仍工作。还有 clockonce 等单次规则,getschedule_rules 查看,remove 清理。
定时器更简单:settimer 设1秒至24小时倒计时然后开关。gettimer 读,clear_timer 取消。插头同时只持一个,设新替旧。
MCP 服务器
tapo-mcp 这个向 AI 代理暴露设备的服务器跟进了两改:v0.5.3 起列出 H200/H500 及传感器,且支持关第三方兼容性。插头日程、定时、录像下载暂仅库有。
升级前
从 v0.9 升要注意破坏变更:旧 AES 协议移除,触发日志和温度记录字段改名,Python 枚举不等同整数。更新日志全列。
下一步
计划:
- MCP 服务器加更多:先能用量和发现缓存,录像下载看兴趣。
- H110 集线器:@skoky 在写 PR,它是红外遥控。
- 更多摄像头:现仅云台相机处理器,计划加固定相机,从 C120 始。
- 设备模拟器:作者想改善测试,多数库只能对真硬件测,模拟器可在测试者前抓坏登录。
- 或许 Node.js 封装:长期不承诺,同法可迁 Node。
若只为此库开兼容性,请升级并关闭。若设备拒登,开 issue 附型号固件。此类报告让 C210 有注明、H200 获支持。
评论
作者亲自详解非官方库适配 TP-Link Tapo 新协议的内情,指出官方“兼容开关”其实是安全降级;部分开发者感慨 AI 让闭源协议逆向易如反掌,也有读者直言术语晦涩或文风劝退。
认为第三方兼容开关实质是安全降级
- 新固件默认拦截第三方客户端,开启开关会回退到 KLAP 登录并允许离线爆破密码;关闭后使用的 TPAP 协议基于 SPAKE2+,即使日后泄露密码也无法解密既往会话,因此开关是以安全换兼容。(高赞/作者本人) > 兼容开关真会降低设备安全性,连官方常见问题自己都这么写。(@faithraven)
认为 AI 工具已极大简化闭源协议逆向
- 近期大模型搭配 IDA 或 Ghidra 等工具,让以往极耗人力的私有协议逆向变得轻而易举,甚至能自动插桩运行中的程序来枚举通信规则。(少数人) > 如今只要有二进制和马虎的指令就能逆向任意闭源协议,过去手工做九成半都不划算。(@teravor)
对技术门槛与行文质量感到困扰
- 有读者完全不认识 Tapo 等名词,自嘲非目标受众;另有人不论内容出自人还是机器,都批评原文写得像烂书一样让人读不下去。(少数人) > 不管写手是人还是人工智能,这种文风都让我宁愿去做别的事也不想继续读。(@pkilgore)