Skip to main content

MYTOS API 接口文档

文档版本: v3 | 更新日期: 2026-01-16
目标用户: Android 开发者、集成商、自动化测试人员
文档类型: 开发者参考手册


📚 快速导航

基础信息

s

接口目录

  1. 下载文件
  2. 获取剪贴板内容
  3. 设置剪贴板内容
  4. 查询 S5 代理状态
  5. 设置 S5 代理
  6. 停止 S5 代理
  7. 设置 S5 域名过滤
  8. 接收短信
  9. 上传 Google 证书
  10. ADB 切换权限
  11. 导出 app 信息
  12. 导入 app 信息
  13. 虚拟摄像头热启动
  14. 后台保活
  15. 屏蔽按键
  16. 批量安装 apks/xapk 分包
  17. 版本查询
  18. 截图功能
  19. 自动点击
  20. 文件上传
  21. 容器信息
  22. 通话记录
  23. 刷新定位
  24. 谷歌 id
  25. 安装面具
  26. 添加联系人
  27. webrtc 播放器

安卓 APP 端口基础映射

Android 客户端自定义填写端口参数

桥接模式:

配置项填写值功能说明
输入 IP192.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) 用于低延迟交互或信令同步

非桥接模式:

配置项填写值功能说明
输入 IP192.168.x.x公网可以被访问的 ip
TCP Port30000 + (index - 1) × 100 + 3 (index 是实例位,例如 index=1,端口为 30003)投屏画面推流端口 用于将手机屏幕画面实时推送到客户端(如 PC 或 Web 播放器)
UDP Port30000 + (index - 1) × 100 + 4(index 是实例位,例如 index=1,端口为 30004)远程控制指令端口 接收鼠标点击、滑动、按键等操作指令
Image Port30000 + (index - 1) × 100 + 1(index 是实例位,例如 index=1,端口为 30001)安卓 adk_api 端口
Camera Port130000 + (index - 1) × 100 + 5(index 是实例位,例如 index=1,端口为 30005)虚拟摄像头视频流(TCP) 将手机摄像头画面推送到云手机或远程客户端
Camera Port230000 + (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用于设备远程控制
安卓摄像头 TCP10006用于摄像头视频流传输(TCP 协议)
安卓摄像头 UDP10007用于摄像头视频流传输(UDP 协议)
webrt 端口(TCP)10008用于浏览器控制
webrt 端口(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用于设备远程控制
安卓摄像头 TCP30000 + (index - 1) × 100 + 5用于摄像头视频流传输(TCP 协议)
安卓摄像头 UDP30000+ (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摄像头 UDPwebRTC 端口(TCP)webRTC 端口(UDP)
Q1-1300003000130002300033000430005300063000730008
Q1-2301003010130102301033010430105301063010730108
Q1-3302003020130202302033020430205302063020730208
Q1-4303003030130302303033030430305303063030730308
Q1-5304003040130402304033040430405304063040730408
Q1-6305003050130502305033050430505305063050730508
Q1-7306003060130602306033060430605306063060730608
Q1-8307003070130702307033070430705307063070730708
Q1-9308003080130802308033080430805308063080730808
Q1-10309003090130902309033090430905309063090730908
Q1-11310003100131002310033100431005310063100731008
Q1-12311003110131102311033110431105311063110731108

P1 设备端口列表(index 1-24):

实例位ADB 端口API 端口RPA 端口投屏端口控制端口摄像头 TCP摄像头 UDPwebRTC 端口(TCP)webRTC 端口(UDP)
P1-1300003000130002300033000430005300063000730008
P1-2301003010130102301033010430105301063010730108
P1-3302003020130202302033020430205302063020730208
P1-4303003030130302303033030430305303063030730308
P1-5304003040130402304033040430405304063040730408
P1-6305003050130502305033050430505305063050730508
P1-7306003060130602306033060430605306063060730608
P1-8307003070130702307033070430705307063070730708
P1-9308003080130802308033080430805308063080730808
P1-10309003090130902309033090430905309063090730908
P1-11310003100131002310033100431005310063100731008
P1-12311003110131102311033110431105311063110731108
P1-13312003120131202312033120431205312063120731208
P1-14313003130131302313033130431305313063130731308
P1-15314003140131402314033140431405314063140731408
P1-16315003150131502315033150431505315063150731508
P1-17316003160131602316033160431605316063160731608
P1-18317003170131702317033170431705317063170731708
P1-19318003180131802318033180431805318063180731808
P1-20319003190131902319033190431905319063190731908
P1-21320003200132002320033200432005320063200732008
P1-22321003210132102321033210432105321063210732108
P1-23322003220132202322033220432205322063220732208
P1-24323003230132302323033230432305323063230732308

桥接模式 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}

请求参数

参数名必选类型说明
pathstring要下载的文件完整路径

参数详解

  • path: 必须是文件的完整绝对路径
    • 获取方式:
      1. 使用"获取文件列表"接口查询文件路径
      2. 或直接使用已知的文件路径
    • 常见文件路径:
      • /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

请求参数

参数名必选类型说明
ipstringip
portintport

请求示例

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

请求参数

参数名必选类型说明
cmdint固定值:2
textstring要设置的文本内容

参数详解

  • 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"

请求参数

返回参数

参数名类型说明
codeint状态码
dataobject返回数据对象
data.statusstring查询结果
data.status Textstring提示信息
data.addrstring代理地址
data.typeint代理类型

返回示例

成功:

启动
{
"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

请求参数

参数名必选类型说明
cmdint固定值:2
portints5 服务器端口
usrstrings5 用户名
pwdstrings5 密码
typeints5 域名模式 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

请求参数

参数名必选类型说明
cmdint固定值: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

请求参数

参数名必选类型说明
cmdint固定值:4

参数详解

  • domains: 可以使用逗号分隔的域名列表,或 JSON 数组格式

请求示例

POST "http://192.168.30.2:10008/proxy?cmd=4"
body
[
"qq.com",
"baidu.com"
]

返回示例

成功:

{
"code": 200,
"msg": "set success"
}

失败:

{
"code": 201,
"error": "设置失败"
}

注意事项

  • 在使用 S5 代理时,建议先检查代理服务器的可用性
  • 域名过滤规则的变更会立即生效
  • 如果需要临时禁用 S5 代理,可以使用停止 S5 代理接口
  • S5 代理的设置会影响所有网络请求的路由

8. 接收短信

功能说明:模拟接收短信消息

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:POST

请求 URL

http://{ip}:{port}/sms

请求参数

参数名必选类型说明
cmdint固定值:4
addressstring发送者电话号码
mbodystring短信内容
scaddressstring短信中心号码

参数详解

  • address: 发送短信的电话号码
  • mbody: 短信的文本内容
  • scaddress: 短信中心号码

请求示例

POST "http://192.168.30.2:10008/sms?cmd=4"
headers = {"Content-Type": "application/json"}
请求体
body = {
"address": "13800138000",
"body": "Hello, this is a test message.",
"scaddress": "+8613900000000"
}

返回示例

成功:

{
"code": 200,
"msg": "add inbox success",
"data": { "status": 0 }
}

失败:

{
"code": 201,
"error": "接收失败"
}

注意事项

  • 电话号码必须是有效的格式
  • 短信内容支持特殊字符,但需要 URL 编码

9. 上传 Google 证书

功能说明:上传或更新 Google 服务的证书

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:POST

请求 URL

http://{ip}:{port}/uploadkeybox

请求参数

参数名必选类型说明
filefile证书文件(如.pem)

参数详解

  • file: 上传 Google 证书文件(PEM 格式)

请求示例

 POST
"http://192.168.30.2:10008/uploadkeybox"
请求体
form_data 上传文件
{'fileToUpload': 文件}

返回示例

成功:

导入完成permissionabc
selinux123

失败:

导入失败,错误信息:

注意事项

  • 证书文件必须是有效的 PEM 格式
  • 上传后需要重启设备才能生效
  • 某些 Google 服务可能需要特定的证书

10. ADB 切换权限

功能说明:查询、开启、关闭当前 ADB 权限状态

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://{ip}:{port}/adb

请求参数

参数名必选类型说明
cmdstring操作命令:1: 查询权限状态;2: 开启 ADB root 权限;3: 关闭 ADB root 权限

接口说明:

操作功能说明
cmd=1查询状态返回当前 ADB 是否启用 ROOT 权限
cmd=2开启 root设置 persist.adbd.shell=0 并重启 adbd,允许 root 权限
cmd=2关闭 rootpersist.adbd.shell=1 并重启 adbd,仅保留 shell 权限

请求示例

查询权限状态
curl "http://192.168.30.2:10008/adb?"
开启ADB root权限
curl "http://192.168.99.108:10008/adb?cmd=2"
关闭ADB root权限
curl "http://192.168.99.108:10008/adb?cmd=3"

返回示例

成功:

查询
{
"code": 200,
"msg": "query success",
"data": { "status": 0, "statusText": "open" }
}
开启权限
{
"code":200,
"msg":"open adb root success"
}
关闭权限
{
"code":200,
"msg":"close adb root success"
}

失败:

{
"code": 202
"reason":"错误原因"
}

注意事项:

  • 此功能依赖设备已 root 且系统支持 persist.adbd.shell 属性
  • 修改后需重新连接 ADB 才能生效

11. 导出 app 信息

功能说明:导出已安装应用的信息

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://{ip}:{port}/backrestore

请求参数

参数名必选类型说明
cmdstrbackup
pkgstr包名
savetostr导出文件路径

请求示例

# 导出导出app信息
curl "http://192.168.30.2:10020/backrestore?cmd=backup&pkg=com.ss.android.ugc.aweme&saveto=/sdcard/test.tar.gz"

返回示例

成功:

{
"status": "success",
"message": "Backup completed successfully"
}

失败:

{
"status": "failed",
"message": "失败原因"
}

返回参数说明

  • status: 状态码(success 表示成功)
  • message: 状态信息

注意事项

  • 返回所有已安装应用的基本信息
  • 返回的信息包括包名、应用名称、版本等
  • 可用于获取设备上所有应用的列表

12. 导入 app 信息

功能说明:导入应用信息到设备,导入 APP 信息不需要 pkg(应用包名)参数。

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://{ip}:{port}/backrestore

请求参数

参数名必选类型说明
cmdstrrecovery
backuppathstr导入文件路径

导入 APP 信息不需要 pkg(应用包名)。

请求示例

# 导入导出app信息
GET http://192.168.30.2:10020/backrestore?cmd=recovery&backuppath=/sdcard/test.tar.gz

返回示例

成功:

{
"status": "success",
"message": "Recovery completed successfully"
}

失败:

{
"status": "failed",
"message": "失败原因"
}

注意事项

  • 应用信息文件必须是有效的 JSON 格式
  • 导入后需要重启安卓才能生效

13. 虚拟摄像头热启动

功能说明:热启动虚拟摄像头功能,无需重启设备

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://{ip}:{port}/camera?cmd=start

请求参数

参数名必选类型说明
cmdstrstart,stop
pathstrrtmp 地址或者本地地址,首次使用需要传参,后续如果不传 path 参数则使用上次的 path 参数

请求示例

curl "http://192.168.30.2:10008/camera?cmd=start&path=/sdcard/Download/1.jpg"

返回示例

成功:

{
"code": 200,
"msg": "ok"
}

失败:

{
"code": 202,
"reason": "错误原因"
}

注意事项

  • 热启动不需要重启设备
  • 启动后虚拟摄像头立即可用

14. 后台保活

功能说明:为指定应用启用后台保活功能,防止应用被系统杀死

支持模式:仅 Android 14 支持

版本要求:镜像日期大于 20251217

请求方式:GET

请求 URL

http://{ip}:{port}/background

请求参数

参数名必选类型说明
cmdstr操作类型 :查询=1 增加=2 删除=3 更新=4 更新接口说明:被保活应用卸载和重新安装后需要调用
packagestr应用包名 ;cmd=2 和 3 需要

参数详解

  • cmd: 操作类型

    • 1:查询(查询所有保活应用)
    • 2:增加(添加应用到保活列表)
    • 3:删除(从保活列表删除应用)
    • 4:更新(更新保活应用列表)
  • package: 当 cmd=2 或 3 时需要提供

    • 被保活应用卸载和重新安装后需要调用更新接口

请求示例

查询保活应用:

curl "http://192.168.99.149:10026/background?cmd=1"

添加应用到保活列表:

curl "http://192.168.99.149:10026/background?cmd=2&package=com.ss.android.ugc.aweme"

删除应用:

curl "http://192.168.99.149:10026/background?cmd=3&package=com.ss.android.ugc.aweme"

返回示例

cmd=1 (查询):

{
"code": 200,
"msg": "获取成功",
"data": {
"apps": ["com.ss.android.ugc.aweme"]
}
}

cmd=2 (添加):

{
"code": 200,
"msg": "添加成功"
}

cmd=3 (删除):

{
"code": 200,
"msg": "移除成功"
}

cmd=4 (更新):

{
"code": 200,
"msg": "更新成功",
"data": {
"apps": ["com.ss.android.ugc.aweme"]
}
}

失败:

{
"code": 202,
"reason": "应用已在保护列表中"
}
错误返回xxx为java层报错信息,不固定:
{
"code":201,
"error":"xxxxx"
}

注意事项

  • 目前只支持安卓 14 版本
  • 版本要求:镜像日期大于 20251217
  • 被保活应用卸载和重新安装后需要调用更新接口
  • 某些系统应用可能无法保活

15. 屏蔽按键

功能说明:屏蔽或启用设备的物理按键

支持模式:仅 Android14 支持

请求方式:GET

请求 URL

http://{ip}:{port}/disablekey?value=1

请求参数

参数名必选类型说明
valuestr1 为开启 0 为关闭

参数详解

  • value: 屏蔽状态
    • 1:开启屏蔽
    • 0:关闭屏蔽

请求示例

开启屏蔽:

curl "http://192.168.99.108:10017/disablekey?value=1"

关闭屏蔽:

curl "http://192.168.99.108:10017/disablekey?value=0"

返回示例

成功:

{
"code": 200,
"msg": "ok"
}

失败:

错误返回xxx为java层报错信息,不固定
{
"code": 201,
"error": "Java层报错信息"
}

注意事项

  • 屏蔽后物理按键将不可用

16. 批量安装 apks/xapk 分包

功能说明:用于批量安装 Android APK 文件的接口,支持通过 ZIP 压缩包上传多个 APK 文件并自动安装

支持模式:安卓 10、12(从 v22.9.2 开始)、14 都支持

请求方式:POST

请求 URL

http://{ip}:{port}/installapks

请求参数

参数名必选类型说明
filefile包含多个 APK 文件的 ZIP 压缩包

参数详解

  • file: 上传包含多个 APK 文件的 ZIP 压缩包
    • 步骤:
      1. 将多个 APK 文件放入一个文件夹
      2. 将文件夹压缩为 ZIP 文件
      3. 上传 ZIP 文件

请求示例

使用 curl 命令:

curl -X POST \
"http://192.168.99.108:10017/installapks" \
-H "Content-Type: multipart/form-data" \
-F "file=@/path/to/your/apks.zip"

返回示例

成功 (HTTP 200):

全部安装完成

失败:

错误返回xxx为java层报错信息,不固定
{
"code": 202,
"error": "Java层报错信息"
}

注意事项

  • 支持安卓 10、12(从 v22.9.2 开始)、14
  • ZIP 文件必须包含有效的 APK 文件
  • 安装过程可能需要几分钟,请耐心等待
  • 如果某个 APK 安装失败,其他 APK 仍会继续安装

17. 版本查询

功能说明:查询设备或服务的版本信息

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://{ip}:{port}/queryversion

请求参数:无

请求示例

curl "http://192.168.30.2:10008/queryversion"

返回示例

成功:

{
"code": 200,
"msg": "3"
}

失败:

{
"code": 202,
"reason": "失败原因"
}

注意事项

  • 版本信息可能包含多个字段
  • 不同设备或服务可能返回不同的版本信息

18. 截图功能

功能说明:获取设备屏幕截图

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://{ip}:{port}/snapshot

请求参数

参数名必选类型说明
typestring截图类型
qualityint截图质量(1-100)

请求示例

curl "http://192.168.30.2:10008/snapshot"
curl "http://192.168.30.2:10008/snapshot?quality=80"

返回示例

成功:返回图片二进制数据

失败:

{
"code": 201,
"error": "截图失败"
}

注意事项

  • 截图需要设备屏幕处于唤醒状态
  • 高分辨率截图可能需要较长时间
  • 截图大小可能有限制

19. 自动点击

功能说明:自动点击

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://{ip}:{port}/autoclick

请求参数

必选类型说明
actionstring点击动作,可选值:touchdown 按 touchup 放 touchmove 移动 tap 点击 keypress 根据按键键码点击对应按键
idint点击事件编号 1-10 多指触控
xintx 坐标
yinty 坐标
codeint按键键码,action 为 keypress 时必填, 点击按键键码对应的按键

请求示例

按下
curl "http://192.168.99.108:10038/autoclick?action=touchdown&id=1&x=100&y=100"
放开
curl "http://192.168.99.108:10038/autoclick?action=touchup&id=1&x=100&y=100"
移动
curl "http://192.168.99.108:10038/autoclick?action=touchmove&id=1&x=100&y=100"
点击
curl "http://192.168.99.108:10038/autoclick?action=tap&id=1&x=100&y=100"
根据按键键码点击对应按键
curl "http://192.168.99.108:10038/autoclick?action=keypress&id=1&code=4"

返回示例

成功:

{
"code": 200,
"msg": "ok"
}

错误原因:

{
"code": 201,
"error": "错误原因"
}

按键键码查询 code 参数部分键码参考 3 主菜单键 4 返回键 5 联系人

20. 文件上传

功能说明:文件上传

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:POST

请求 URL

http://192.168.99.108:10038/upload

请求参数

参数名必选类型说明
filefile需要上传的文件(如.txt)

请求示例

curl -X POST "http://192.168.99.108:10038/upload" -H "Content-Type: multipart/form-data" -F "file=@./1.txt"

html 实例

<!DOCTYPE html>
<html>
<head>
<title>文件上传示例</title>
</head>
<body>
<h1>文件上传示例</h1>
<form action="http://10.10.0.117:10008/upload" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="上传" name="submit">
</form>
</body>
</html>

返回示例

成功:

文件上传完成!

失败:

{
"code": 202,
"reason": "失败原因"
}

另一种文件上传方式:

请求方式:GET

请求 URL

http://192.168.99.108:10026/?task=upload&file={}

请求参数

参数名必选类型说明
filefile要上传的文件
taskstring任务类型,固定为 upload

请求示例

curl "http://192.168.99.108:10026/?task=upload&file=http://192.168.99.136:7878/%E6%8A%96%E9%9F%B3.apk"

返回示例

成功:

{
"code": 200,
"msg": "ok"
}

失败:

{
"code": 202,
"reason": "失败原因"
}

两种接口请求区别:

维度接口 1(POST 方式)接口 2(GET 方式)
请求方式POSTGET
参数传递方式file 是本地文件 (通过请求体上传)file 是文件 URL(通过 URL 参数传递)
必选参数仅需 file 参数多一个 task 参数(固定值 upload)
返回格式成功返回文本“文件上传完成!”,失败返回 JSONJSON 格式(code:200+msg:“ok”

注意事项

  • 接口一是标准文件上传:通过 multipart/form-data 格式直接将本地文件(如本地 APK)上传到接口;适用场景:上传本地存储的文件,是常规的文件上传方式。
  • 接口二是文件 URL 上传:通过 URL 参数传递文件 URL,接口会自动下载文件并上传;适用场景:上传远程存储的文件,如文件服务器上的文件,或需要先下载再上传。

21. 容器信息

功能说明:获取容器信息

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://192.168.99.108:10026/info

请求参数: 无

请求示例

curl "http://192.168.99.108:10026/info"

返回示例

成功:

{
"code": 200,
"msg": "ok",
"data": {
"hostIp": "-",
"instance": "8",
"name": "p738c384c1581ad24c3fcf199684f5f5_8",
"buildTime": "1766829184"
}
}

失败:

{
"code": 202,
"reason": "失败原因"
}

22. 通话记录

功能说明:获取容器通话记录

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://192.168.99.108:10026/callog

请求参数

参数名类型是否必选说明
numberstring要模拟的电话号码(如 "13800138000")
typeint通话类型:1 呼出 2 接收 3 错过(默认)
datestring时间戳(毫秒),默认当前时间
durationint通话时长(秒),默认 0
presentationint显示方式,默认 1
subscription_idintSIM 卡 ID,默认 0
is_readint是否已读,默认 1
newint是否新消息,默认 1
featuresint特性标志,默认 0

请求示例

curl "http://192.168.30.2:10008/callog?number=10086&type=2"

返回示例

成功:

{
"code": 200,
"msg": "query success"
}

失败:

{
"code": 202,
"reason": "失败原因"
}

23. 刷新定位

功能说明:根据 ip 刷新定位

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://192.168.99.108:10026/task

请求参数: 无

请求示例

curl "http://192.168.99.108:10026/task"

返回示例

成功:

{
"code": 200
}

失败:

{
"code": 202,
"reason": "失败原因"
}

24. 谷歌 id

功能说明:获取容器谷歌 id

支持模式:🌉 桥接模式 | 🔗 非桥接模式

接口路径:/googleid(需与 Handler 注册路径一致)

请求方式:GET

请求 URL

http://192.168.99.108:10026/adid

请求参数

参数名类型是否必选说明
cmdstring操作指令:1 - 自定义设置谷歌 ID(需传 adid 参数)2 - 生成随机谷歌 ID 默认值:1
adidstring仅 cmd=1 时必选,需设置的谷歌 ID 值

请求示例

curl "http://192.168.99.108:10026/adid?cmd=1&adid=my_adid"

返回示例

成功:

{
"succ": true,
"msg": "generate random adid success",
"data": {
"adid": "my_adid"
}
}

失败:

{
"succ": false,
"msg": "cmd err"
}

25. 安装面具

功能说明:安装面具(安装面具之后需要重启)

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

请求 URL

http://192.168.99.108:10026/modulemgr?cmd=install&moduler={}

请求参数

参数名类型是否必选说明
cmdstring操作指令:check - 检查模块状态;install - 安装模块 ;uninstall - 卸载模块
adidstring面具名称

请求参数

module 参数值对应模块说明
magiskMagisk 模块安卓系统的 root 权限管理工具
gmsGMS 模块谷歌移动服务(Google Mobile Services)

响应规则

  • 若模块已安装:响应体 succ 字段返回"1";
  • 若模块未安装:响应体 succ 字段返回"0";
  • 若传非支持的模块类型:响应体返回"不支持的模块类型",succ 为 false。

请求示例

#以gms为例,检查面具状态
curl "http://192.168.99.108:10026/modulemgr?cmd=check&module=gms"

#安装面具
curl "http://192.168.99.108:10026/modulemgr?cmd=install&module=gms"

#卸载面具
curl "http://192.168.99.108:10026/modulemgr?cmd=uninstall&module=gms"

返回示例

成功:

安装成功:
{
"code":200,
"msg":"OK"
}

失败:

{
"code": 202,
"reason": "缺少cmd或module或state参数"
}

注意事项:

  • 安装面具后需要重启

26. 添加联系人

功能说明:添加联系人

支持模式:🌉 桥接模式 | 🔗 非桥接模式

接口路径:/addcontact(需与 Handler 注册路径一致)

请求方式:GET

请求 URL

http://192.168.99.108:10026/addcontact?data=[]

请求参数

参数名类型是否必选说明
dataJSON 字符串联系人列表,数组内每个对象需包含:- user:联系人姓名- tel:联系电话

请求示例

GET
"http://192.168.99.108:10035/addcontact?data=[{"user":"张三","tel":"13800138000"},{"user":"李四","tel":"13900139000"}]"

返回示例

成功:

{
"code": 200,
"msg": "OK"
}

失败:

{
"code": 201,
"error": "org.json.JSONException: Unterminated string at character 59 of [{\"user\":\"张三\",\"tel\":\"13800138000\"},{\"user\":\"李四\",\"tel\":\"1390"
}

27. webrtc 播放器

功能说明:调用 webrtc 的播放器

支持模式:🌉 桥接模式 | 🔗 非桥接模式

请求方式:GET

调用方法:

  • 下载播放器,将压缩包解压到本地目录,下载地址:webplayer.zip

  • 打开浏览器,拼接完整 URL

  • 确保文件本地目录地址正确

  • 检查参数是否正确

  • 成功后即可观看 WebRTC 视频流

    请求 URL

webplayer/play.html?shost={ip}&sport={webrtc_port}&q=1&v=h264&rtc_i={ip}&rtc_p={webrtc_port}

请求参数

参数名是否必选类型说明
shoststringWebRTC 流媒体服务器主机地址(如 10.10.0.82)
sportstringWebRTC 流媒体服务器端口(如 20004)
qstring视频质量参数 (0=低 1=高)
vstring视频编码格式(如 h264)
rtc_jstringRTC 服务端 IP(与 shost 一致,用于建立点对点连接)
rtc_pstringRTC 服务端端口(与 sport 一致,用于信令交互)

请求示例

GET
"./webplayer/play.html?shost=192.168.99.108&sport=20004&q=1&v=h264&rtc_i=192.168.99.108&rtc_p=20004"

返回示例

成功:

成功响应(页面加载完成)

失败:

失败响应(页面加载失败)

📚 常见问题解答

Q1: 如何获取应用包名?

A: 有以下几种方式:

  1. 在安卓设备上,进入"设置" > "应用" > 选择要查看的应用,查看"应用详情"
  2. 使用 ADB 命令:adb shell pm list packages
  3. 使用本 API 的"导出 app 信息"接口获取
  4. 常见应用包名:
    • com.android.chrome(Chrome 浏览器)
    • com.tencent.mm(微信)
    • com.sina.weibo(新浪微博)

Q2: 如何获取 IP 和 Port?

A: 在 MYTOS 管理界面或设备信息页面查看。通常:

  • IP 是 192.168.x.x 格式
  • Port 是 10008 或 10009
  • 不同设备实例的端口可能不同

Q3: 如何进行 Base64 编码?

A: Python 示例:

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)

Q4: 如何进行 URL 编码?

A: Python 示例:

from urllib.parse import quote

data = '{"device_id":"abc123"}'
encoded = quote(data)
print(encoded)

Q5: 常见文件路径有哪些?

A: 安卓常见目录路径:

  • /sdcard:SD 卡根目录(存储用户文件)
  • /data:系统数据目录
  • /system:系统文件目录
  • /data/app:已安装应用目录
  • /sdcard/Download:下载文件目录
  • /sdcard/DCIM:相机照片目录

Q6: 桥接模式和非桥接模式有什么区别?

A:

  • 桥接模式:设备直接接入物理网络,拥有独立 IP,可被同一网络内的其他设备直接访问
  • 非桥接模式(NAT):设备通过宿主转发网络,共享宿主 IP,外部设备默认无法直接访问

Q7: 如何处理 API 返回的错误?

A:

  1. 检查返回的 code 字段
  2. 查看 error 或 reason 字段获取详细错误信息
  3. 常见错误:
    • 应用包名不存在 → 检查包名是否正确
    • 权限被拒绝 → 检查设备是否支持该操作
    • 网络超时 → 检查网络连接是否正常

Q8: 某个接口返回"不支持"或"未实现",怎么办?

A:

  1. 检查设备的固件版本是否满足要求
  2. 某些接口只支持特定的安卓版本(如 Q14、P14 等)
  3. 查看接口的"版本要求"部分
  4. 如果确实不支持,可以联系技术支持

📝 文档更新历史

日期更新内容
2026-01-14更新端口计算公式,新增投屏、控制等端口
2026-01-08新增接口:批量安装 apks/xapk 分包
2026-01-07新增接口:屏蔽按键
2026-01-06新增接口:后台保活

📞 技术支持

如有问题或建议,请联系:


文档版本: v3 | 最后更新: 2026-01-16 | 作者: 武汉魔云腾科技有限公司