MYTOS API 接口文档
文档版本: v3 | 更新日期: 2026-03-20
目标用户: Android 开发者、集成商、自动化测试人员
文档类型: 开发者参考手册
📚 快速导航
基础信息
接口目录
- 下载文件
- 获取剪贴板内容
- 设置剪贴板内容
- 查询 S5 代理状态
- 设置 S5 代理
- 停止 S5 代理
- 设置 S5 域名过滤
- 接收短信
- 上传 Google 证书
- ADB 切换权限
- 导出 app 信息
- 导入 app 信息
- 虚拟摄像头热启动
- 后台保活
- 屏蔽按键
- 批量安装 apks/xapk 分包
- 版本查询
- 截图功能
- 自动点击
- 文件上传
- 容器信息
- 通话记录
- 刷新定位
- 谷歌 id
- 安装面具
- 添加联系人
- webrtc 播放器
- 获取后台允许 root 授权的 app 列表
- 指定包名是否允许 root
- 设置虚拟摄像头源和类型
- 获取 APP 开机启动列表
- 设置指定 APP 开机启动
- IP定位
- 设置语言和国家
- 获取设备截图
- 更新指纹信息
- 设置摇一摇状态
- 设置应用权限
安卓 APP 端口基础映射
Android 客户端自定义填写端口参数
桥接模式:
| 配置项 | 填写值 | 功能说明 |
|---|---|---|
| 输入 IP | 192.168.x.x | 公网可以被访问的 ip |
| TCP Port | 固定值:10000 | 投屏画面推流端口 用于将手机屏幕画面实时推送到客户端(如 PC 或 Web 播放器) |
| UDP Port | 固定值:10001 | 远程控制指令端口 接收鼠标点击、滑动、按键等操作指令 |
| Image Port | 固定值:9082 | 安卓 adk_api 端口 |
| Camera Port1 | 固定值:10006 | 虚拟摄像头视频流(TCP) 将手机摄像头画面推送到云手机或远程客户端 |
| Camera Port2 | 固定值:10007 | 虚拟摄像头控制/辅助流(UDP) 用于低延迟交互或信令同步 |
非桥接模式:
| 配置项 | 填写值 | 功能说明 |
|---|---|---|
| 输入 IP | 192.168.x.x | 公网可以被 访问的 ip |
| TCP Port | 30000 + (index - 1) × 100 + 3 (index 是实例位,例如 index=1,端口为 30003) | 投屏画面推流端口 用于将手机屏幕画面实时推送到客户端(如 PC 或 Web 播放器) |
| UDP Port | 30000 + (index - 1) × 100 + 4(index 是实例位,例如 index=1,端口为 30004) | 远程控制指令端口 接收鼠标点击、滑动、按键等操作指令 |
| Image Port | 30000 + (index - 1) × 100 + 1(index 是实例位,例如 index=1,端口为 30001) | 安卓 adk_api 端口 |
| Camera Port1 | 30000 + (index - 1) × 100 + 5(index 是实例位,例如 index=1,端口为 30005) | 虚拟摄像头视频流(TCP) 将手机摄像头画面推送到云手机或远程客户端 |
| Camera Port2 | 30000 + (index - 1) × 100 + 6 index 是实例位,例如 index=1,端口为 30006) | 虚拟摄像头控制/辅助流(UDP) 用于低延迟交互或信令同步 |
🔧 基础概念
IP 和 Port 说明
📌 什么是 IP 和 Port?
- IP 地址(如 192.168.30.2):用来定位具体的设备或宿主机
- Port 端口(如 9082、10008):用来区分同一 IP 下的不同设备或服务
- 完整地址:
IP:Port(如 192.168.30.2:10008)
📌 Q1 和 P1 是什么?
- Q1:一种虚拟安卓设备型号,可创建 1-12 个(index 范围 1-12)
- P1:另一种虚拟安卓设备型号,可创建 1-24 个(index 范围 1-24)
- index:设备的编号,用于计算端口号
📌 IP 地址的区别
桥接模式:每个设备有独立的 IP
桥接模式网络拓扑:
┌───────────────┐
│ 宿主机 │
│ 192.168.30.1 │
└──────┬────────┘
│
├─────────┬─────────┬─────────┬─────────────┬
│ │ │ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Q1 设备 1 │ │ Q1 设备 2 │ │ Q1 设备 3 │ │ ... Q1 设备 12 │
│ 192.168.30.2 │ │ 192.168.30.3 │ │ 192.168.30.4 │ │ 192.168.30.12 │
└─────────────┘ └─────────────┘ └─────────────┘ └──────────────┘
非桥接模式:所有设备共享宿主机 IP
非桥接模式网络拓扑:
┌───────────────┐
│ 宿主机 │
│ 192.168.30.2 │
└──────┬────────┘
│
├─────────┬─────────┬─────────┬─────────────┬
│ │ │ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Q1 设备 1 │ │ Q1 设备 2 │ │ Q1 设备 3 │ │ ... Q1 设备 12 │
│ 192.168.30.2 │ │ 192.168.30.2 │ │ 192.168.30.2 │ │ 192.168.30.2 │
└─────────────┘ └─────────────┘ └─────────────┘ └──────────────┘
📌 Port 端口详解
桥接模式的端口(所有设备固定值相同):
| 功能 | 端口号 | 用途说明 |
|---|---|---|
| ADB 端口 | 5555 | 用于 ADB 命令连接 |
| 安卓 API 端口 | 9082 | 用于调用本文档中的所有 HTTP API 接口 |
| 安卓 RPA 端口 | 9083 | 用于自动化操作和脚本控制 |
| 投屏端口 | 10000 | 用于设备屏幕投屏 |
| 控制端口 | 10001 | 用于设备远程控制 |
| 安卓摄像头 TCP | 10006 | 用于摄像头视频流传输(TCP 协议) |
| 安卓摄像头 UDP | 10007 | 用于摄像头视频流传输(UDP 协议) |
| webrtc 端口(TCP) | 10008 | 用于浏览器控制 |
| webrtc 端口(UDP) | 10008 | 用于浏览器控制(UDP 协议) |
非桥接模式的端口(需要根据 index 计算,index 为安卓实例位):
| 功能 | 计算公式 | 用途说明 |
|---|---|---|
| ADB 端口 | 30000 + (index - 1) × 100 | 用于 ADB 命令连接 |
| 安卓 API 端口 | 30000 + (index - 1) × 100 + 1 | 用于调用本文档中的所有 HTTP API 接口 |
| 安卓 RPA 端口 | 30000 + (index - 1) × 100 + 2 | 用于自动化操作和脚本控制 |
| 投屏端口 | 30000 + (index - 1) × 100 + 3 | 用于设备屏幕投屏 |
| 控制端口 | 30000 + (index - 1) × 100 + 4 | 用于设备远程控制 |
| 安卓摄像头 TCP | 30000 + (index - 1) × 100 + 5 | 用于摄像头视频流传输(TCP 协议) |
| 安卓摄像头 UDP | 30000+ (index - 1) × 100 + 6 | 用于摄像头视频流传输(UDP 协议) |
| webRTC 端口(TCP) | 30000 + (index - 1) × 100 + 7 | 用于 webRTC 视频流传输(TCP 协议) |
| webRTC 端口(UDP) | 30000 + (index - 1) × 100 + 8 | 用于 webRTC 视频流传输(UDP 协议) |
📌 非桥接模式端口列表
Q1 设备端口列表(index 1-12):
| 实例位 | ADB 端口 | API 端口 | RPA 端口 | 投屏端口 | 控制端口 | 摄像头 TCP | 摄像头 UDP | webRTC 端口(TCP) | webRTC 端口(UDP) |
|---|---|---|---|---|---|---|---|---|---|
| Q1-1 | 30000 | 30001 | 30002 | 30003 | 30004 | 30005 | 30006 | 30007 | 30008 |
| Q1-2 | 30100 | 30101 | 30102 | 30103 | 30104 | 30105 | 30106 | 30107 | 30108 |
| Q1-3 | 30200 | 30201 | 30202 | 30203 | 30204 | 30205 | 30206 | 30207 | 30208 |
| Q1-4 | 30300 | 30301 | 30302 | 30303 | 30304 | 30305 | 30306 | 30307 | 30308 |
| Q1-5 | 30400 | 30401 | 30402 | 30403 | 30404 | 30405 | 30406 | 30407 | 30408 |
| Q1-6 | 30500 | 30501 | 30502 | 30503 | 30504 | 30505 | 30506 | 30507 | 30508 |
| Q1-7 | 30600 | 30601 | 30602 | 30603 | 30604 | 30605 | 30606 | 30607 | 30608 |
| Q1-8 | 30700 | 30701 | 30702 | 30703 | 30704 | 30705 | 30706 | 30707 | 30708 |
| Q1-9 | 30800 | 30801 | 30802 | 30803 | 30804 | 30805 | 30806 | 30807 | 30808 |
| Q1-10 | 30900 | 30901 | 30902 | 30903 | 30904 | 30905 | 30906 | 30907 | 30908 |
| Q1-11 | 31000 | 31001 | 31002 | 31003 | 31004 | 31005 | 31006 | 31007 | 31008 |
| Q1-12 | 31100 | 31101 | 31102 | 31103 | 31104 | 31105 | 31106 | 31107 | 31108 |
P1 设备端口列表(index 1-24):
| 实例位 | ADB 端口 | API 端口 | RPA 端口 | 投屏端口 | 控制端口 | 摄像头 TCP | 摄像头 UDP | webRTC 端口(TCP) | webRTC 端口(UDP) |
|---|---|---|---|---|---|---|---|---|---|
| P1-1 | 30000 | 30001 | 30002 | 30003 | 30004 | 30005 | 30006 | 30007 | 30008 |
| P1-2 | 30100 | 30101 | 30102 | 30103 | 30104 | 30105 | 30106 | 30107 | 30108 |
| P1-3 | 30200 | 30201 | 30202 | 30203 | 30204 | 30205 | 30206 | 30207 | 30208 |
| P1-4 | 30300 | 30301 | 30302 | 30303 | 30304 | 30305 | 30306 | 30307 | 30308 |
| P1-5 | 30400 | 30401 | 30402 | 30403 | 30404 | 30405 | 30406 | 30407 | 30408 |
| P1-6 | 30500 | 30501 | 30502 | 30503 | 30504 | 30505 | 30506 | 30507 | 30508 |
| P1-7 | 30600 | 30601 | 30602 | 30603 | 30604 | 30605 | 30606 | 30607 | 30608 |
| P1-8 | 30700 | 30701 | 30702 | 30703 | 30704 | 30705 | 30706 | 30707 | 30708 |
| P1-9 | 30800 | 30801 | 30802 | 30803 | 30804 | 30805 | 30806 | 30807 | 30808 |
| P1-10 | 30900 | 30901 | 30902 | 30903 | 30904 | 30905 | 30906 | 30907 | 30908 |
| P1-11 | 31000 | 31001 | 31002 | 31003 | 31004 | 31005 | 31006 | 31007 | 31008 |
| P1-12 | 31100 | 31101 | 31102 | 31103 | 31104 | 31105 | 31106 | 31107 | 31108 |
| P1-13 | 31200 | 31201 | 31202 | 31203 | 31204 | 31205 | 31206 | 31207 | 31208 |
| P1-14 | 31300 | 31301 | 31302 | 31303 | 31304 | 31305 | 31306 | 31307 | 31308 |
| P1-15 | 31400 | 31401 | 31402 | 31403 | 31404 | 31405 | 31406 | 31407 | 31408 |
| P1-16 | 31500 | 31501 | 31502 | 31503 | 31504 | 31505 | 31506 | 31507 | 31508 |
| P1-17 | 31600 | 31601 | 31602 | 31603 | 31604 | 31605 | 31606 | 31607 | 31608 |
| P1-18 | 31700 | 31701 | 31702 | 31703 | 31704 | 31705 | 31706 | 31707 | 31708 |
| P1-19 | 31800 | 31801 | 31802 | 31803 | 31804 | 31805 | 31806 | 31807 | 31808 |
| P1-20 | 31900 | 31901 | 31902 | 31903 | 31904 | 31905 | 31906 | 31907 | 31908 |
| P1-21 | 32000 | 32001 | 32002 | 32003 | 32004 | 32005 | 32006 | 32007 | 32008 |
| P1-22 | 32100 | 32101 | 32102 | 32103 | 32104 | 32105 | 32106 | 32107 | 32108 |
| P1-23 | 32200 | 32201 | 32202 | 32203 | 32204 | 32205 | 32206 | 32207 | 32208 |
| P1-24 | 32300 | 32301 | 32302 | 32303 | 32304 | 32305 | 32306 | 32307 | 32308 |
桥接模式 vs 非桥接模式
| 维度 | 桥接模式 | 非桥接模式(NAT) |
|---|---|---|
| 网络身份 | 设备直接接入物理网络,拥有独立 IP | 设备通过宿主转发网络,共享宿主 IP |
| 外部可访问性 | 同一网络内的设备可直接访问 | 外部设备默认无法直接访问 |
| 配置复杂度 | 需和物理网络参数一致 | 自动适配宿主网络 |
| 使用场景 | 需要被外部设备访问 | 仅需要设备自己上网 |
工作原理详解:
桥接模式:设备直接连接到物理交换机/路由器,获取和宿主同网段的独立 IP(由物理网络的 DHCP 分配),网络数据直接在物理网络中传输。相当于在物理网络中"新增一个设备"。
非桥接模式:设备处于宿主创建的私有网络中,宿主作为"网关"转发数据。设备用私有 IP(如 192.168.122.xx),对外通信时由宿主把设备的请求"伪装"成自己的请求(NAT 地址转换),再把响应转发给设备。
📋 通用说明
请求方式
所有 API 均使用 HTTP 协议,支持以下请求方式:
- GET:用于查询和修改操作(大多数接口)
- POST:用于文件上传和大数据传输
返回格式
所有 API 返回 JSON、file 格式数据,基本结构如下:
成功响应:
{
"code": 200,
"msg": "ok",
"data": {} // 可选,根据接口而定
}
失败响应:
{
"code": 201,
"error": "错误原因"
}
或
{
"code": 202,
"reason": "失败原因"
}
状态码说明
| 状态码 | 含义 | 说明 |
|---|---|---|
| 200 | 成功 | 操作成功完成 |
| 201 | 通用错误 | 操作失败,查看 error 字段获取详细信息 |
| 202 | 操作失败 | 特定操作失败,查看 reason 字段获取详细信息 |
| 其他 | 未知错误 | 联系技术支持 |
编码说明
某些参数需要特殊编码处理:
Base64 编码(用于应用列表等):
import base64
import json
# 示例:隐藏应用列表
data = ["com.example.app1", "com.example.app2"]
json_str = json.dumps(data)
encoded = base64.urlsafe_b64encode(json_str.encode("utf-8")).decode("utf-8")
print(encoded) # 输出: WyJjb20uZXhhbXBsZS5hcHAxIiwgImNvbS5leGFtcGxlLmFwcDIiXQ==
URL 编码(用于包含特殊字符的参数):
from urllib.parse import quote
data = '{"device_id":"abc123"}'
encoded = quote(data)
print(encoded) # 输出: %7B%22device_id%22%3A%22abc123%22%7D
🔌 接口详解
1. 下载文件
功能说明:从设备下载指定文件到本地计算机
支持模式:🌉 桥接模式 | 🔗 非桥接模式
请求方式:GET
请求 URL:
http://{ip}:{port}/download?path={filepath}
请求参数:
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| path | 是 | string | 要下载的文件完整路径 |
参数详解:
- path: 必须是文件的完整绝对路径
- 获取方式:
- 使用"获取文件列表"接口查询文件路径
- 或直接使用已知的文件路径
- 常见文件路径:
/sdcard/Download/file.apk(下载的 APK 文件)/sdcard/DCIM/Camera/photo.jpg(相机照片)/data/app/com.example/base.apk(已安装应用)
- 获取方式:
请求示例:
curl "http://192.168.99.108:10038/download?path=/sdcard/Download/1.jpg" -o 1.jpg
返回示例:
成功:返回文件的二进制数据,浏览器会自动下载
失败:
{
"code": 201,
"error": "文件不存在或无权限访问"
}
错误码:
| 错误码 | 说明 |
|---|---|
| 200 | 成功 |
| 其他 | 下载失败 |
注意事项:
- 文件下载采用流式传输,支持大文件
- 下载时会显示下载进度信息
- 下载完成后会自动保存到指定位置
- 如果本地文件已存在,需要先删除或重命名
- 某些系统文件可能需要特殊权限才能下载
- 建议使用绝对路径访问文件,以避免路径解析错误
2. 获取剪贴板内容
功能说明:获取设备剪贴板中的文本内容
支持模式:🌉 桥接模式 | 🔗 非桥接模式
请求方式:GET
请求 URL:
http://{ip}:{port}/clipboard
请求参数:
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| ip | 是 | string | ip |
| port | 是 | int | port |
请求示例:
curl "http://192.168.30.2:10008/clipboard"
返回示例:
成功:
{
"code": 200,
"msg": "query success",
"data": {
"text": "123"
}
}
失败:
{
"code": 201,
"error": "异常原因"
}
{
"code":202,
"reason":"失败原因"
}
注意事项:
- 只能获取文本内容,不支持图片或其他格式
- 需要设备授予剪贴板访问权 限
3. 设置剪贴板内容
功能说明:将文本内容设置到设备的剪贴板
支持模式:🌉 桥接模式 | 🔗 非桥接模式
请求方式:GET
请求 URL:
http://{ip}:{port}/clipboard
请求参数:
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| cmd | 是 | int | 固定值:2 |
| text | 是 | string | 要设置的文本内容 |
参数详解:
- text: 可以是任意文本内容
- 如果包含特殊字符,需要进行 URL 编码
请求示例:
curl "http://192.168.30.2:10008/clipboard?cmd=2&text=123"
返回示例:
成功:
{
"code": 200,
"msg": "ok"
}
失败:
{
"code": 201,
"error": "异常原因"
}
{
"code": 202,
"error": "失败原因"
}
注意事项:
- 特殊字符需要进行 URL 编码
- 设置后立即生效,用户可以粘贴该内容
4. 查询 S5 代理状态
功能说明:查询设备的 S5 代理服务状态
支持模式:🌉 桥接模式 | 🔗 非桥接模式
请求方式:GET
请求 URL:
http://{ip}:{port}/proxy
请求示例:
curl "http://192.168.30.2:10008/proxy"
请求参数 无
返回参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| code | int | 状态码 |
| data | object | 返回数据对象 |
| data.status | string | 查询结果 |
| data.status Text | string | 提示信息 |
| data.addr | string | 代理地址 |
| data.type | int | 代理类型 |
返回示例:
成功:
启动
{
"code": 200,
"msg": "query success",
"data": {
"status": 1,
"statusText": "已启动",
"addr": "socks5://test:123456@192.168.1.100:8080",
"type": 2
}
}
未启动
{
"code":200,
"msg":"query success",
"data":{"status":0,"statusText":"未启动"}
}
失败:
{
"code": 201,
"error": "查询失败"
}
返回参数说明:
- code: 状态码(200 表示成功)
注意事项:
- S5 代理是 SOCKS5 代理协议的实现
5. 设置 S5 代理
功能说明:启动或配置设备的 S5 代理服务
支持模式:🌉 桥接模式 | 🔗 非桥接模式
请求方式:GET
请求 URL:
http://{ip}:{port}/proxy?cmd=2
请求参数:
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| cmd | 是 | int | 固定值:2 |
| port | 是 | int | s5 服务器端口 |
| usr | 是 | string | s5 用户名 |
| pwd | 是 | string | s5 密码 |
| type | 否 | int | s5 域名模式 1:本地域名解析 2:服务端域名解析 |
参数详解:
- port: s5 服务器端口
- usr: s5 用户名
- pwd: s5 密码
- type: s5 域名模式(1:本地域名解析 2:服务端域名解析)
请求示例:
curl "http://192.168.30.2:10008/proxy?cmd=2&type=2&ip=192.168.1.100&port=8080&usr=test&pwd=123456"
返回示例:
成功:
{
"code": 200,
"msg": "start success"
}
注意事项:
- 代理配置必须正确,否则无法连接
6. 停止 S5 代理
功能说明:停止设备的 S5 代理服务
支持模式:🌉 桥接模式 | 🔗 非桥接模式
请求方式:GET
请求 URL:
http://{ip}:{port}/proxy?cmd=3
请求参数:
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| cmd | 是 | int | 固定值:3 |
请求示例:
curl "http://192.168.30.2:10008/proxy?cmd=3"
返回示例:
成功:
{
"code": 200,
"msg": "stop success"
}
注意事项:
- 停止后代理服务将不可用
7. 设置 S5 域名过滤
功能说明:为 S5 代理设置域名过滤规则
支持模式:🌉 桥接模式 | 🔗 非桥接模式
请求方式:POST
请求 URL:
http://{ip}:{port}/proxy?cmd=4
请求参数:
| 参数名 |
|---|