背景与痛点
- 米家自动化 在 iOS 上想完全后台运行,常要求 App 获得「始终定位」权限,比如连接 WiFi 自动执行操作,并且长期后台定位让我有点莫名不爽。
- 快捷指令自动化 能在锁屏时触发,快捷指令的自动化无法调用第三方软件的功能,无法在后台执行在米家直接添加到快捷指令的场景
为此,我上班摸鱼写了一个 加密中转服务( Go 自托管 / Cloudflare Worker 两种版本)来代替米家 App 完成签名、Cookie 注入。快捷指令只需向中转服务发送一段 JSON ,就能在后台控制米家,包括设备控制和场景触发。
整体方案
- 扫码登录
访问/login/qrcode,用米家 App 扫码,获得
userId / ssecurity (securityToken) / deviceId / serviceToken四个关键参数。 - 快捷指令 POST
向中转服务 POST 一段 JSON ,由服务器补齐签名后转发至https://api.io.mi.com。 - iOS 自动化触发
无需米家常驻后台,快捷指令在「到达某地点 / 连接某 Wi-Fi 」等场景触发后即刻发请求。
示例请求体:
{
"userId": "123456789",
"serviceToken": "xxx",
"deviceId": "abc123",
"securityToken": "Q0eQ7tKq...", // 即 ssecurity
"data": {
"did": "xxx",
"method": "set_props",
"params": [ ["power", 1] ]
}
}
iOS 定位坐标系坑
- 「快捷指令 ➜ 获取当前位置」返回的是 GCJ-02(与高德一致);
- 「快捷指令自动化 ➜ 到达某位置」触发条件却使用 WGS-84。
因此直接填写 GCJ-02 坐标会出现数百米偏差,导致自动化难以触发。
解决办法:先用快捷指令读取 GCJ-02 → 在线或本地转换为 WGS-84 ,再把转换后的坐标写到自动化里。
我做了一个快捷指令转换示例:https://www.icloud.com/shortcuts/5161a59573f248399e58a8584eb93468
代码与部署
https://gist.github.com/Zayrick/62701850c833c4051356268fa9afc3ff 其中包含一个 sever.go ( Go 版本)和 worker.js ( Cloudflare Worker 版本)
- Go 版本(自托管 / 内网优先)
- Cloudflare Worker 版本(无服务器快速部署)
部署详情参照 gist 中的 README.md
风险警告 ⚠️
| 风险 | 说明 |
|---|---|
| 账号安全 | 扫码登录使用真实米家账号,存在被封或 Cookie 泄露风险 |
| 网络安全 | 中转服务需走 HTTPS ,防止中间人窃听;同时禁止公网暴露调试接口 |
| 设备权限 | serviceToken/ssecurity 拥有完整设备控制权限,请加密存储 |
| 隐私泄露 | 服务器可访问全部家庭与设备信息,建议专号 + 内网部署 |
参考资料
- Do1e/mijia-api —— Python 版完整米家 API
- https://www.xiaoweigod.com/network/2235.html —— 原理参考
- iOS 坐标系差异相关文档
📚 常用米家 API
| 操作 | 请求方式 |
|---|---|
| 读取设备属性 | POST https://api.io.mi.com/app/miotspec/prop/get |
| 设置设备属性 | POST https://api.io.mi.com/app/miotspec/prop/set |
| 执行动作 | POST https://api.io.mi.com/app/miotspec/action |
| 获取设备列表 | POST https://api.io.mi.com/app/home/home_device_list |
| 获取家庭列表 | POST https://api.io.mi.com/app/v2/homeroom/gethome_merged |
| 获取场景列表 | POST https://api.io.mi.com/app/appgateway/miot/appsceneservice/AppSceneService/GetSceneList |
💡 设备控制 API 查这里:https://home.miot-spec.com
免责声明:自己玩可以,别滥用,风险自负 🫡