Skip to main content

Android RPA 开发文档

RPA 有 Python 语言和 Go 语言两种 API 文档,下面将分别介绍两种语言使用方法。

MYT RPA SDK Python 语言 API 文档​

该包封装了 libmytrpc.dll 中的所有功能,用于远程控制设备

📌 端口列表​

  • 更新日期 2025-04-07 初始版本
未找到匹配的文件
桥接模式​
  • IP 地址:桥接设备的 IP 地址
  • RPA 端口:固定为 9083
非桥接模式​
  • IP 地址(如 192.168.30.2):用来定位具体的设备或宿主机
  • RPA 端口:根据设备实例索引计算得出,计算公式为:30000 + (index - 1) × 100 + 2

Q1 设备端口列表(index 1-12):

实例位实例位(index)RPA 端口
坑位1130002
坑位2230102
坑位3330202
坑位4430302
坑位5530402
坑位6630502
坑位7730602
坑位8830702
坑位9930802
坑位101030902
坑位111131002
坑位121231102

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

实例位坑位号(index)RPA 端口
坑位1130002
坑位2230102
坑位3330202
坑位4430302
坑位5530402
坑位6630502
坑位7730602
坑位8830702
坑位9930802
坑位101030902
坑位111131002
坑位121231102
坑位131331202
坑位141431302
坑位151531402
坑位161631502
坑位171731602
坑位181831702
坑位191931802
坑位202031902
坑位212132002
坑位222232102
坑位232332202
坑位242432302

目录结构​

以下是 MYT RPA SDK 的完整目录结构,帮助您理解如何组织和使用 SDK 文件:

MYT_RPA_SDK_V10_20250407/
├── arm/ # ARM架构库文件(rk3588)
│ └── libmytrpc_arm.so # ARM Linux库
├── centos7/ # CentOS 7库文件
│ └── libmytrpc_centos.so # CentOS 7 Linux库
├── demo_py_x64/ # Python 64位演示项目
│ ├── rpc_demo.py # Python演示脚本
│ ├── common/ # 公共模块目录
│ │ ├── logger.py # 日志模块
│ │ ├── mytRpc.py # Python SDK核心实现
│ │ ├── mytSelector.py # 选择器实现
│ │ ├── rpcNode.py # 节点操作实现
│ │ ├── ToolsKit.py # 工具函数
│ │ └── __init__.py # 模块初始化
│ ├── lib/ # 库文件目录
│ │ ├── libmytrpc.dll # Windows库文件
│ │ ├── libmytrpc.dylib # macOS库文件
│ │ └── libmytrpc.lib # Windows导入库
│ └── log/ # 日志目录
├── include/ # 头文件目录
│ └── libmytrpc.h # C头文件
├── lib/ # Windows 32位库目录
│ ├── libmytrpc.dll # Windows 32位库文件
│ └── libmytrpc.lib # Windows 32位导入库
├── lib64/ # Windows 64位库目录
│ ├── libmytrpc.dll # Windows 64位库文件
│ └── libmytrpc.lib # Windows 64位导入库
├── macos(m)/ # macOS M系列芯片库目录
│ └── libmytrpc.dylib # macOS M系列库文件
├── macos(x86)/ # macOS x86芯片库目录
│ └── libmytrpc.dylib # macOS x86库文件
├── ubuntu/ # Ubuntu库目录
│ └── libmytrpc_ubuntu_x86_64.so # Ubuntu x86_64库文件
└── README.txt # SDK说明文档

引用文件功能与使用说明​

模块导入​

Python 版本采用面向对象的方式进行调用。以下是正确的导入方式:

# 导入核心SDK类
from common.mytRpc import MytRpc
# 选择器和节点类通常通过 MytRpc 方法间接获取,无需直接导入

依赖要求​

  • Python 3.7+ 64位版本
  • Windows / Linux / macOS 操作系统
  • 需要将对应平台的库文件放置在项目的 lib 目录下
  • 可选依赖:
    • OpenCV (cv2):用于图像处理和显示
    • NumPy (numpy):用于图像数据处理

引用文件功能说明​

文件名功能描述主要方法/类使用场景
mytRpc.py核心 SDK 实现,封装了与设备通信的所有主要功能MytRpc 类所有设备控制操作的入口点
mytSelector.py提供 UI 元素选择器功能,用于查找和筛选 UI 节点mytSelector 类需要根据条件查找 UI 元素时使用
rpcNode.py封装了 UI 节点的操作和属性获取方法rpcNode 类获取节点属性、执行节点操作时使用
logger.py提供日志记录功能logger 对象需要记录日志信息时使用
ToolsKit.py提供各种工具函数ToolsKit 类获取程序路径、检查进程状态等工具操作
__init__.py模块初始化文件-确保 common 目录可作为 Python 模块导入

库文件说明​

SDK 根据不同平台提供对应的底层库文件:

平台文件目录
Windows 32位libmytrpc.dll / libmytrpc.liblib/
Windows 64位libmytrpc.dll / libmytrpc.liblib64/
macOS M系列libmytrpc.dylibmacos(m)/
macOS x86libmytrpc.dylibmacos(x86)/
CentOS 7libmytrpc_centos.socentos7/
Ubuntu x86_64libmytrpc_ubuntu_x86_64.soubuntu/
ARM (rk3588)libmytrpc_arm.soarm/

SDK 会根据 sys.platform 自动选择对应的库文件加载。

安装说明​

  1. 复制库文件:从 SDK 包中复制对应平台的库文件到您项目的 lib 目录:

    项目目录/
    └── lib/
    └── libmytrpc.dll # Windows库文件(或对应平台的库文件)
  2. 复制Python模块:从 demo_py_x64/common/ 目录复制以下 Python 模块到您项目的 common 目录:

    • mytRpc.py(核心SDK实现)
    • mytSelector.py(选择器功能)
    • rpcNode.py(节点操作)
    • logger.py(日志功能)
    • ToolsKit.py(工具函数)
    • __init__.py(模块初始化)
  3. 项目结构:最终的项目结构应如下所示:

    项目目录/
    ├── common/
    │ ├── __init__.py
    │ ├── logger.py
    │ ├── mytRpc.py
    │ ├── mytSelector.py
    │ ├── rpcNode.py
    │ └── ToolsKit.py
    ├── lib/
    │ └── libmytrpc.dll # 对应平台的库文件
    └── your_script.py # 您的Python脚本
  4. 在脚本中使用:

    from common.mytRpc import MytRpc

    mytapi = MytRpc()
    if mytapi.init("设备IP", 端口号, 超时时间) == True:
    print("连接成功")

目录​


MytRpc 类 - 核心 SDK​

MytRpc 类是 SDK 的核心类,负责与远程设备建立连接并提供所有设备控制功能。所有方法都是实例方法,无需传递 handle 参数——handle 在内部自动管理。

初始化与释放​

MytRpc()​

创建 MytRpc 实例,自动根据平台选择库文件路径。

mytapi = MytRpc()

SDK 会根据 sys.platform 自动选择对应的库文件:

  • Windows: 项目根目录/lib/libmytrpc.dll
  • Linux: 项目根目录/lib/libmytrpc.so
  • macOS: 项目根目录/lib/libmytrpc.dylib

init​

初始化并连接远程设备。内部会重试连接直到成功或超时。

def init(self, ip: str, port: int, timeout: int) -> bool
参数类型说明
ipstr要远程控制的设备的IP地址
portint要远程控制的设备的RPA端口
timeoutint连接超时时间,单位秒。每10秒重试一次

返回值: bool - 连接成功返回 True,超时或失败返回 False


get_sdk_version​

获取当前 SDK 的版本号

def get_sdk_version(self) -> str

返回值: str - 版本号字符串,如果库文件不存在则返回空字符串 ''


check_connect_state​

检测远程连接是否处于连接状态

def check_connect_state(self) -> bool

返回值: bool - True 表示已连接,False 表示已断开


基础设备方法​

setRpaWorkMode​

设置RPA工作模式(无障碍模式开关)

def setRpaWorkMode(self, mode: int) -> bool
参数类型说明
modeint工作模式(1: 开启无障碍[默认], 0: 关闭无障碍)

返回值: bool - 设置成功返回 True,失败返回 False

说明:

  • 开启无障碍模式后,可以获取更加完整的节点信息,但某些应用环境会检测是否开启了无障碍
  • 该方法需要最新的固件版本支持

exec_cmd​

执行shell命令

def exec_cmd(self, cmd: str) -> tuple[str, bool]
参数类型说明
cmdstr要执行的命令行字符串

返回值: tuple[str, bool] - 返回元组 (output_text, success),output_text 为命令输出,success 为执行是否成功


dumpNodeXml​

获取节点树数据(XML格式)

def dumpNodeXml(self, bDumpAll: int) -> str | bool
参数类型说明
bDumpAllint是否导出所有节点(0或1)

返回值: str - 节点树XML字符串;失败时返回 False


dumpNodeXmlEx​

获取节点树数据(扩展版本,支持设置工作模式和超时)

def dumpNodeXmlEx(self, workMode: bool, timeout: int) -> str | bool
参数类型说明
workModeboolTrue 开启无障碍,False 关闭无障碍
timeoutint超时时间,单位毫秒。-1为永不超时

返回值: str - 节点树XML字符串;失败时返回 False


getDisplayRotate​

获取当前屏幕的旋转方向

def getDisplayRotate(self) -> bool

返回值: bool - 旋转方向为1时返回 True,否则返回 False

注意:当前实现仅检测旋转方向是否为1,如需获取完整旋转角度(0/1/2/3),需直接调用底层DLL。


截图方法​

takeCaptrueCompress​

远程截图,获取压缩后的图像字节数组

def takeCaptrueCompress(self, type: int, quality: int) -> bytearray | bool
参数类型说明
typeint0表示PNG,1表示JPG
qualityint压缩质量,取值0-100

返回值: bytearray - 压缩后的图像数据;失败时返回 False


takeCaptrueCompressEx​

远程截图(指定区域,压缩格式)

def takeCaptrueCompressEx(self, left: int, top: int, right: int, bottom: int, type: int, quality: int) -> bytearray | bool
参数类型说明
leftint截图区域的左坐标
topint截图区域的上坐标
rightint截图区域的右坐标
bottomint截图区域的下坐标
typeint0表示PNG,1表示JPG
qualityint压缩质量,取值0-100

返回值: bytearray - 压缩后的图像数据;失败时返回 False


screentshot​

截图并保存到文件

def screentshot(self, type: int, quality: int, file_path: str) -> bool
参数类型说明
typeint0表示PNG,1表示JPG
qualityint压缩质量,取值0-100
file_pathstr保存文件路径

返回值: bool - 成功返回 True,失败返回 False


screentshotEx​

截图(指定区域)并保存到文件

def screentshotEx(self, left: int, top: int, right: int, bottom: int, type: int, quality: int, file_path: str) -> bool
参数类型说明
leftint截图区域的左坐标
topint截图区域的上坐标
rightint截图区域的右坐标
bottomint截图区域的下坐标
typeint0表示PNG,1表示JPG
qualityint压缩质量,取值0-100
file_pathstr保存文件路径

返回值: bool - 成功返回 True,失败返回 False


触摸操作方法​

touchDown​

模拟按下

def touchDown(self, finger_id: int, x: int, y: int) -> bool
参数类型说明
finger_idint手指编号(0-9)
xintX坐标
yintY坐标

返回值: bool - 成功返回 True,失败返回 False


touchUp​

模拟弹起

def touchUp(self, finger_id: int, x: int, y: int) -> bool
参数类型说明
finger_idint手指编号(0-9)
xintX坐标
yintY坐标

返回值: bool - 成功返回 True,失败返回 False


touchMove​

模拟移动

def touchMove(self, finger_id: int, x: int, y: int) -> bool
参数类型说明
finger_idint手指编号(0-9)
xintX坐标
yintY坐标

返回值: bool - 成功返回 True,失败返回 False


touchClick​

模拟单击

def touchClick(self, finger_id: int, x: int, y: int) -> bool
参数类型说明
finger_idint手指编号(0-9)
xintX坐标
yintY坐标

返回值: bool - 成功返回 True,失败返回 False


longClick​

模拟长按

def longClick(self, finger_id: int, x: int, y: int, t: float) -> bool
参数类型说明
finger_idint手指编号(0-9)
xintX坐标
yintY坐标
tfloat长按时长,单位秒

返回值: bool - 成功返回 True,失败返回 False


swipe​

模拟滑动

def swipe(self, id: int, x0: int, y0: int, x1: int, y1: int, elapse: int) -> bool
参数类型说明
idint手指编号(0-9)
x0int起始X坐标
y0int起始Y坐标
x1int结束X坐标
y1int结束Y坐标
elapseint滑动持续时间(毫秒)

返回值: bool - 操作结果


按键和文本输入方法​

keyPress​

模拟按键

def keyPress(self, code: int) -> bool
参数类型说明
codeint按键码

返回值: bool - 成功返回 True,失败返回 False


pressBack​

模拟返回键(按键码 4)

def pressBack(self) -> bool

pressEnter​

模拟回车键(按键码 66)

def pressEnter(self) -> bool

pressHome​

模拟Home键(按键码 3)

def pressHome(self) -> bool

pressRecent​

模拟最近任务键(按键码 82)

def pressRecent(self) -> bool

sendText​

模拟键盘输入

def sendText(self, text: str) -> bool
参数类型说明
textstr要输入的字符串

返回值: bool - 成功返回 True,失败返回 False


ClearText​

清除输入的文字(通过按退格键实现)

def ClearText(self, count: int) -> None
参数类型说明
countint要清除的字符数量

该方法通过连续按 KEYCODE_DEL (67) 实现,无返回值。


App操作方法​

openApp​

打开指定包名的app

def openApp(self, pkg: str) -> bool
参数类型说明
pkgstr包名

返回值: bool - 成功返回 True,失败返回 False


stopApp​

停止指定的应用

def stopApp(self, pkg: str) -> bool
参数类型说明
pkgstr包名

返回值: bool - 成功返回 True,失败返回 False


视频流方法​

startVideoStream​

启动屏幕视频流传输

def startVideoStream(self) -> bool

注意:当前实现使用硬编码参数(宽400,高720,比特率20000),成功启动后会进入无限循环。视频数据通过模块级回调函数 video_cb 和 audio_cb 接收处理。


选择器方法​

create_selector​

创建一个筛选器对象

def create_selector(self) -> mytSelector | None

返回值: mytSelector - 筛选器对象;未连接时返回 None


release_selector​

释放筛选器对象

def release_selector(self, sel: mytSelector) -> None
参数类型说明
selmytSelector要释放的筛选器对象

便捷点击方法​

以下方法封装了"创建选择器 → 设置条件 → 查找节点 → 点击"的完整流程,使用更简洁。

clickText​

按照文本精确匹配查找节点并点击

def clickText(self, text: str) -> bool

clickTextMatchStart​

按照文本前缀匹配查找节点并点击

def clickTextMatchStart(self, text: str) -> bool

clickClass​

按照类名精确匹配查找节点并点击

def clickClass(self, clzName: str) -> bool

clickId​

按照资源ID精确匹配查找节点并点击

def clickId(self, id: str) -> bool

clickDesc​

按照描述精确匹配查找节点并点击

def clickDesc(self, des: str) -> bool

便捷节点查找方法​

以下方法封装了"创建选择器 → 设置条件 → 查找节点 → 转JSON"的完整流程,返回JSON字符串。

getNodeByText​

按照文本精确匹配查找节点

def getNodeByText(self, text: str) -> str | None

返回值: str - JSON字符串(数组格式),未找到返回 None


getNodeByTextMatchStart​

按照文本前缀匹配查找节点

def getNodeByTextMatchStart(self, text: str) -> str | None

getNodeByTextMatchEnd​

按照文本后缀匹配查找节点

def getNodeByTextMatchEnd(self, text: str) -> str | None

getNodeByPkg​

按照包名精确匹配查找节点

def getNodeByPkg(self, pkg: str) -> str | None

getNodeByClass​

按照类名精确匹配查找节点

def getNodeByClass(self, clzName: str) -> str | None

getNodeById​

按照资源ID精确匹配查找节点

def getNodeById(self, id: str) -> str | None

getNodeByDesc​

按照描述精确匹配查找节点

def getNodeByDesc(self, desc: str) -> str | None

mytSelector 类 - UI 元素选择器​

mytSelector 类用于创建和管理 UI 元素选择条件,查找符合条件的 UI 节点。

通过 MytRpc.create_selector() 创建,支持 with 语句。

查询执行方法​

execQuery​

执行查询返回符合条件的 Node 结果集

def execQuery(self, maxNode: int, timeout: int, reset_query: bool = True) -> list[rpcNode]
参数类型说明
maxNodeint期望最多筛选出的结果数量,超过直接返回
timeoutint查找超时时间(毫秒),未找到会一直查找直到超时
reset_querybool查询完成后是否自动清除筛选条件,默认 True

返回值: list[rpcNode] - 匹配的节点列表


execQueryOne​

执行查询返回第一个匹配的 Node

def execQueryOne(self, timeout: int, reset_query: bool = True) -> rpcNode | None
参数类型说明
timeoutint查找超时时间(毫秒),未找到会一直查找直到超时
reset_querybool查询完成后是否自动清除筛选条件,默认 True

返回值: rpcNode - 第一个匹配的节点,未找到返回 None


clear_Query​

清除所有筛选条件

def clear_Query(self) -> None

布尔属性筛选​

方法名参数说明
addQuery_Enable(self, enable)enable: int设置节点是否可用筛选器
addQuery_Checkable(self, enable)enable: int设置节点是否可以被选中筛选器
addQuery_Clickable(self, enable)enable: int设置节点是否可以被点击筛选器
addQuery_Focusable(self, enable)enable: int设置节点是否可以获取焦点筛选器
addQuery_Foucesd(self, val)val: int设置节点是否已经获取焦点筛选器
addQuery_Scrollable(self, enable)enable: int设置节点是否可以滚动筛选器
addQuery_LongClickable(self, enable)enable: int设置节点是否可以长按筛选器
addQuery_Passwordable(self, enable)enable: int设置节点是否是密码筛选器
addQuery_Selectedable(self, enable)enable: int设置节点是否被选中筛选器
addQuery_Visible(self, enable)enable: int设置节点是否可见筛选器

注意:以上参数均为 int 类型(0或1),非 bool 类型。addQuery_Foucesd 方法名中 "Foucesd" 为代码中的拼写,实际对应底层的 Focused 属性。


边界筛选​

方法名说明
addQuery_BoundsInside(self, left, top, right, bottom)设置在节点指定范围内的筛选器
addQuery_BoundsEqual(self, left, top, right, bottom)设置节点的范围等于指定范围的筛选器

索引筛选​

方法名说明
addQuery_index(self, ids)设置节点索引筛选器

ID匹配筛选​

方法名说明
addQuery_IdEqual(self, str_id)设置节点的资源ID等于指定id的筛选器
addQuery_IdStartWith(self, str_id)设置节点的资源ID以指定字符串开头的筛选器
addQuery_IdEndWith(self, str_id)设置节点的资源ID以指定字符串结尾的筛选器
addQuery_IdContainWith(self, str_id)设置节点的资源ID包含指定字符串的筛选器
addQuery_IdMatchWith(self, str_id)设置节点的资源ID正则匹配指定字符串的筛选器

Text匹配筛选​

方法名说明
addQuery_TextEqual(self, text)设置节点文本等于指定字符串的筛选器
addQuery_TextStartWith(self, text)设置节点文本以指定字符串开头的筛选器
addQuery_TextEndWith(self, text)设置节点文本以指定字符串结尾的筛选器
addQuery_TextContainWith(self, text)设置节点文本包含指定字符串的筛选器
addQuery_TextMatchWith(self, text)设置节点文本正则匹配指定字符串的筛选器

Class匹配筛选​

方法名说明
addQuery_ClzEqual(self, text)设置节点类名等于指定字符串的筛选器
addQuery_ClzStartWith(self, text)设置节点类名以指定字符串开头的筛选器
addQuery_ClzEndWith(self, text)设置节点类名以指定字符串结尾的筛选器
addQuery_ClzContainWith(self, text)设置节点类名包含指定字符串的筛选器
addQuery_ClzMatchWith(self, text)设置节点类名正则匹配指定字符串的筛选器

Package匹配筛选​

方法名说明
addQuery_PackageEqual(self, text)设置节点包名等于指定字符串的筛选器
addQuery_PackageStartWith(self, text)设置节点包名以指定字符串开头的筛选器
addQuery_PackageEndWith(self, text)设置节点包名以指定字符串结尾的筛选器
addQuery_PackageContainWith(self, text)设置节点包名包含指定字符串的筛选器
addQuery_PackageMatchWith(self, text)设置节点包名正则匹配指定字符串的筛选器

Desc匹配筛选​

方法名说明
addQuery_DescEqual(self, text)设置节点描述等于指定字符串的筛选器
addQuery_DescStartWith(self, text)设置节点描述以指定字符串开头的筛选器
addQuery_DescEndWith(self, text)设置节点描述以指定字符串结尾的筛选器
addQuery_DescContainWith(self, text)设置节点描述包含指定字符串的筛选器
addQuery_DescMatchWith(self, text)设置节点描述正则匹配指定字符串的筛选器

rpcNode 类 - UI 节点操作​

rpcNode 类封装了 UI 节点的属性获取和操作方法。通过 mytSelector.execQuery() 或 execQueryOne() 获取。

树遍历方法​

getParent​

获取父节点

def getParent(self) -> rpcNode | None

返回值: rpcNode - 父节点,无父节点时返回 None


getChildCount​

获取子节点数量

def getChildCount(self) -> int

返回值: int - 子节点数量


getChild​

获取所有子节点

def getChild(self) -> list[rpcNode]

返回值: list[rpcNode] - 子节点列表


节点属性获取方法​

getNodeJson​

获取节点的JSON字符串

def getNodeJson(self) -> str

返回值: str - JSON字符串


getNodeText​

获取节点的文本属性

def getNodeText(self) -> str

返回值: str - 文本内容


getNodeDesc​

获取节点的描述属性

def getNodeDesc(self) -> str

返回值: str - 描述内容


getNodePackage​

获取节点的包名属性

def getNodePackage(self) -> str

返回值: str - 包名


getNodeClass​

获取节点的类名属性

def getNodeClass(self) -> str

返回值: str - 类名


getNodeId​

获取节点的资源ID属性

def getNodeId(self) -> str

返回值: str - 资源ID


getNodeNound​

获取节点的边界范围

def getNodeNound(self) -> dict

返回值: dict - {'left': int, 'top': int, 'right': int, 'bottom': int},获取失败时各值为 -1

注意:方法名 "Nound" 为代码中的命名,实际含义为 "Bound"(边界)。


getNodeNoundCenter​

获取节点的中心坐标

def getNodeNoundCenter(self) -> dict

返回值: dict - {'x': int, 'y': int},获取失败时各值为 -1


节点操作方法​

Click_events​

点击节点

def Click_events(self) -> bool

返回值: bool - 成功返回 True,失败返回 False


longClick_events​

长按节点

def longClick_events(self) -> bool

返回值: bool - 成功返回 True,失败返回 False


使用示例​

基础使用示例​

from common.mytRpc import MytRpc

def main():
mytapi = MytRpc()

# 获取SDK版本
sdk_ver = mytapi.get_sdk_version()
print(f"SDK版本: {sdk_ver}")

# 初始化并连接设备
# 注意:端口不是adb端口,计算公式为:30000 + (index - 1) × 100 + 2
if mytapi.init("192.168.1.100", 30202, 10) == True:
print("设备连接成功")

try:
# 检查连接状态
if mytapi.check_connect_state():
print("当前连接状态正常")

# 设置工作模式
mytapi.setRpaWorkMode(1) # 1=开启无障碍

finally:
pass
else:
print("设备连接失败")

if __name__ == "__main__":
main()

截图示例​

from common.mytRpc import MytRpc

def main():
mytapi = MytRpc()

if mytapi.init("192.168.1.100", 30202, 10) == True:
try:
# 截图保存到文件
mytapi.screentshot(1, 90, "screenshot.png")

# 截图获取字节数据
byt_arr = mytapi.takeCaptrueCompress(0, 100) # 0=PNG, 100=质量
if byt_arr != False and len(byt_arr) > 0:
print(f"截图大小: {len(byt_arr)} 字节")

# 指定区域截图保存
mytapi.screentshotEx(100, 100, 500, 800, 1, 90, "region.jpg")

finally:
pass

if __name__ == "__main__":
main()

触摸操作示例​

from common.mytRpc import MytRpc
import time

def main():
mytapi = MytRpc()

if mytapi.init("192.168.1.100", 30202, 10) == True:
try:
# 单击
mytapi.touchClick(0, 500, 500)
time.sleep(1)

# 长按
mytapi.longClick(0, 500, 500, 1.0) # 1.0秒
time.sleep(1)

# 滑动
mytapi.swipe(0, 100, 500, 500, 500, 1000) # 持续1秒

finally:
pass

if __name__ == "__main__":
main()

按键和文本输入示例​

from common.mytRpc import MytRpc

def main():
mytapi = MytRpc()

if mytapi.init("192.168.1.100", 30202, 10) == True:
try:
# 发送文本
mytapi.sendText("Hello MYT RPA!")

# 清除文字
mytapi.ClearText(5)

# 快捷按键
mytapi.pressBack() # 返回键
mytapi.pressHome() # Home键
mytapi.pressEnter() # 回车键
mytapi.pressRecent() # 最近任务键

# 自定义按键码
mytapi.keyPress(26) # 电源键

finally:
pass

if __name__ == "__main__":
main()

App操作示例​

from common.mytRpc import MytRpc

def main():
mytapi = MytRpc()

if mytapi.init("192.168.1.100", 30202, 10) == True:
try:
# 打开应用
if mytapi.openApp("com.blue.filemanager"):
print("应用打开成功")

# 停止应用
if mytapi.stopApp("com.blue.filemanager"):
print("应用关闭成功")

finally:
pass

if __name__ == "__main__":
main()

节点操作示例​

from common.mytRpc import MytRpc

def main():
mytapi = MytRpc()

if mytapi.init("192.168.1.100", 30202, 10) == True:
try:
# 导出节点树
node_xml = mytapi.dumpNodeXml(1)
if node_xml != False:
with open("nodes.xml", "w", encoding='utf-8') as f:
f.write(node_xml)

# 使用选择器查找节点
selector = mytapi.create_selector()
with selector:
selector.addQuery_TextContainWith('登录')
selector.addQuery_Clickable(1)

node = selector.execQueryOne(2000) # 超时2秒
if node is not None:
print(f"节点信息: {node.getNodeJson()}")
node.Click_events()
else:
print("未找到匹配节点")

finally:
pass

if __name__ == "__main__":
main()

便捷方法示例​

from common.mytRpc import MytRpc

def main():
mytapi = MytRpc()

if mytapi.init("192.168.1.100", 30202, 10) == True:
try:
# 一行代码查找并点击
mytapi.clickText("确定")
mytapi.clickId("com.example:id/btn_login")
mytapi.clickClass("android.widget.Button")
mytapi.clickDesc("提交按钮")

# 便捷节点查找(返回JSON字符串)
nodes_json = mytapi.getNodeByText("登录")
if nodes_json is not None:
print(f"找到节点: {nodes_json}")

finally:
pass

if __name__ == "__main__":
main()

执行Shell命令示例​

from common.mytRpc import MytRpc

def main():
mytapi = MytRpc()

if mytapi.init("192.168.1.100", 30202, 10) == True:
try:
output, success = mytapi.exec_cmd("ls /data")
if success:
print(f"命令输出: {output}")

finally:
pass

if __name__ == "__main__":
main()

按键码参考​

# 常用按键码列表
KEYCODE_HOME = 3 # Home键
KEYCODE_BACK = 4 # 返回键
KEYCODE_CALL = 5 # 拨号键
KEYCODE_ENDCALL = 6 # 挂机键
KEYCODE_VOLUME_UP = 24 # 音量增加键
KEYCODE_VOLUME_DOWN = 25 # 音量减小键
KEYCODE_POWER = 26 # 电源键
KEYCODE_CAMERA = 27 # 拍照键
KEYCODE_ENTER = 66 # 回车键
KEYCODE_DEL = 67 # 退格键
KEYCODE_MENU = 82 # 菜单键
KEYCODE_SEARCH = 84 # 搜索键
KEYCODE_TAB = 61 # Tab键

MYT RPA SDK Go 语言 API 文档​

Go 语言版本的 SDK 提供了 RPA 自动化、Android 云手机控制等功能。

模块路径:cnb.cool/openmyt/myt-sdk-golang

Go 版本:1.18+

安装说明​

  1. 将 rpa_sdk 文件夹复制到你的 Go 项目

  2. 执行依赖同步

go mod tidy
  1. 导入包即可使用
import "rpa_sdk/rpa_sdk"
  1. 使用实例
c := rpa_sdk.NewController()
err := c.Connect("192.168.30.2", 30002)

目录​


一、初始化与连接​

1.1. NewController​

创建RPA控制器

func NewController() *Controller

1.2. Connect​

连接RPA设备

func (c *Controller) Connect(ip string, port uint16) error

1.3. Close​

关闭连接

func (c *Controller) Close()

二、基础设备方法​

2.1. CheckAlive​

检查设备是否存活

func (c *Controller) CheckAlive() error

2.2. ExecCmd​

执行 Shell 命令

func (c *Controller) ExecCmd(wait int, cmd string) (string, error)

2.3. DumpNodeXml​

获取当前界面 XML

func (c *Controller) DumpNodeXml(all bool) (string, error)

2.4. GetDisplayRotate​

获取屏幕旋转角度

func (c *Controller) GetDisplayRotate() (int, error)

三、截图方法​

3.1. TakeCapture​

全屏截图(原始RGBA数据)

func (c *Controller) TakeCapture() (ImageData, error)

ImageData 结构体:

字段类型说明
Widthint图像宽度
Heightint图像高度
Strideint图像步长
Pixels[]byteRGBA像素数据

3.2. TakeCaptureCompress​

压缩截图(JPEG/PNG)

func (c *Controller) TakeCaptureCompress(typ int, quality int) ([]byte, error)
参数类型说明
typint0表示PNG,1表示JPG
qualityint压缩质量,取值0-100

四、触摸操作方法​

4.1. Touch​

基础触摸事件

func (c *Controller) Touch(touchId, event, x, y int) error
参数类型说明
touchIdint手指编号
eventint事件类型
xintX坐标
yintY坐标

4.2. Swipe​

滑动事件

func (c *Controller) Swipe(touchId, x0, y0, x1, y1, ms int, async bool) error

五、按键和文本输入​

5.1. SendText​

输入文本

func (c *Controller) SendText(text string) error

5.2. KeyEvent​

按键事件

func (c *Controller) KeyEvent(keyCode int) error

六、App操作方法​

6.1. RunOrStopApp​

运行或停止应用

func (c *Controller) RunOrStopApp(flag int, packageName string) error
参数类型说明
flagint1=运行应用,0=停止应用
packageNamestr应用包名

七、选择器与节点操作​

Go 版本的选择器与节点系统采用流畅API(Fluent API)设计,支持链式调用。

7.1 创建选择器​

sel := c.NewSelector()

7.2 选择器筛选方法​

字符串匹配(每种属性支持5种匹配模式:Equal、StartWith、EndWith、ContainWith、MatchWith):

属性方法前缀示例
TextText*sel.TextEqual("登录")
IdId*sel.IdContainWith("btn")
DescDesc*sel.DescStartWith("按钮")
ClassClass*sel.ClassEqual("Button")
PackagePackage*sel.PackageEqual("com.app")

布尔属性匹配:

方法说明
Clickable(v)可点击
Checkable(v)可选中
Enabled(v)可用
Focusable(v)可获取焦点
Focused(v)已获取焦点
Checked(v)已选中
Scrollable(v)可滚动
LongClickable(v)可长按
Password(v)密码
Selected(v)已选择
Visible(v)可见

整数匹配:

方法说明
IndexEqual(v)索引匹配
DepthEqual(v)深度匹配
DrawingOrderEqual(v)绘制顺序匹配

边界匹配:

方法说明
BoundsEqual(l,t,r,b)边界完全匹配
BoundsInside(l,t,r,b)边界在指定范围内

7.3 查找节点​

// 查找节点
nodeSet, err := sel.FindNodes(ctx, maxCount, timeout)

// 节点集合操作
count := nodeSet.Size()
node, err := nodeSet.Get(index)
nodes := nodeSet.All()
nodeSet.Click(ctx, 0)
nodeSet.LongClick(ctx, 0)

7.4 节点操作​

// 节点属性
json, _ := node.JSON()
text := node.Text
desc := node.Desc
id := node.Id
class := node.Class
pkg := node.Package

// 位置信息
cx := node.CenterX()
cy := node.CenterY()
inRect := node.IsInRect(l, t, r, b)
eqBounds := node.BoundsEqual(l, t, r, b)

// 树遍历
parent := node.Parent()
childCount := node.ChildCount()
child := node.Child(index)

// 节点操作
node.Click(ctx)
node.LongClick(ctx)

八、常量说明​

指令码​

  • CMD_CHECK_LIVE = 100
  • CMD_TAKECAPTURE = 102
  • CMD_TOUCHACTION = 104
  • CMD_INPUTTEXT = 106
  • CMD_RUNSTOAPP = 107
  • CMD_EXEC = 110

触摸事件​

  • EVENT_TOUCH_DOWN = 1
  • EVENT_TOUCH_UP = 2
  • EVENT_TOUCH_MOVE = 3
  • EVENT_TOUCH_TAP = 4

九、使用示例​

package test

import (
"fmt"
"image"
"image/png"
"os"
"rpa_sdk/rpa_sdk"
"testing"
)

func TestRpa(t *testing.T) {
c := rpa_sdk.NewController()
if err := c.Connect("10.10.11.3", 30002); err != nil {
t.Errorf("Connect Error: %v", err)
return
}
defer c.Close()

// 截图
data, err := c.TakeCapture()
if err != nil {
t.Fatalf("Take Error: %v", err)
}
fmt.Println(data.Width, data.Height, data.Stride)

img := &image.RGBA{
Pix: data.Pixels,
Stride: data.Stride,
Rect: image.Rect(0, 0, data.Width, data.Height),
}
f, err := os.Create("./screen.png")
if err != nil {
t.Fatalf("Create Error: %v", err)
}
defer f.Close()
png.Encode(f, img)
}