一份跟着引擎走的文档:语法关键字、215 条内置中文指令(含英文别名)、运算符对照、运行时约定与 13 篇可运行示例——全部从当前版本函数注册表直接导出,与 App 编辑器长按词条看到的解释同源。
简单玩脚本 = 中文 DSL 与标准 Lua 双轨。写 找色(0,0,720,1280,"#FF0000",90),引擎自动翻译为 findColor(...);同一脚本里中英混写也完全合法。两种写法跑在同一个常驻 Lua 虚拟机上。
运行条件:Android 8.0+(API 26)· 基础功能免 Root(无障碍通道)· Root 为增强选项(evdev 多指并发/摇杆走位/免授权截屏)。脚本入口:悬浮球 → 编辑器 → ▶ 运行;工程页卡片「更新」可拉取云端分发脚本。调试输出在编辑器输出面板查看,提示函数为悬浮气泡。
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
循环 i = 1 到 20
局部变量 找到 = 找色(0, 0, 屏幕宽, 屏幕高, "#2F6FED", 90)
如果 找到 那么
点击(找到[1], 找到[2])
跳出
结束
等待(500)
结束
块结构以 结束 收尾;变量用 局部变量 声明(缩进 2 空格);「如果…那么…否则…结束」「当…执行…结束」「循环…到…步长…结束」「函数…结束」「循环秒 N 执行…结束」等中英关键字等价。「找到/结果」类返回表可用下标 [1]/[2] 或 .X/.Y 取坐标;找图/找色命中自动落位全局表「找到」,配合 点击xy() 一步点击。代码标点请用英文半角(编辑器「输入设置 → 中文标点转英文」默认开启可自动纠正)。
中文关键字与英文原生关键字等价,长按任意关键字均可查看同款解释。
| 关键字 | 结构 | 示例 |
|---|---|---|
| 如果 | 如果 条件 那么 … 结束 | |
| 那么 | 如果 条件 那么 … 结束 | |
| 否则 | 如果 … 那么 … 否则 … 结束 | |
| 否则如果 | 如果 … 那么 … 否则如果 条件 那么 … 结束 | |
| 结束 | 结束(块结束标记:如果/当/循环/函数/重复) | |
| 当 | 当 条件 执行 … 结束 | |
| 执行 | 当 条件 执行 … 结束 | |
| 循环 | 循环 变量 = 起始, 结束, 步长 … 结束 | |
| 到 | 循环 变量 = 起始 到 结束 … 结束 | |
| 步长 | 循环 变量 = 起始 到 结束 步长 增量 … 结束 | |
| 局部变量 | 局部变量 名称 = 值 | |
| 函数 | 函数 名称(参数…) … 结束 | |
| 返回 | 返回 值 | |
| 跳出 | 跳出(立即退出循环) | |
| 并且 | 条件1 并且 条件2(且) | |
| 或者 | 条件1 或者 条件2(或) | |
| 非 | 非 条件(取反) | |
| 真 | 真(布尔 true) | |
| 假 | 假(布尔 false) | |
| 空 | 空(nil,未赋值的变量) | |
| 调试输出 | 调试输出(内容) | |
| 等待 | 等待(毫秒) | |
| 重复 | 重复 … 直到 条件 | |
| 直到 | 重复 … 直到 条件(条件为真时结束) | |
| 循环无限 | 循环无限 … 结束(挂机主循环首选) | |
| 循环次 | 循环次 = 次数 … 结束(纯重复 N 次,无需用到计数变量) | |
| 循环秒 | 循环秒 = 秒数 … 结束(按真实时间循环,秒数可为小数;循环体内等待/耗时都计入) | |
| 找到 | 找到[X] / 找到[Y]=第一命中坐标,找到[个数]=命中数,找到[i][X]=第 i 个(找图/找色/找字命中后自动更新) | |
| if | if 条件 then … end | |
| then | if 条件 then … end | |
| else | if … then … else … end | |
| elseif | if … elseif 条件 then … end | |
| end | end(块结束标记) | |
| while | while 条件 do … end | |
| do | do … end(代码块) | |
| for | for 变量 = 起始, 结束, 步长 do … end | |
| in | for 变量 in 迭代器 do … end | |
| function | function 名称(参数) … end | |
| return | return 值 | |
| local | local 名称 = 值 | |
| break | break(退出循环) | |
| and | 条件1 and 条件2(且) | |
| or | 条件1 or 条件2(或) | |
| not | not 条件(取反) | |
| true | true(真) | |
| false | false(假) | |
| nil | nil(空值) | |
| repeat | repeat … until 条件 | |
| until | repeat … until 条件 | |
| goto | goto 标签 ::标签:: | |
引擎兼容标准 Lua 运算符:整除 //、幂 ^、位运算 & | ~ << >>(编辑器符号栏可一键插入)。中文显示名用于语法提示与符号面板,脚本中直接写符号。
| 符号 | 中文名 | 说明 |
|---|---|---|
+ | 加号 + | 加法 |
- | 减号 - | 减法 |
* | 乘号 * | 乘法 |
| 除号 / | 除法 |
| 整除 // | 整除 |
% | 取模 % | 取模 |
^ | 幂 ^ | 幂 |
== | 等于 == | 等于 |
~= | 不等于 ~= | 不等于 |
< | 小于 < | 小于 |
> | 大于 > | 大于 |
<= | 小于等于 <= | 小于等于 |
>= | 大于等于 >= | 大于等于 |
= | 赋值 = | 赋值 |
.. | 字符串拼接 .. | 字符串拼接 |
# | 取长度 # | 取长度 |
并且 | 并且 and | 且 |
或者 | 或者 or | 或 |
非 | 非 not | 取反 |
& | 按位与 & | 按位与 |
| | 按位或 | | 按位或 |
~ | 按位异或 ~ | 按位异或 |
<< | 左移 << | 左移 |
>> | 右移 >> | 右移 |
坐标表:命中返回 {X=, Y=},可 结果[1]/结果[2] 或 结果.结果[X] 取值;批量类返回带 个数/数量/长度 键。
路径:以 /res/ 开头的路径按当前工程内解析;其它绝对路径按设备真实路径。
线程:「启动线程」在独立 Lua 虚拟机运行(变量与主脚本隔离,互不读写),「停止线程」可打断;脚本停止用「停止运行」。
调试:调试输出/print 实时进输出面板;长按函数/关键字弹语法气泡(8 秒自动收起)。
与 App「首页 → 开始创作 → 示例」同一数据源,覆盖图色、控件、文件、网络、排序、递归等典型场景。
第一个脚本:输出日志 + 等待 + 气泡提示,跑通基础链路 · 示例_你好世界.lua-- ===== 你好,简单玩 =====
调试输出("你好,简单玩!")
等待(1000)
提示("第一个脚本运行成功")
调试输出("当前时间:", 取时间())循环找色直到目标出现,最多尝试 20 次(每 500ms 一次) · 示例_等到按钮点击.lua-- ===== 等到按钮出现并点击 =====
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
-- 把 "#2F6FED" 换成你的目标颜色(可用截图工具取色)
循环 i = 1 到 20
局部变量 找到 = 找色(0, 0, 屏幕宽, 屏幕高, "#2F6FED", 90)
如果 找到 那么
点击(找到[1], 找到[2])
调试输出("已点击目标,坐标:", 找到[1], 找到[2])
跳出
结束
等待(500)
结束
调试输出("循环结束")条件等待:等一个颜色出现(加载完成),再等它消失(页面切换) · 示例_等待颜色.lua-- ===== 等到颜色出现 / 消失 =====
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
-- 等待「完成」按钮的蓝色出现(最多 10 秒)
如果 等到颜色(0, 0, 屏幕宽, 屏幕高, "#2F6FED", 10000, 90) 那么
调试输出("目标颜色出现了")
否则
调试输出("超时未出现")
返回
结束
-- 等待某个遮罩颜色消失(最多 5 秒)
如果 等到颜色消失(0, 0, 屏幕宽, 屏幕高, "#1E1E1E", 5000, 90) 那么
调试输出("遮罩已消失,可以继续操作")
结束主色 + 偏移点组合定位,比单点找色更精确 · 示例_多点找色.lua-- ===== 多点找色 =====
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
-- 用截图工具的「多点」模式收集点:第一个是主色,其余是偏移点
局部变量 找到 = 多点找色("#FF6B6B", {{10, 0, "#FF6B6B"}, {0, 10, "#FFD93D"}, {-10, 0, "#FF6B6B"}}, 0, 0, 屏幕宽, 屏幕高, 90)
如果 找到 那么
调试输出("图标定位:", 找到[1], 找到[2])
点击(找到[1], 找到[2])
否则
调试输出("未找到图标")
结束按文本/ID 找控件并点击——不怕分辨率变化,比坐标稳定得多 · 示例_控件操作.lua-- ===== 控件操作 =====
-- 前提:无障碍服务已开启
如果 等待控件("同意", 5000) 那么
点击控件("同意")
调试输出("已点击「同意」")
结束
等待(800)
如果 控件存在("登录") 那么
点击控件("登录")
结束
调试输出("当前应用:", 取当前应用())
-- 导出当前窗口控件树(调试时查看)
调试输出(控件树导出())先截屏 → 滤掉背景色 → 再找图,大幅提高找图命中率 · 示例_滤色找图.lua-- ===== 滤色找图 =====
-- 步骤:截图工具里「保存原图」和「滤色预览」调好参数后参考此脚本
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
captureScreen("res/原图.png")
-- 排除白色背景(保留其他颜色)
图片滤色("res/原图.png", "res/滤色图.png", "#FFFFFF", 90, "排除")
-- 在滤色图上找模板(模板先放到工程 res 目录)
局部变量 找到 = 找图(0, 0, 屏幕宽, 屏幕高, "res/模板.png", 85)
如果 找到 那么
调试输出("模板位置:", 找到[1], 找到[2])
点击(找到[1], 找到[2])
否则
调试输出("未找到模板,请检查滤色参数")
结束文件读写 + 分割文本 + 循环处理,典型的数据处理流程 · 示例_文本配置.lua-- ===== 文本与配置文件 =====
-- 读取配置(不存在则创建)
局部变量 内容 = 读文件("配置.txt")
如果 内容 == 空 那么
写文件("配置.txt", "苹果,香蕉,橙子,葡萄")
内容 = "苹果,香蕉,橙子,葡萄"
调试输出("已创建默认配置")
结束
局部变量 列表 = 分割文本(内容, ",")
调试输出("共", 取表长度(列表), "项水果")
循环 i = 1 到 取表长度(列表)
调试输出("第", i, "项:", 列表[i])
结束
调试输出("MD5:", MD5加密(内容))随机点击 + 随机延时,让操作节奏更接近真人(防机械化检测) · 示例_随机操作.lua-- ===== 随机化操作 =====
局部变量 次数 = 随机整数(3, 8)
调试输出("本次执行", 次数, "次随机操作")
计时开始()
循环 i = 1 到 次数
-- 在 (100, 300) 到 (500, 800) 区域内随机点
随机点击(100, 300, 500, 800)
随机延时(500, 1500)
结束
调试输出("完成,耗时:", 取耗时(), "毫秒")GET / POST 请求,返回响应文本(需要网络) · 示例_http请求.lua-- ===== HTTP 请求(英文直调 httpRequest)=====
-- GET 请求
局部变量 响应 = httpRequest("https://httpbin.org/get")
如果 文本长度(响应) > 0 那么
调试输出("GET 响应长度:", 文本长度(响应))
调试输出("前 100 字:", 取文本片段(响应, 1, 100))
否则
调试输出("GET 失败(网络不可用?)")
结束
-- POST 请求(第二个参数为请求体)
局部变量 结果 = httpRequest("https://httpbin.org/post", "name=简单玩&version=1")
调试输出("POST 响应长度:", 文本长度(结果))电量 / 网络 / 方向 / 内存等环境检测,脚本开头做环境判断 · 示例_系统信息.lua-- ===== 系统信息 =====
调试输出("电量:", 取电池电量(), "%")
调试输出("网络:", 取网络类型())
调试输出("方向:", 取屏幕方向())
调试输出("星期:", 取星期())
调试输出("设备:", 取设备型号())
调试输出("系统:", 取系统版本())
局部变量 内存 = 取内存信息()
调试输出("可用内存:", 内存["可用内存"], "MB")
-- 示例:低电量时停止挂机
如果 取电池电量() < 20 那么
调试输出("电量过低,停止任务")
结束函数递归调用 + 返回值 + 循环打印,理解函数栈调用 · 示例_递归斐波那契.lua-- ===== 递归函数:斐波那契数列 =====
函数 斐波那契(n)
如果 n <= 2 那么
返回 1
结束
返回 斐波那契(n - 1) + 斐波那契(n - 2)
结束
-- 打印前 12 项(F(1)=1, F(2)=1, F(3)=2 ...)
循环 i = 1 到 12
调试输出("F(" + i + ") = " + 斐波那契(i))
结束
调试输出("递归调用完成")表(数组)操作 + 双层循环 + 相邻交换,元素间比较排序 · 示例_冒泡排序.lua-- ===== 冒泡排序 =====
局部变量 数据 = {5, 2, 9, 1, 7, 3, 8, 4, 6}
调试输出("排序前:", 合并文本(数据, ","))
局部变量 长度 = 取表长度(数据)
循环 i = 1 到 长度 - 1
循环 j = 1 到 长度 - i
如果 数据[j] > 数据[j + 1] 那么
局部变量 临时 = 数据[j]
数据[j] = 数据[j + 1]
数据[j + 1] = 临时
结束
结束
结束
调试输出("排序后:", 合并文本(数据, ","))自定义函数封装重复操作 + 多点找色精确定位 + 超时容错 · 示例_自动闯关.lua-- ===== 自动化闯关:函数封装 + 多点找色 =====
函数 找并点击(目标颜色, 偏移表)
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
循环 尝试 = 1 到 10
局部变量 位置 = 多点找色(目标颜色, 偏移表, 0, 0, 屏幕宽, 屏幕高, 90)
如果 位置 那么
点击(位置[1], 位置[2])
返回 真
结束
等待(500)
结束
调试输出("未找到目标:", 目标颜色)
返回 假
结束
-- 主流程:依次通过关卡,任一步失败则退出
如果 找并点击("#FF5252", {{10, 0, "#FF0000"}, {0, 10, "#AA0000"}}) 那么
等待(800)
调试输出("第一关通过")
否则
返回
结束
如果 找并点击("#4CAF50", {{8, 0, "#388E3C"}}) 那么
等待(600)
调试输出("第二关通过")
结束
调试输出("闯关脚本执行完毕")共 215 条中文指令,英文名为其别名、脚本中两种写法等价。数据源:FunctionLibrary / BuiltinDictionary / FunctionDocs 注册表,随版本自动更新。
插入脚本(脚本名)
插入并运行脚本
插入脚本("init")移动悬浮球(x, y, 透明度, 宽, 高)
移动悬浮球位置
移动悬浮球(100, 100, 100, 0, 0)显示窗体(布局名)
显示 UI 窗体
显示窗体("主界面")关闭窗体()
关闭当前窗体
关闭窗体()取控件值(控件ID)
获取控件值(复选框/单选框/开关返回整数 1/0,判断用 == 1 / == 0)
调试输出(取控件值("btn1"))取控件属性(控件ID, 属性)
获取控件属性
取控件属性("btn1", "text")设控件值(控件ID, 值)
设置控件值
设控件值("btn1", "新文本")设控件属性(控件ID, 属性, 值)
设置控件属性
设控件属性("btn1", "text", "新文本")绑定事件(控件ID, 事件名, 回调)
绑定控件事件
绑定事件("btn1", "click", function() 提示("点击") end)刷新控件(控件ID)
刷新控件显示
刷新控件("btn1")加载布局(布局名)
加载 UI 布局
加载布局("main")列出布局()
返回布局名列表
调试输出(列出布局())保存布局(布局名)
保存当前布局
保存布局("main")加入表项(控件ID, 索引, 文本)
添加列表项
加入表项("list1", -1, "新项")删除表项(控件ID, 索引)
删除列表项
删除表项("list1", 0)创建悬浮窗(x, y, w, h, 背景透明度, 关闭毫秒, 标题, 文字, 字体色, 显示方式, 窗口透明度)
创建悬浮窗
创建悬浮窗(0, 0, 200, 100, 200, 0, "标题", "内容", "#FFFFFF", 0, 255)更新悬浮窗文字(标题, 文字)
更新悬浮窗文字
更新悬浮窗文字("标题", "新内容")关闭悬浮窗(标题)
关闭悬浮窗
关闭悬浮窗("标题")取色(x, y)
取屏幕像素颜色,返回 #RRGGBB
局部变量 c = 取色(100, 200)找色(x1, y1, x2, y2, 颜色, 相似度)
区域内找颜色,返回坐标表或空
局部变量 p = 找色(0, 0, 720, 1280, "#FF0000", 90)多点找色(颜色, 偏移表, x1, y1, x2, y2, 相似度)
主色+偏移点组合精确找色
多点找色("#FF0000", {{10,0,"#00FF00"}}, 0, 0, 720, 1280, 90)找色扩展(x1, y1, x2, y2, 颜色, 相似度)
找所有匹配位置,返回坐标表
局部变量 列表 = 找色扩展(0, 0, 720, 1280, "#00FF00", 90)比色(x, y, 颜色, 相似度)
比较像素颜色是否匹配,返回真/假
如果 比色(100, 200, "#FFFFFF", 90) 那么取色点个数(x1, y1, x2, y2, 颜色, 相似度)
统计匹配像素数量
调试输出(取色点个数(0, 0, 720, 1280, "#FF0000", 90))区域截图(x1, y1, x2, y2, 路径)
截取指定区域保存
区域截图(0, 0, 500, 800, "/res/图片/b.png")找图(x1, y1, x2, y2, 图片, 相似度, 方向)
区域内找图片,命中返回坐标并落位找到表
如果 找图(0, 0, 720, 1280, "确定.png") 那么
点击xy()全分辨率找图(x1, y1, x2, y2, 模板, 最小匹配点数, 指序, 按下毫秒)
多尺度智能特征匹配找图,可跨分辨率;传指序则命中一步点击(真/假),不传只返回位置表
如果 全分辨率找图(0, 0, 720, 1280, "图标", 10, 0) 那么 调试输出("已点击") 结束找图全部(x1, y1, x2, y2, 图片, 相似度, 方向)
找所有命中位置,返回数组表
局部变量 结果 = 找图全部(0, 0, 720, 1280, "按钮.png")滤色找图(x1, y1, x2, y2, 图片, 颜色, 相似度, 方向)
滤色模板+找图一步完成
滤色找图(0, 0, 720, 1280, "/sdcard/icon.png", "#FFFFFF", 90, 0)取图尺寸(路径)
返回图片宽和高
局部变量 {宽, 高} = 取图尺寸("/sdcard/a.png")保持屏幕()
保持屏幕常亮
保持屏幕()释放屏幕()
取消屏幕常亮
释放屏幕()释放图缓存()
释放图片内存缓存
释放图缓存()等到颜色(x1, y1, x2, y2, 颜色, 超时, 相似度)
等待颜色出现,超时返回假
等到颜色(0, 0, 720, 1280, "#FF0000", 5000)等到颜色消失(x1, y1, x2, y2, 颜色, 超时, 相似度)
等待颜色消失,超时返回假
等到颜色消失(0, 0, 720, 1280, "#FF0000", 5000)等到图片(x1, y1, x2, y2, 图片, 超时, 相似度)
等待图片出现,超时返回假
等到图片(0, 0, 720, 1280, "按钮.png", 5000)图片缩放(路径, 宽, 高)
缩放图片到指定尺寸
图片缩放("/sdcard/a.png", 640, 480)图片裁剪(路径, x1, y1, x2, y2)
裁剪图片区域
图片裁剪("/sdcard/a.png", 0, 0, 200, 200)图片转Base64(路径)
图片转 Base64 字符串
局部变量 b = 图片转Base64("/sdcard/a.png")取图片像素(路径, x, y)
取图片指定像素颜色
取图片像素("/sdcard/a.png", 100, 100)取颜色分量(颜色)
返回 {红,绿,蓝}
局部变量 {红,绿,蓝} = 取颜色分量("#FF0000")取反色(颜色)
返回反色 #RRGGBB
取反色("#FF0000")随机颜色()
返回随机 #RRGGBB
随机颜色()多图查找(图片表, x1, y1, x2, y2, 相似度)
依次找多张图,返回 {索引,x,y} 或 false
局部变量 r = 多图查找({"/sdcard/a.png", "/sdcard/b.png"}, 0, 0, 720, 1280)多图查找全部(图片表, x1, y1, x2, y2, 相似度, 方向)
每张图找所有命中,返回结果数组表
局部变量 结果 = 多图查找全部({"a.png","b.png"}, 0, 0, 720, 1280)图片滤色(源图, 输出图, 颜色, 相似度, 模式)
按颜色滤色,模式: 保留/排除
图片滤色("/sdcard/a.png", "/sdcard/b.png", "#FFFFFF", 90, "保留")找图点击(x1, y1, x2, y2, 图片, 相似度, 方向)
找图+点击一步完成,命中返回真
找图点击(0, 0, 720, 1280, "怪物.png")点击(x, y, 时长, 手指ID)
模拟点击;手指ID=0单指三级降级,>0多指evdev直写;需Root
点击(500, 800)双击(x, y, 手指ID)
快速双击;手指ID=0单指三级降级,>0多指evdev直写;需Root
双击(500, 800)长按(x, y, 时长, 手指ID)
按住指定毫秒;手指ID=0单指三级降级,>0多指evdev直写;需Root
长按(500, 800, 1000)滑动(x1, y1, x2, y2, 时长, 手指ID)
从起点滑到终点;手指ID=0单指三级降级,>0多指evdev直写;需Root
滑动(300, 1000, 300, 300, 500)拖动(x1, y1, x2, y2, 时长, 手指ID=0, 是否弹起=0)
从起点拖到终点;手指ID=0单指三级降级,>0多指evdev直写;是否弹起=1挂指;需Root
拖动(300, 1000, 300, 300, 500)手势轨迹({点表}, 时长)按坐标序列画手势
手势轨迹({{100,100},{200,300}}, 500)按键(键码)
模拟按键
按键(4) -- 4=返回键返回键()
模拟返回键
返回键()主页()
模拟 Home 键
主页()最近任务()
模拟最近任务键
最近任务()音量加()
音量+
音量加()音量减()
音量-
音量减()输入文本(内容)
输入文本到当前焦点
输入文本("hello")启动应用(包名)
启动指定应用
启动应用("com.example.app")关闭应用(包名)
关闭指定应用
关闭应用("com.example.app")取当前应用()
返回当前前台应用包名
调试输出(取当前应用())随机点击(x1, y1, x2, y2)
区域内随机位置点击
随机点击(0, 0, 720, 1280)随机延时(最小, 最大)
随机等待毫秒
随机延时(100, 500)贝塞尔手势(点表, 时长)
贝塞尔曲线手势
贝塞尔手势({{100,100},{200,300}}, 600)连点(x, y, 次数, 手指ID)
连续点击多次;手指ID=0单指三级降级,>0多指evdev直写;需Root
连点(500, 800, 5)单轮盘移动(轮心X, 轮心Y, 目标X, 目标Y, 按住毫秒, 选项表)
按住轮盘推到方向;可配避让/回中;需 Root
单轮盘移动(100, 2000, 150, 2005, 3000)计算轮盘坐标(中心X, 中心Y, 半径, 角度)
返回轮盘边缘落点 {X,Y}
计算轮盘坐标(100, 2000, 100, 45)点击xy()
点击最近一次找图/找色命中的位置
如果 找图(0, 0, 720, 1280, "按钮.png") 那么
点击xy()区域识字(x1, y1, x2, y2, 精度)
区域内 OCR 识别文字
局部变量 t = 区域识字(0, 0, 720, 1280, 90)识字文本(图片路径)
识别图片中文字
局部变量 t = 识字文本("/sdcard/a.png")找字(文字, x1, y1, x2, y2, 精度)
区域内找文字,返回坐标或空
局部变量 p = 找字("确定", 0, 0, 720, 1280)区域找字(文字, x1, y1, x2, y2, 精度)
区域内精确找文字
区域找字("确定", 0, 0, 720, 1280)找字扩展(文字, x1, y1, x2, y2, 精度)
找所有匹配文字位置
找字扩展("确定", 0, 0, 720, 1280)设置识别引擎(引擎名)
切换 OCR 引擎
设置识别引擎("paddle")取引擎列表()
返回可用 OCR 引擎列表
调试输出(取引擎列表())取识字耗时()
返回 总毫秒,检测毫秒,识别毫秒,冷加载毫秒
局部变量 t1,t2,t3,t4 = 取识字耗时()识别坐标(x1, y1, x2, y2)
区域内识别坐标数字文字,返回 X,Y 两个值(未识别返回 空;坐标同时落位 找到[X]/[Y])
局部变量 x, y = 识别坐标(0, 0, 720, 200)读文件(路径)
读取文件内容,失败返回空
局部变量 c = 读文件("/sdcard/a.txt")写文件(路径, 内容, 模式)
写入文件;模式: 0=覆盖 1=第一行 2=追加
写文件("/sdcard/a.txt", "你好", 0)删文件(路径)
删除文件
删文件("/sdcard/a.txt")建目录(路径)
创建目录
建目录("/sdcard/test")删目录(路径)
删除目录
删目录("/sdcard/test")列目录(路径)
列出目录内容
局部变量 f = 列目录("/sdcard")文件存在(路径)
检查文件是否存在,返回真/假
如果 文件存在("/sdcard/a.txt") 那么重命名(旧路径, 新路径)
重命名文件
重命名("/sdcard/a.txt", "/sdcard/b.txt")复制文件(源, 目标)
复制文件
复制文件("/sdcard/a.txt", "/sdcard/b.txt")移动文件(源, 目标)
移动文件
移动文件("/sdcard/a.txt", "/sdcard/b.txt")文件大小(路径)
返回文件大小字节
调试输出(文件大小("/sdcard/a.txt"))取文本行数(路径)
统计 UTF-8 文本文件的行数,返回数字;文件不存在返回 0
调试输出(取文本行数("/sdcard/a.txt"))取行文本(路径, 行号)
读取文本文件第 N 行内容(行号从 1 开始);越界或文件不存在返回空文本
局部变量 行 = 取行文本("/sdcard/a.txt", 3)删除行文本(路径, 行号)
删除文本文件第 N 行(行号从 1 开始)并保存回文件;成功返回真,越界/文件不存在/写入失败返回假
如果 删除行文本("/sdcard/a.txt", 3) 那么
调试输出("已删除第 3 行")
结束ZIP打包(源目录, 目标ZIP路径)
压缩目录为 ZIP
ZIP打包("/sdcard/test", "/sdcard/test.zip")ZIP解压(ZIP路径, 目标目录)
解压 ZIP
ZIP解压("/sdcard/test.zip", "/sdcard/test")取文件时间(路径)
返回文件修改时间戳
调试输出(取文件时间("/sdcard/a.txt"))路径拼接(目录, 文件名)
拼接路径
路径拼接("/sdcard", "test", "a.txt")取文件名(路径)
返回文件名
取文件名("/sdcard/test/a.txt")取扩展名(路径)
返回扩展名
取扩展名("/sdcard/a.txt")取父目录(路径)
返回父目录
取父目录("/sdcard/test/a.txt")JSON编码(数据)
数据转 JSON 字符串
JSON编码({名字="张三", 年龄=25})JSON解码(字符串)
JSON 字符串转表
局部变量 t = JSON解码('{"a":1}')XML解析(XML字符串)
XML 转表
局部变量 t = XML解析("<a>1</a>")读配置(INI字符串)
解析 INI 文本为表
局部变量 t = 读配置(ini文本)写配置(路径, 表)
写入 INI 文件
写配置("/sdcard/a.ini", {section={key="val"}})分割文本(文本, 分隔符)
按分隔符分割为数组
局部变量 列表 = 分割文本("a,b,c", ",")合并文本(文本数组, 分隔符)
数组合并为字符串
合并文本({"a","b","c"}, ",")去空白(文本)
去除首尾空白
去空白(" hello ")文字过滤(文本, 去除字符可选)
一参=只保留中文/字母/数字(清洗符号空白);二参=删除指定内容:类关键字「字母」「数字」「汉字/中文」「标点/符号」「空白/空格」可组合连写(如"字母数字"),也可混入具体字符逐字删除
局部变量 s = 文字过滤("jdi大125,几3万1", "字母数字") -- "大,几万"替换文本(文本, 旧字, 新字)
替换文本中的字
替换文本("hello world", "world", "lua")正则匹配(文本, 正则式)
正则匹配返回真/假
正则匹配("abc123", "[0-9]+")转小写(文本)
转小写
转小写("HELLO")转大写(文本)
转大写
转大写("hello")格式化(格式, ...)
格式化字符串
格式化("%s-%d", "abc", 123)文本长度(文本)
返回字符数
文本长度("hello")URL编码(文本)
URL 编码
URL编码("hello world")URL解码(文本)
URL 解码
URL解码("hello%20world")十六进制编码(文本)
文本转十六进制
十六进制编码("abc")文本包含(文本, 子串)
检查子串是否存在
文本包含("hello", "ell")取文本片段(文本, 起始, 长度)
截取子串
取文本片段("hello", 2, 3)正则替换(文本, 正则, 替换为)
正则替换
正则替换("abc123", "[0-9]+", "X")文本统计(文本, 目标)
统计目标出现次数
文本统计("abcabc", "bc")反转文本(文本)
反转字符串
反转文本("hello")首字母大写(文本)
首字母转大写
首字母大写("hello")填充文本(文本, 长度, 填充字符)
填充到指定长度
填充文本("7", 4, "0")取小数点后(数字, 小数位)
格式化数字
取小数点后(3.14159, 2)取字符前字符(文本, 字符, 第N处)
取第N处字符前的文本
取字符前字符("a/b/c", "/", 2)取字符后字符(文本, 字符, 第N处)
取第N处字符后的文本
取字符后字符("a/b/c", "/", 2)取字符间字符(文本, 字符A, 字符B, 第N处)
取两字符之间的文本
取字符间字符("a[x]b[y]c", "[", "]", 1)数组个数(数组)
返回数组长度
数组个数({1,2,3})数组加数据(数组, 值1, 值2, …)
追加元素,返回新长度
数组加数据({1,2}, 3, 4)数组删数据(数组, 位置)
删除指定位置,返回剩余个数
数组删数据({1,2,3}, 2)数组提取数据(数组, 位置)
取指定位置的值
数组提取数据({1,2,3}, 2)数组排序(数组, 降序)
排序数组,返回新数组
数组排序({3,1,2}, 假)字符转整数(文本)
文本转整数,转不了返回0
字符转整数("1254")整数转字符(值)
整数转文本
整数转字符(1234)字符转浮点数(文本)
文本转浮点,转不了返回0.0
字符转浮点数("12.5")浮点数转字符(值)
浮点转文本
浮点数转字符(12.5)浮点数转整数(值)
浮点转整数(四舍五入)
浮点数转整数(12.7)整数转浮点数(值)
整数转浮点
整数转浮点数(12)计时开始()
复位全局秒表从零计时(墙上时间,改系统时间会影响),配合 取耗时 使用
计时开始()取耗时()
返回距上次 计时开始 的毫秒数;未调用过计时开始返回 0
调试输出("耗时:", 取耗时(), "毫秒")延时到(时间戳)
睡到指定毫秒时间戳再继续(已过点立即返回真);停止脚本会中断并报「已停止」
延时到(时间戳() + 5000)随机坐标(x1, y1, x2, y2)
区域内随机坐标,返回 {x,y}
局部变量 {x,y} = 随机坐标(0, 0, 720, 1280)重试执行(函数, 次数)
失败自动重试
重试执行(function() 找图(...) end, 3)停止运行()
停止整个脚本运行
停止运行()调试输出(内容)
输出到调试面板
调试输出("hello")调试变量(内容)
输出到变量信息标签
调试变量(变量名)等待(毫秒)
等待指定毫秒
等待(1000)提示(内容)
弹出提示 Toast
提示("hello")写日志(内容)
写入运行日志
写日志("hello")输入对话框(标题, 提示)
弹出输入框,返回输入文本或空
局部变量 s = 输入对话框("输入", "请输入")确认对话框(标题, 内容)
弹出确认框,返回真/假
如果 确认对话框("确认", "确定吗") 那么POST(地址, 请求头, 内容, 超时毫秒=10000)
POST 请求;超时毫秒可调(100~120000)
POST("https://api.example.com", "", "data", 15000)打开网页(网址)
系统浏览器打开链接
打开网页("https://www.baidu.com")读网页内容(网址, 超时毫秒=10000)
HTTP GET 抓取网页 HTML
局部变量 s = 读网页内容("https://example.com")下载文件(URL, 保存路径)
下载文件到本地
下载文件("https://x.com/a.png", "/sdcard/a.png")取时间()
返回当前时间字符串
取时间()时间戳()
返回当前毫秒时间戳
时间戳()取屏幕尺寸()
返回 宽,高
局部变量 {宽,高} = 取屏幕尺寸()震动(时长)
震动指定毫秒
震动(100)执行shell(命令, 是否root)
执行 Shell 命令
执行shell("ls /sdcard")取设备码()
返回设备唯一码
取设备码()播放声音(路径)
播放音频文件
播放声音("/sdcard/a.mp3")状态栏通知(标题, 内容)
弹出状态栏通知
状态栏通知("标题", "内容")剪贴板读()
读取剪贴板文本
局部变量 s = 剪贴板读()剪贴板写(文本)
写入剪贴板
剪贴板写("hello")随机整数(最小, 最大)
返回随机整数
随机整数(1, 100)随机小数(最小, 最大)
返回随机浮点数
随机小数(0, 1)随机文本(长度)
返回随机字符串
随机文本(8)MD5加密(文本)
MD5 哈希
MD5加密("hello")SHA1加密(文本)
SHA1 哈希
SHA1加密("hello")Base64编码(文本)
Base64 编码
Base64编码("hello")Base64解码(文本)
Base64 解码
Base64解码("aGVsbG8=")时间戳转时间(时间戳, 格式)
时间戳转可读时间
时间戳转时间(1700000000000, "年/月/日 时:分:秒")取表长度(表)
返回表元素个数
取表长度({a=1,b=2})取电池电量()
返回 0~100
调试输出(取电池电量())取网络类型()
返回 wifi/mobile/none
调试输出(取网络类型())取设备型号()
返回设备型号
调试输出(取设备型号())取系统版本()
返回 Android 版本
调试输出(取系统版本())取屏幕亮度()
返回 0~255
调试输出(取屏幕亮度())设置屏幕亮度(值)
设置亮度 0~255
设置屏幕亮度(128)存储空间()
返回剩余 MB
调试输出(存储空间())取屏幕密度()
返回屏幕密度
调试输出(取屏幕密度())震动模式(毫秒数组, 重复次数)
自定义震动模式
震动模式({500,200}, -1)语音播报(文本)
TTS 朗读
语音播报("你好")停止播报()
停止 TTS
停止播报()AES加密(文本, 密钥)
AES 加密返回 Base64
AES加密("hello", "key123")AES解密(密文, 密钥)
AES 解密
AES解密(密文, "key123")下拉通知栏()
下拉通知栏
下拉通知栏()关闭通知栏()
关闭通知栏
关闭通知栏()分屏切换()
切换分屏
分屏切换()剪贴板图片保存(保存路径)
保存剪贴板图片
剪贴板图片保存("/sdcard/a.png")锁屏()
锁屏(需激活设备管理器)
锁屏()激活设备管理器()
跳转系统设置激活
激活设备管理器()读取通知(关键词)
读取通知栏消息
局部变量 n = 读取通知("快递")清空通知()
清空所有通知
清空通知()取定位()
返回 {经度,纬度,精度}
局部变量 {经度,纬度} = 取定位()启动线程(函数或代码, 完成回调?, 线程ID?)
后台线程执行;线程里跑脚本:启动线程(读文件("xxx.lua"), "ID");ID不传自动编号「线程N」;停止线程("ID")单独停
启动线程(读文件("task2.lua"), "下载任务")停止线程(线程ID?)
传ID停止指定线程;不传停止全部「启动线程」的异步任务
停止线程("下载任务") 或 停止线程()取内存信息()
返回 {总内存,可用内存,低内存}
局部变量 {总内存,可用内存} = 取内存信息()取息屏时间()
返回息屏超时秒数
调试输出(取息屏时间())取星期()
返回星期一…星期日
调试输出(取星期())取两个日期差(日期1, 日期2)
两个日期相差的自然日天数(日期2减日期1,正数=日期2更晚);兼容 yyyy-MM-dd HH:mm:ss 和 yyyy-MM-dd;按日历日对齐忽略时分秒;解析失败返回 0
调试输出(取两个日期差("2024-01-01", "2024-01-05")) -- 输出 4日期增加天数(日期, 天数)
给日期加天数返回新日期字符串,格式与输入一致(含时分秒回带,纯日期回纯日期);天数可为负往前推;兼容两种日期格式;解析失败返回空文本
调试输出(日期增加天数("2024-01-01", 7)) -- 输出 2024-01-08取屏幕方向()
返回 横屏/竖屏
调试输出(取屏幕方向())控件存在(文本或id)
检查控件是否存在
如果 控件存在("确定") 那么点击控件(文本或id)
点击控件
点击控件("确定")取控件文本(文本或id)
获取控件文本
调试输出(取控件文本("标题"))取控件坐标(文本或id)
返回 {x1,y1,x2,y2}
局部变量 b = 取控件坐标("确定")控件输入(文本或id, 内容)
设置控件文本
控件输入("输入框", "hello")等待控件(文本或id, 超时)
等待控件出现
等待控件("确定", 5000)等待控件消失(文本或id, 超时)
等待控件消失,超时返回假
等待控件消失("确定", 5000)控件树导出()
导出当前窗口控件树文本
调试输出(控件树导出())计算角度(起X, 起Y, 终X, 终Y)
返回角度 0~360
计算角度(100, 100, 300, 200)计算直线距离(起X, 起Y, 终X, 终Y)
返回两点距离
计算直线距离(100, 100, 300, 200)