msageha/tplink-deco-be85-api
GitHub: msageha/tplink-deco-be85-api
基于 FastAPI 封装 TP-Link Deco BE85 路由器本地 API 的非官方服务,提供设备状态查询与 Wi-Fi 管理等 REST 接口。
Stars: 0 | Forks: 0
# Deco BE85 API
这是一个使用 FastAPI + Pydantic 封装 TP-Link Deco BE85 本地 Web API(即 Deco 应用程序内部调用的 API)的 REST 服务器。您可以通过本地网络进行状态获取以及 Wi-Fi 开关等操作。
## 工作原理
重现了与 Deco 管理界面相同的登录流程。
1. `POST /cgi-bin/luci/;stok=/login?form=keys` … 获取用于密码加密的 RSA 公钥
2. `POST /cgi-bin/luci/;stok=/login?form=auth` … 获取用于签名的 RSA 公钥 + `seq`
3. 为每个会话生成随机的 AES-128-CBC 密钥/IV
4. 将请求正文进行 AES 加密,并将签名进行 RSA 加密(53 字节的数据块)
- 登录时的签名: `k=&i=&h=&s=`(包含 AES 密钥/IV)
- 登录后的签名: `h=&s=`
- `hash = md5("admin" + password)` … 认证后的 endpoint 会验证此 hash
5. 通过 `form=login` 获取 `stok` 和 `sysauth` Cookie,并在后续请求中使用
加密处理位于 `src/deco/crypto.py`,登录/通信位于 `src/deco/client.py`。
## 设置
在 `.env` 中填写认证信息(变量名保持不变)。
```
USERNAME=
PASSWORD=
# 任意(デフォルト値)
DECO_HOST=http://172.16.1.1
ACCOUNT=admin # 署名 hash に使うローカルアカウント名(通常 admin のまま)
VERIFY_SSL=false
TIMEOUT=30
```
`PASSWORD` 是本地认证的主体。`USERNAME`(电子邮件)是用于云端的 TP-Link ID,
不会发送到本地 API(仅为兼容性从 `.env` 中读取)。
安装依赖(也可使用 `make setup`):
```
uv sync --extra test
```
可以通过 `make setup-env`(复制 `.env.example`)使用模板来准备 `.env`。
## 结构
采用 `src/` 布局的 virtual 项目(无需构建)。执行和测试时通过 `pythonpath=src`
/`--app-dir src`/`PYTHONPATH=src` 来解析包。
```
src/
deco/ Deco ローカル API クライアント(FastAPI 非依存・単体利用可)
crypto.py / client.py / exceptions.py
api/ FastAPI Web 層: routes.py / schemas.py / service.py
config.py Settings(pydantic-settings)
main.py FastAPI アプリ
tests/ オフライン単体テスト(deco.crypto・api.schemas)
scripts/ smoke.py(疎通) / probe.py(読み取り探索) / sniff.py(UI 復号解析)
```
`deco/` 负责协议层(加密、登录、通信),`api/` 负责 Web 层,实现了职责分离。
## 启动
```
make up-dev # = uv run uvicorn main:app --reload --app-dir src --host 127.0.0.1 --port 8000
```
- Swagger UI: http://127.0.0.1:8000/docs
- 连接路由器采用延迟登录(在首次调用 API 时登录)。遇到 401/403 或
会话过期时,会自动重新登录并重试 1 次。
### Docker
```
make build-image # docker build -t deco-be85-api:latest .
docker run --rm -p 8000:8000 --env-file .env deco-be85-api:latest
```
多阶段构建(`uv` 构建阶段 → `python:slim` 运行阶段,以非 root 用户执行)。认证信息
在运行时通过 `--env-file .env` 等方式注入(不包含在镜像中)。
## 接口
| Method | Path | 描述 |
| ------ | -------------------------- | -------------------------------------- |
| GET | `/api/health` | 服务器状态与登录情况 |
| POST | `/api/login` | 显式登录 |
| POST | `/api/logout` | 登出 |
| GET | `/api/dashboard` | 概况(网络/CPU/内存/Deco 台数/连接数)|
| GET | `/api/devices` | Deco 单元(mesh node)列表 |
| GET | `/api/clients` | 已连接客户端列表(`?online_only=true`)|
| GET | `/api/network/wan` | WAN IPv4 状态 |
| GET | `/api/network/internet` | 互联网连接信息(IPv4/IPv6) |
| GET | `/api/network/lan` | LAN / DHCP DNS / WAN IP |
| GET | `/api/network/ipv6` | IPv6 启用状态 |
| GET | `/api/network/performance` | CPU / 内存使用率 |
| GET | `/api/network/mac-clone` | MAC 克隆设置 |
| GET | `/api/wireless` | 获取 Wi-Fi 设置 |
| POST | `/api/wireless` | 按频段开启/关闭 Wi-Fi |
| POST | `/api/wireless/config` | 修改 Wi-Fi 设置(SSID/密码/enable 等)|
| GET | `/api/wireless/power` | 无线电波(DFS 支持等) |
| GET | `/api/device/mode` | 操作模式(region/workmode/sysmode) |
| GET | `/api/device/time` | 时间与时区设置 |
| GET | `/api/clients/blocked` | 被屏蔽的客户端列表 |
| GET | `/api/cloud/device-info` | 云端联动信息(model/role 等) |
| GET | `/api/system/component-info` | ERP/省电等组件信息 |
| GET | `/api/system/switch-list` | UI 功能开关 |
| GET | `/api/system/log-types` | 可导出的日志类型 |
| POST | `/api/reboot` | 重启 Deco(必须提供 `confirm=true`) |
| POST | `/api/raw` | 指向任意 endpoint 的通用透传 |
### Wi-Fi 切换示例
```
curl -X POST http://127.0.0.1:8000/api/wireless \
-H 'Content-Type: application/json' \
-d '{"band":"band5_1","network":"host","enable":false}'
```
`band` 为 `band2_4` / `band5_1` / `band6`,`network` 为 `host` / `guest`(通过 enum 进行验证)。
### 修改 Wi-Fi 详细设置 `/api/wireless/config`
针对 `admin/wireless?form=wlan` 执行 `operation:write`。可以为每个 `band`×`network`(host/guest)
指定 `enable` / `ssid` / `password` / `enable_hide_ssid` / `channel` / `channel_width` / `mode`
(仅发送指定的字段)。对于 `ssid`/`password`,**如果以明文传递,系统内部会进行
base64 编码**(因为路由器是以 base64 格式保存的)。
```
# ゲスト Wi-Fi の SSID とパスワードを変更
curl -X POST http://127.0.0.1:8000/api/wireless/config \
-H 'Content-Type: application/json' \
-d '{"band":"band5_1","network":"guest","settings":{"enable":true,"ssid":"My Guest","password":"secretpass"}}'
```
### 通用透传 `/api/raw`
可直接调用任意的 Deco endpoint。响应会直接返回已解密的完整信封
(`result`/`error_code` 或 `success`/`data`)。
```
curl -X POST http://127.0.0.1:8000/api/raw \
-H 'Content-Type: application/json' \
-d '{"path":"admin/client?form=client_list","operation":"read","params":{"device_mac":"default"}}'
```
- `path`: `admin/?form=
标签:AV绕过, Docker 部署, FastAPI, TP-Link, 智能家居, 物联网, 网络运维, 请求拦截, 路由器, 逆向工具