度大师
度大师IDE安卓自动化脚本 · 开发文档
v1.1.1 返回官网

度大师IDE 函数开发文档

面向小白的安卓自动化脚本开发手册。所有函数在手机(真机 / 模拟器 / 打包后的 APK)上由 Lua 引擎提供,按本文调用即可,无需安装任何第三方库。

开始使用

了解项目结构、运行方式与所需权限,3 分钟跑通第一个脚本。

简介与项目结构

一个脚本项目是怎么组成的
在 IDE 点「新建脚本」,填写名字后会自动生成一个项目文件夹,包含入口文件、界面文件和图片目录。
我的脚本/
├── main.lua   -- 入口文件:脚本逻辑写在这里(先弹界面、再执行任务)
├── ui.lua     -- 界面文件:定义运行前弹出的配置界面(卡密、选项等)
└── image/     -- 图片文件夹:存放找图用的素材 PNG
各文件职责
main.lua程序入口。用 showUI 弹出界面、拿到用户填写的值,验证卡密后执行点击、滑动、找图等任务。
ui.lua界面描述表,return { pages = {...} }。main.lua 里用 require("ui") 加载。
image/找图素材目录。用「屏幕抓图工具」框选按钮后点「存为找图素材」,会自动裁剪 PNG 存到这里。
提示
复杂脚本可以在「项目文件」面板右键新建更多 .lua 文件和文件夹,用 require 拆分加载,便于管理。

三种运行方式对比

「运行」「真机测试」「打包APK」有什么区别
IDE 提供三种执行方式,分别用于调试、实测和发布,按需选择。
方式在哪执行真实点击/联网费用用途
运行电脑内置模拟器否,只打印模拟日志免费快速验证逻辑、语法、流程走向
真机测试手机 / 模拟器是,真实操作设备免费调试阶段实测,自动编译安装
云端打包云端构建正式 APK正式签名、可分发0.1 元/次发布给最终用户安装
注意
电脑「运行」不会真正点击手机、也不会真正联网请求服务器,界面按默认值自动确认;要看到真实 UI 弹窗和操作效果,请用「真机测试」。

权限与无障碍说明

运行前需要开启的权限
自动化操作依赖系统的无障碍服务与悬浮窗权限,首次使用按提示开启即可。
权限作用哪些函数需要
无障碍服务模拟点击、滑动、按键、输入与屏幕截图tap / swipe / key / input / 取色找图
悬浮窗显示悬浮球、悬浮 Toast 提示toast、悬浮球控制
Android 11 及以上无障碍截屏能力(取色 / 找色 / 找图的前提)getColor / findColor / findImage
开启步骤
  1. 安装并打开 App,按首页提示点「开启无障碍服务」,在系统列表中找到度大师并打开。
  2. 按提示授予「悬浮窗 / 显示在其他应用上层」权限。
  3. 回到 IDE 或 App 重新运行脚本即可。未开启无障碍时,日志会明确提示「无障碍服务未开启」。

UI 界面开发

运行脚本后在手机上弹出配置界面,让用户填卡密、选参数,确认后再后台执行任务。

showUI弹出参数配置界面
根据控件表在手机上弹出参数表单,用户点「确定」返回填写结果表;点「取消」返回 nil。支持单页与多页 Tab。
函数签名
local r = showUI(spec [, title])
参数
参数类型必填说明
spectable是控件描述表。单页直接写一维数组 { {type=...}, ... };多页写 { pages = { {title=, items={...}}, ... } }。
titlestring否弹窗标题,默认 "参数设置"。
返回值
用户点确定 → 结果 table,用 r.键名 取值(各控件返回类型见下表);点取消 → nil。
最简单的例子
local r = showUI({
    { type = "text", text = "请填写信息" },
    { type = "edit", key = "name", text = "昵称", default = "小白" },
    { type = "check", key = "agree", text = "我已阅读说明", default = true },
}, "我的设置")

if r == nil then
    toast("已取消")
    return
end
toast("你好," .. r.name)

控件类型总览

8 种 UI 控件及返回类型
每个控件是一个 table,type 决定控件种类,key 决定结果表里的字段名。
text
说明文字,只展示
返回:无(不需要 key)
edit
单行输入框
返回:字符串
password
密码输入框(隐藏字符)
返回:字符串
multiline
多行输入框
返回:字符串
radio
单选按钮组(配 options)
返回:序号(从 1)
check
单个勾选框
返回:true/false
checkgroup
多选框组(配 options)
返回:序号数组
spinner
下拉选择框(配 options)
返回:序号(从 1)
控件通用字段
type控件类型,取上面 8 个值之一。
key结果键名。main 中用 r.key 取值;text 控件可省略。
text控件标签 / 显示文字。
default默认值:输入类填字符串,check 填布尔,radio/spinner 填序号,checkgroup 填序号数组 {1,3}。
options选项数组,仅 radio / checkgroup / spinner 需要,如 options = {"快速","正常"}。
orientation选项排列方向,仅 radio / checkgroup 需要:"vertical" 竖排(默认)、"horizontal" 横排自动换行。

多页面与横/竖排

多个页面、选项横排或竖排
界面可以有多个 Tab 页面,顶部左右切换;radio 和 checkgroup 的选项可自由设置横排或竖排。
多页面写法(ui.lua)
return {
    pages = {
        {
            title = "卡密登录",
            items = {
                { type = "edit", key = "kami", text = "卡密", default = "" },
            }
        },
        {
            title = "任务设置",
            items = {
                -- 横排单选:选项短、数量少时用
                { type = "radio", key = "mode", text = "模式",
                  options = { "快速", "正常", "慢速" }, default = 2,
                  orientation = "horizontal" },
                -- 竖排多选(默认,orientation 可省略)
                { type = "checkgroup", key = "tasks", text = "任务",
                  options = { "签到", "领奖", "打怪" }, default = { 1, 2 },
                  orientation = "vertical" },
            }
        },
    }
}
规则
所有页面控件的 key 不能重复;确定时所有页面的结果会合并到同一张表,main 里用 r.键名 统一取值,不分页。

如何获取界面的值

UI 里填的变量,在 main.lua 中怎么拿
这是最核心的一步:showUI 返回结果表 r,不同控件返回不同类型,下面是完整可运行对照。
第一步:ui.lua 定义控件
return {
    { type = "edit",       key = "account", text = "账号", default = "test001" },
    { type = "password",   key = "pwd",     text = "密码", default = "123456" },
    { type = "radio",      key = "mode",    text = "模式", options = { "快速", "正常", "慢速" }, default = 2 },
    { type = "spinner",    key = "server",  text = "区服", options = { "一区", "二区", "三区" }, default = 1 },
    { type = "check",      key = "vip",     text = "开启VIP", default = false },
    { type = "checkgroup", key = "tasks",   text = "任务", options = { "签到", "领奖", "打怪" }, default = { 1, 2 } },
}
第二步:main.lua 取值
local ui = require("ui")
local r = showUI(ui, "登录与设置")
if r == nil then return end       -- 用户取消

-- 输入类:字符串
log("账号 = " .. r.account)
log("密码 = " .. r.pwd)

-- radio / spinner:选中序号(数字,从 1 开始)
log("模式序号 = " .. r.mode)       -- 2
log("区服序号 = " .. r.server)     -- 1

-- 想把序号转成文字,自己建一个名称表按下标取
local modeNames = { "快速", "正常", "慢速" }
log("模式文字 = " .. modeNames[r.mode])   -- 正常

-- check:布尔值
if r.vip then log("已开启VIP") end

-- checkgroup:序号数组,用 ipairs 遍历
local taskNames = { "签到", "领奖", "打怪" }
for _, idx in ipairs(r.tasks) do
    log("需要执行:" .. taskNames[idx])
end
返回类型对照表
控件r.key 的类型示例结果
edit / password / multilinestringr.account = "test001"
radio / spinnernumber(序号)r.mode = 2
checkbooleanr.vip = false
checkgroup序号 tabler.tasks = {1,2}

输入框 / 确认框 / 消息框

三个轻量对话框
不需要设计完整表单时,用这三个函数快速获取一段文字、一个确认,或提示一条消息。
inputBox —— 单值输入
local s = inputBox([标题, 默认值])
-- 例:
local name = inputBox("请输入昵称", "小白")
if name == nil then return end   -- 点取消返回 nil
toast("你好," .. name)
标题string否默认 "请输入"
默认值string否默认空字符串
返回:确定 → 字符串;取消 → nil
confirmBox —— 确认选择
local ok = confirmBox([消息, 标题])
-- 例:
local sure = confirmBox("确定要开始执行吗?", "温馨提示")
if not sure then return end
返回:确定 → true;取消 → false
msgBox —— 消息提示(无返回值)
msgBox([消息, 标题])
-- 例:
msgBox("任务已全部完成", "提示")
参数顺序
inputBox 第一个参数是「标题」;confirmBox 和 msgBox 第一个参数是「消息内容」、第二个才是「标题」,别写反。

触摸与按键

模拟手指点击、长按、滑动,以及系统按键和文本输入,全部依赖无障碍服务。

需无障碍
tap / click单击屏幕坐标
在指定坐标点模拟一次手指单击。tap 和 click 完全等价,用哪个都行。
tap(x, y)
click(x, y)
参数类型必填说明
xnumber是横坐标(像素)。
ynumber是纵坐标(像素)。
-- 先取屏幕尺寸,点屏幕正中间
local s = getScreenSize()
tap(s.width / 2, s.height / 2)
sleep(500)

-- 点固定坐标
tap(444, 412)
坐标怎么来
用 IDE「屏幕抓图工具」连接设备后,鼠标移到哪就显示该点坐标,直接填入即可。
需无障碍
longClick长按某坐标
在指定坐标按住一段时间后松开,可用于拖拽触发、弹出菜单等。
longClick(x, y [, duration])
x, ynumber是长按坐标。
durationnumber否长按时长(毫秒),默认 800。
longClick(500, 800)        -- 长按 0.8 秒
longClick(500, 800, 1500)  -- 长按 1.5 秒
需无障碍
swipe从一点滑到另一点
模拟手指从起点滑动到终点,可控制滑动时长,常用于翻页、拖动滑块。
swipe(x1, y1, x2, y2 [, duration])
参数类型必填说明
x1,y1number是起点坐标。
x2,y2number是终点坐标。
durationnumber否滑动时长(毫秒),默认 300。时间越长滑得越慢。
local s = getScreenSize()
-- 从右向左滑(翻到下一页)
swipe(s.width * 0.8, s.height / 2, s.width * 0.2, s.height / 2, 300)
-- 从下向上滑(向上滚动)
swipe(s.width / 2, s.height * 0.8, s.width / 2, s.height * 0.2, 400)
需无障碍
key模拟系统按键
通过无障碍全局动作模拟常用系统按键,无需 root。
key(name)
name 取值动作
"home"回到主屏幕
"back"返回上一级
"recent" / "recents"打开最近任务(多任务)界面
"notifications"下拉通知栏
"quicksettings"打开快捷设置面板
"power"弹出电源(关机)对话框
key("home")
sleep(1000)
key("back")
大小写
参数不区分大小写;传入不支持的按键名时,日志会提示「不支持的按键」。
需无障碍
input向输入框输入文本
先把光标聚焦到目标输入框,再调用本函数输入文字;找不到输入框时会自动写入剪贴板。
input(text)
textstring是要输入的文字内容。
tap(360, 400)        -- 先点输入框使其聚焦
sleep(500)
input("我的账号123")  -- 输入文字
说明
若系统未找到可输入的焦点,函数会把文字写入剪贴板,并在日志注明「未找到输入框,已写入剪贴板」,此时可长按粘贴。

找图找色

基于无障碍屏幕截图,识别屏幕上的颜色或图片,实现“看到按钮再点”的智能操作。需 Android 11 及以上。

Android 11+
getColor读取某点颜色
截取当前屏幕并返回指定坐标点的颜色值(0xRRGGBB)。
local c = getColor(x, y)
x, ynumber是要取色的坐标。
返回:颜色整数 0xRRGGBB;截屏失败或坐标越界时返回 0。
local c = getColor(500, 300)
log(string.format("颜色 = 0x%06X", c))
if c == 0xFF0000 then
    log("这个点是红色")
end
Android 11+
findColor在区域内寻找颜色
在指定矩形区域内查找与目标颜色相近的第一个点,返回其坐标。
local p = findColor(color, x1, y1, x2, y2 [, sim])
参数类型必填说明
colornumber是目标颜色,如 0xFF0000。
x1,y1,x2,y2number是搜索区域左上角与右下角坐标。
simnumber否相似度 0~1,默认 0.9。值越大要求越接近。
找到 → 坐标表 { x=, y= };未找到 → { x=-1, y=-1 }。
local p = findColor(0x00B96B, 0, 800, 720, 1200, 0.9)
if p.x ~= -1 then
    tap(p.x, p.y)
else
    log("没有找到该颜色按钮")
end
容差
内部按 容差 = 255 × (1 - sim) 计算并限制在 5~60 之间;颜色有轻微差异时可适当调小 sim(如 0.85)。
Android 11+
findImage在屏幕上查找图片
用 image 文件夹里的素材图在屏幕(或指定区域)中匹配,返回命中位置的中心点坐标。
local p = findImage(path [, x1, y1, x2, y2 [, sim]])
参数类型必填说明
pathstring是素材相对路径,如 "image/btn.png"。
x1..y2number否搜索区域;省略则全屏查找。
simnumber否相似度阈值 0~1,默认 0.9。
找到 → { x=, y=, score= }(x/y 为素材中心点,score 为 0~1 相似度);未找到 → { x=-1, y=-1 }。
-- 全屏找图
local p = findImage("image/btn.png")
if p.x ~= -1 then
    tap(p.x, p.y)
    log("相似度 " .. math.floor(p.score * 100) .. "%")
else
    log("未找到图片")
end

-- 指定区域 + 相似度
local q = findImage("image/start.png", 0, 600, 720, 1000, 0.85)
if q.x ~= -1 then tap(q.x, q.y) end
算法说明
找图为引擎内置的纯 Java 像素匹配,不依赖 OpenCV,采用“粗扫(步长 4)+ 精配(步长 1)”两级模板匹配,速度快且支持 PNG 透明区域(透明像素不参与比对)。
Android 11+
waitImage等待图片出现
在超时时间内反复截图查找,直到素材出现返回 true;适合等待页面加载、按钮弹出。
local ok = waitImage(path [, timeout [, sim]])
pathstring是素材相对路径。
timeoutnumber否超时时间(毫秒),默认 5000(5 秒)。
simnumber否相似度,默认 0.9。内部每 300 毫秒截图查找一次。
在超时内出现 → true;超时仍未出现 → false。
-- 最多等 10 秒,直到“进入游戏”按钮出现
if waitImage("image/enter.png", 10000, 0.9) then
    local p = findImage("image/enter.png")
    tap(p.x, p.y)
else
    toast("等待超时,请检查网络")
    exitScript()
end

素材目录与抓图工具

如何制作并使用找图素材
找图素材是从真实屏幕上裁剪下来的小图(PNG),配合 IDE 的「屏幕抓图工具」一键完成。
  1. 连接设备后打开 IDE 的「屏幕抓图工具」(独立窗口,可任意拖动,不遮挡编辑区)。
  2. 工具实时显示设备画面,鼠标移动即显示当前坐标和该点颜色。
  3. 用鼠标在画面上框选目标按钮 / 图标的范围。
  4. 点「存为找图素材」,在弹出的确认框命名,工具会自动裁剪成 PNG 存入项目 image/ 文件夹,并插入对应的 findImage 代码。
抓图工具的功能
坐标拾取实时显示鼠标所在点的 (x, y),供 tap 使用。
取色显示该点 0xRRGGBB 颜色值,供 getColor / findColor 使用。
框选范围拖出矩形,得到区域坐标,供区域找图 / 找色使用。
截图 / 存素材保存整屏,或把框选区域裁剪成 PNG 素材。
重要
素材必须放在项目 image/ 文件夹并随脚本一起推送 / 打包,否则真机上会提示「找不到找图素材」。素材尽量裁剪紧凑、只保留目标本身,可带透明背景以提高匹配率。

设备与系统

延时、提示、日志、屏幕与设备信息、脚本退出等基础能力。

sleep延时等待
让脚本暂停指定的毫秒数,再继续往下执行。等待期间仍可被「暂停 / 停止」即时打断。
sleep(ms)
msnumber是等待时长(毫秒)。1 秒 = 1000 毫秒。
toast("3 秒后开始")
sleep(3000)    -- 等 3 秒
tap(500, 500)
sleep(500)     -- 等 0.5 秒
可打断
sleep 内部按 50 毫秒切片检查运行状态,所以点悬浮球「暂停 / 停止」时无需等满延时,立即生效。
toast屏幕悬浮提示
在屏幕上短暂弹出一条文字提示。优先走悬浮窗,应用退到后台仍可见,必要时自动回退系统 Toast。
toast(text)
textstring是要提示的文字。
toast("脚本开始运行")
sleep(2000)
toast("执行完成")
与 log 区别
toast 显示在手机屏幕上给最终用户看;log 只输出到 IDE / App 的日志窗口,用户在手机上看不到。
log / print输出日志
把信息输出到日志窗口,便于调试观察。两者等价,可同时传多个参数,参数间用制表符分隔。
log(...)
print(...)
log("===== 脚本开始 =====")
local x = 100
log("x 的值是", x)          -- 多参数,自动用 tab 分隔
log("结果 = " .. tostring(x))
log("===== 脚本结束 =====")
getScreenSize获取屏幕宽高
返回当前设备屏幕的像素宽度和高度,用于按比例计算坐标,适配不同分辨率。
local s = getScreenSize()
-- s.width  屏幕宽度(像素)
-- s.height 屏幕高度(像素)
返回表:{ width=, height= }。
local s = getScreenSize()
log("屏幕:" .. s.width .. " x " .. s.height)
-- 用比例而不是固定坐标,换分辨率也不会点错
tap(s.width / 2, s.height * 0.9)   -- 水平居中、靠近底部
getDeviceId获取设备唯一码
返回本机的唯一设备码,卡密平台用它把卡密和设备绑定(一机一码)。kamiVerify 内部已自动调用,通常无需手动取。
local id = getDeviceId()
返回:设备码字符串(基于 Android ANDROID_ID;取不到时回退为 "dudashi-xxxx-xxxx")。
local id = getDeviceId()
log("本机设备码 = " .. id)
exitScript立即退出脚本
立即终止脚本,后面的代码不再执行。常用于卡密验证失败、条件不满足时提前结束。
exitScript([提示文字])
提示string否退出原因,会显示在日志中。
if not ok then
    exitScript("条件不满足,脚本结束")
end
-- 这里的代码在上面退出后不会执行
log("不会走到这里")
与 return 区别
return 只是结束当前函数 / 入口 chunk;exitScript 会强制终止整个脚本运行,效果更彻底,卡密失败场景应使用它。

网络与数据

发起 HTTP 网络请求、处理 JSON 数据,用于对接自己的服务器接口。

httpGet / httpPost同步网络请求
发起 HTTP 请求并等待返回,得到响应体和 HTTP 状态码两个结果。连接与读取超时各 12 秒。
local body, code = httpGet(url)
local body, code = httpPost(url, body)
参数类型必填说明
urlstring是完整请求地址,如 "http://api.example.com/data"。
bodystring否仅 httpPost:提交的内容,默认空字符串。
成功 → 返回两个值:响应体(字符串) 和 状态码(数字,如 200);网络异常 / 超时 → "", 0。
-- GET 请求
local ret, code = httpGet("http://api.example.com/info?id=1")
if code == 200 then
    log("返回:" .. ret)
else
    toast("请求失败,状态码 " .. tostring(code))
end

-- POST 请求
local r2, c2 = httpPost("http://api.example.com/login",
                        "user=test&pwd=123456")
log(r2, c2)
多返回值
两个函数都返回「响应体, 状态码」两个值,必须用两个变量接收;电脑「运行」时不真正联网,只有真机才会真正请求。
jsonLib.decode / jsonLib.encodeJSON 与 Lua 表互转
把服务器返回的 JSON 字符串解析成 Lua 表,或把 Lua 表编码成 JSON 字符串提交。
local t = jsonLib.decode(str)    -- JSON 字符串 -> Lua 表
local s = jsonLib.encode(t)      -- Lua 表 -> JSON 字符串
decode 成功 → Lua 表,格式错误 → nil;encode 成功 → JSON 字符串,失败 → "{}"。
local ret, code = httpGet("http://api.example.com/user")
if code == 200 then
    local data = jsonLib.decode(ret)
    if data then
        log("姓名:" .. data.name)
        log("年龄:" .. tostring(data.age))
    end
end

-- 把表编码成 JSON
local obj = { name = "小白", vip = true }
log(jsonLib.encode(obj))   -- {"name":"小白","vip":true}
对应关系
JSON 对象 → Lua 表(键值对),JSON 数组 → Lua 表(数字下标,从 1 开始);数字、布尔、字符串自动对应。

卡密验证

一键接入卡密登录,自动上送设备码、校验有效期,无需自己编写函数体。

kamiVerify内置卡密验证(一键调用)
传入你的应用 ID 和用户输入的卡密,引擎自动读取设备码并请求卡密平台校验。成功提示到期时间并返回 true;任何失败都会提示原因并自动退出脚本。
local ok = kamiVerify(appid, kami)
参数类型必填说明
appidstring是你在卡密平台申请到的应用 ID(替换 main.lua 顶部的 "你的APPID")。
kamistring是用户在界面输入的卡密,通常取 r.kami。
验证成功 → 悬浮提示「验证成功!到期时间:…」并返回 true;空卡密 / 卡密错误 / 无网络 / 未配置 APPID → 提示具体原因并 exitScript 终止,返回 false。
标准用法(配合默认卡密界面)
local APPID = "你的APPID"          -- 改成你在卡密平台的应用 ID

local ui = require("ui")
local r = showUI(ui, "登录")
if r == nil then return end

-- 只要这一行:自动上送设备码、校验卡密、提示到期时间
local ok = kamiVerify(APPID, r.kami)
if not ok then return end

-- 验证通过,下面才是正式任务
toast("登录成功,开始执行")
sleep(1000)
设备码
验证时会自动把 getDeviceId() 作为 markcode 上送,卡密后台可看到并绑定该设备;无需手动获取或拼接请求。

模块化

把脚本拆到多个 lua 文件,按需加载,便于组织复杂项目。

require加载项目内其他 lua 文件
加载并执行项目中的另一个 lua 文件,返回其 return 值。同一文件多次 require 只执行一次(带缓存)。
local m = require(name)
namestring是模块名。可写 "ui"、"ui.lua",点分名 "game.utils" 会按 game/utils.lua 查找。
返回被加载文件的 return 值;文件没有 return 时返回 true;找不到模块时日志报错并返回 nil。
例子:自定义一个工具模块
-- utils.lua
local M = {}
function M.sayHi(name)
    toast("你好," .. name)
end
return M

-- main.lua
local utils = require("utils")
utils.sayHi("小白")

-- 加载界面
local ui = require("ui")
新建文件
在「项目文件」面板右键即可新建 lua 文件或文件夹;模块文件放好后用 require 加载,注意名字与文件路径对应。

Lua 语言基础

脚本使用 Lua 语言编写,这里是最常用的语法,零基础也能快速上手。

语法速查

最常用的 Lua 语法
注释、变量与类型
-- 这是单行注释
--[[ 这是
多行注释 ]]

local n = 100              -- 数字
local name = "小白"         -- 字符串(单双引号都行)
local ok = true            -- 布尔:true / false
local t = nil              -- nil 表示空
local s = "你好," .. name  -- 两个点 .. 拼接字符串
local len = #name          -- # 取字符串长度 / 表元素个数
条件判断 if
local score = 80
if score >= 90 then
    log("优秀")
elseif score >= 60 then
    log("及格")
else
    log("不及格")
end
-- 比较:== 等于  ~= 不等于  > < >= <=
-- 逻辑:and 与  or 或  not 非
循环 while / for / repeat
-- while 循环(满足条件就一直执行)
local i = 1
while i <= 5 do
    log("第 " .. i .. " 次")
    i = i + 1
end

-- 数字 for:for 变量=起点,终点,步长
for j = 1, 5 do            -- 步长省略默认为 1
    log(j)
end
for j = 10, 1, -1 do       -- 倒序
    log(j)
end

-- 遍历表:pairs 遍历所有键值,ipairs 只遍历数字下标
local arr = { "a", "b", "c" }
for idx, v in ipairs(arr) do
    log(idx, v)
end

-- repeat ... until:先执行再判断
local k = 1
repeat
    k = k + 1
until k >= 3
函数 function
-- 定义函数
function add(a, b)
    return a + b
end
local r = add(3, 5)
log(r)        -- 8

-- 局部函数(推荐,前面加 local)
local function greet(who)
    toast("你好 " .. who)
end
greet("小白")
表 table(最常用的数据结构)
-- 数组(数字下标,从 1 开始)
local list = { "签到", "领奖" }
table.insert(list, "打怪")    -- 末尾添加
log(list[1])                 -- 签到

-- 键值表(类似字典)
local user = { name = "小白", vip = true }
log(user.name)
user.age = 18                -- 新增字段
常用内置转换
tostring(x)转成字符串。
tonumber(x)转成数字,无法转换返回 nil。
type(x)返回类型名字符串,如 "number"、"string"、"table"。
string.format(fmt,...)格式化字符串,如 string.format("%d-%.2f", 5, 3.14)。
pcall(f,...)保护调用,返回 是否成功, 结果/错误信息,避免脚本直接崩溃。

常用代码片段

复制即用的常见模板
以下片段可直接粘贴到 main.lua,按需要修改坐标和参数。
点击测试
log("===== 点击测试开始 =====")
tap(444, 412)
sleep(2000)
tap(551, 412)
log("===== 测试完毕 =====")
if 条件判断
local count = 10
if count > 0 then
    toast("还有 " .. count .. " 次")
else
    toast("次数用完")
end
while 循环(自己写的循环同样生效)
local i = 1
while i <= 20 do
    log("循环第 " .. i .. " 次")
    tap(500, 800)
    sleep(1000)
    i = i + 1
end
for 固定次数循环
for i = 1, 10 do
    log("第 " .. i .. " 次执行")
    tap(500, 500)
    sleep(800)
end
自定义函数
local function clickAt(x, y, wait)
    tap(x, y)
    sleep(wait or 500)
end

clickAt(444, 412, 2000)
clickAt(551, 412, 1000)
找到图片再点击(找不到就等待)
if waitImage("image/start.png", 10000, 0.9) then
    local p = findImage("image/start.png")
    if p.x ~= -1 then
        tap(p.x, p.y)
        toast("已点击开始")
    end
else
    toast("没有找到开始按钮")
    exitScript("等待图片超时")
end
卡密登录(标准三行)
local r = showUI(require("ui"), "登录")
if r == nil then return end
if not kamiVerify("你的APPID", r.kami) then return end
-- 验证通过后写正式任务
说明
本文档随度大师IDE v1.1.1 整理,函数以真机 / 打包 APK 内的 Lua 引擎为准。电脑「运行」为逻辑模拟,真机表现请以「真机测试」为准。

没有找到匹配的函数,换个关键词试试