TP-Link BE3600路由器自动化
一个Python库,用于使用Playwright浏览器自动化来自动化TP-Link BE3600(和类似)路由器。该工具通过直接控制web界面绕过路由器的复杂加密方案。
为什么存在
TP-Link BE3600路由器为其API使用复杂的加密方案:
- RSA加密用于密钥交换
- AES-GCM用于请求/响应加密
- 使用序列号生成复杂签名
该库使用 Playwright浏览器自动化 直接与路由器的web UI交互。浏览器本机处理所有加密。
特性
- 登录/身份验证 -基于浏览器的自动登录
- 端口转发管理 -列出、添加和管理端口转发规则
- DHCP设置 -查看DHCP配置
- 网络状态 -获取路由器状态和连接的设备
- 电脑屏幕截图工具 -通过捕获UI屏幕截图进行调试
- MCP服务器 -用于AI集成的模型上下文协议服务器
支持的路由器
- TP-Link BE3600(双频Wi-Fi 7)- 主要目标
- 可以使用类似的web界面与其他TP-Link路由器配合使用
安装
先决条件
- Python 3.10+
- Chromium浏览器(由Playwright自动安装)
从源代码安装
# Clone the repository
git clone https://github.com/consigcody94/mcp-tplink-router.git
cd mcp-tplink-router
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -e .
# Install Playwright browsers
playwright install chromium
# On Linux, you may need additional dependencies
sudo apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 \
libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 \
libxrandr2 libgbm1 libasound2快速开始
1.配置环境
创建 .env 文件:
TPLINK_HOST=192.168.0.1
TPLINK_PASSWORD=your_router_password
TPLINK_USERNAME=admin2.基本用法
from mcp_tplink_router.be3600_playwright import BE3600PlaywrightClient
# Initialize the client
client = BE3600PlaywrightClient(
host="192.168.0.1", # Your router's IP
password="your_password" # Router admin password
)
# Login
if client.login():
print(f"Logged in! STOK: {client.stok}")
# Get port forwarding rules
rules = client.get_port_forwarding()
for rule in rules:
print(f"{rule['name']}: {rule['external_port']} -> {rule['internal_ip']}:{rule['internal_port']}")
# Always logout when done
client.logout()
else:
print("Login failed")3.添加端口转发规则
from mcp_tplink_router.be3600_playwright import BE3600PlaywrightClient
client = BE3600PlaywrightClient("192.168.0.1", "your_password")
if client.login():
# Add a single port forward
client.add_port_forward(
name="Web Server",
external_port="80",
internal_ip="192.168.0.100",
internal_port="80",
protocol="TCP" # "TCP", "UDP", or "All"
)
# Add a port range (e.g., for VoIP/RTP)
client.add_port_forward(
name="VoIP RTP",
external_port="10000-10100",
internal_ip="192.168.0.50",
internal_port="10000-10100",
protocol="UDP",
is_port_range=True
)
client.logout()API 参考
BE3600剧作家客户端
构造函数
BE3600PlaywrightClient(host: str, password: str, username: str = "admin")| 参数 | 类型 | 说明 |
|---|---|---|
host | str | 路由器IP地址(例如“192.168.0.1”) |
password | str | 管理员密码 |
username | str | 管理员用户名(默认:“Admin”) |
方法
| 方法 | 返回 | 描述 |
|---|---|---|
login() | bool | 使用路由器进行身份验证 |
logout() | None | 关闭浏览器并清理 |
get_port_forwarding() | List[Dict] | 获取所有端口转发规则 |
add_port_forward(...) | bool | 添加新的端口转发规则 |
get_status() | dict | 获取路由器状态 |
get_devices() | List[Dict] | 获取已连接的设备 |
get_dhcp_settings() | dict | 获取DHCP配置 |
take_screenshot(path) | str | 截图调试 |
端口转发规则格式
{
"name": "Web Server",
"internal_ip": "192.168.0.100",
"external_port": "80",
"internal_port": "80",
"protocol": "TCP",
"status": ""
}完整示例:FreePBX/VoIP设置
#!/usr/bin/env python3
"""Configure port forwarding for FreePBX/VoIP."""
import os
from dotenv import load_dotenv
from mcp_tplink_router.be3600_playwright import BE3600PlaywrightClient
load_dotenv()
ROUTER_HOST = os.getenv("TPLINK_HOST", "192.168.0.1")
ROUTER_PASSWORD = os.getenv("TPLINK_PASSWORD")
FREEPBX_IP = "192.168.0.169"
def main():
client = BE3600PlaywrightClient(ROUTER_HOST, ROUTER_PASSWORD)
if not client.login():
print("Failed to login to router")
return
try:
# Add SIP signaling port (UDP 5060)
print("Adding SIP port forwarding...")
client.add_port_forward(
name="FreePBX SIP",
external_port="5060",
internal_ip=FREEPBX_IP,
internal_port="5060",
protocol="UDP"
)
# Add RTP media ports (UDP 10000-20000)
print("Adding RTP port range...")
client.add_port_forward(
name="FreePBX RTP",
external_port="10000-20000",
internal_ip=FREEPBX_IP,
internal_port="10000-20000",
protocol="UDP",
is_port_range=True
)
# Verify rules were added
print("\nCurrent port forwarding rules:")
rules = client.get_port_forwarding()
for rule in rules:
print(f" {rule['name']}: {rule['external_port']} -> "
f"{rule['internal_ip']}:{rule['internal_port']} ({rule['protocol']})")
finally:
client.logout()
if __name__ == "__main__":
main()MCP服务器使用情况(AI集成)
此软件包包括一个MCP(模型上下文协议)服务器,用于与Claude Desktop和其他AI助手一起使用。
配置Claude桌面
添加 ~/.config/claude/claude_desktop_config.json:
{
"mcpServers": {
"tplink-router": {
"command": "/path/to/mcp-tplink-router/venv/bin/python",
"args": ["-m", "mcp_tplink_router"],
"env": {
"TPLINK_HOST": "192.168.0.1",
"TPLINK_USERNAME": "admin",
"TPLINK_PASSWORD": "your_password"
}
}
}
}可用的MCP工具
| 工具 | 说明 |
|---|---|
router_status | 获取路由器状态,包括广域网信息 |
list_connected_devices | 列出所有连接的设备 |
list_port_forwarding | 列出所有端口转发规则 |
add_port_forwarding | 添加新的端口转发规则 |
router_diagnostics | 获取诊断信息 |
运作原理
┌─────────────────────────────────────────────────────────────┐
│ Your Python Script │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ BE3600PlaywrightClient │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 1. Launch headless Chromium via Playwright │ │
│ │ 2. Navigate to router web interface │ │
│ │ 3. Fill login form, click submit │ │
│ │ 4. Capture STOK from network requests │ │
│ │ 5. Store sysauth cookie │ │
│ │ 6. Use JS injection for Vue.js UI interaction │ │
│ │ 7. Parse page content for data extraction │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ TP-Link BE3600 Router │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Vue.js Web Interface │ │
│ │ - RSA/AES-GCM encrypted API │ │
│ │ - Handled natively by browser JavaScript │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘关键洞察:我们没有对复杂的加密进行逆向工程,而是让浏览器的JavaScript处理它。Playwright自动化了浏览器,我们从渲染的DOM中提取数据。
故障排除
“找不到密码字段”
- 路由器的web界面可能尚未完全加载
- 增加客户端的等待时间
- 验证路由器是否可以在指定的IP上访问
“登录失败”
- 验证您的密码是否正确
- 确保没有其他管理员会话处于活动状态
- 请先尝试手动访问路由器web界面
Chromium在Linux上崩溃
安装所需的依赖项:
sudo apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 \
libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 \
libxrandr2 libgbm1 libasound2使用屏幕截图进行调试
client = BE3600PlaywrightClient(host, password)
if client.login():
client.get_port_forwarding()
client.take_screenshot("/tmp/debug.png")
print("Screenshot saved!")
client.logout()项目结构
mcp-tplink-router/
├── src/
│ └── mcp_tplink_router/
│ ├── __init__.py
│ ├── be3600_playwright.py # Main Playwright-based client
│ ├── be3600_crypto.py # Direct API client (experimental)
│ ├── server.py # MCP server implementation
│ └── tplink_client.py # Generic TP-Link client
├── examples/
│ ├── list_rules.py
│ ├── add_port_forward.py
│ └── freepbx_setup.py
├── pyproject.toml
├── README.md
├── LICENSE
└── .env.example贡献
欢迎投稿!请随时提交问题和拉取请求。
# Development setup
git clone https://github.com/consigcody94/mcp-tplink-router.git
cd mcp-tplink-router
python -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
playwright install chromium许可证
MIT许可证-请参阅 许可证 了解详情。
免责声明
此工具仅供个人使用。按照路由器的服务条款负责任地使用。作者不对该工具造成的任何误用或损坏负责。
致谢
- 剧作家 用于浏览器自动化
- tplinkrouter6u 用于加密研究
