脚本存放路径:/var/touchelf/scripts/
触摸精灵使用Lua语言作为底层脚本语言, 支持Lua 5.2版本的所有语法与基本库函数, 并在Lua语言的基础上添加了一些扩展函数, 用于发送触摸事件、找图、找色等高级功能的实现
触摸精灵的脚本中需要有且只有一个main函数,整个脚本是从这个函数开始执行的,示例
-- 脚本入口函数 -- 整个脚本从这个函数开始执行 -- 此函数在整个脚本中必须有且只有一个 function main() -- 其他代码 end
用户可参考Lua的官方手册或者其他资料来学习以下基本语法:
用户可以通过在脚本中定义一个全局变量UI来实现定义脚本的配置界面, 该界面会在脚本运行前显示给用户, 用于让用户设置一些脚本的参数, 这些参数的值会赋值给指定的变量, 脚本运行时可以通过访问这些变量来获取用户的配置。下面是一个完整的例子:
UI = { { 'TextView{-请如实填写哦-}' }, { 'InputBox{}', 'name', '姓名:' }, { 'DropList{帅哥|美女}', 'sex', '性别:' }, { 'InputBox{18}', 'age', '年龄:' }, { 'DropList{是|否}', 'married', '婚否:' }, }; function main() notifyMessage(string.format("姓名:%s\n性别:%s\n年龄:%s\n婚否:%s", name, sex, age, married)); end 上述脚本播放前会显示一个如下界面:全局变量UI是一个Table类型的变量, 其中包含若干个子Table, 每一个子Table都是一个界面上的控件, 控件按照顺序自上而下排列, 目前支持3中类型的控件: 1. TextView (静态文本) 1.1 控件说明 该类型的控件只用来显示一行文字, 不需要用户操作 1.2 控件定义 { 'TextView{显示的内容}' } 这个Table只有一个字符串成员, 即'TextView{显示的内容}', 其中的TextView是指定此控件的类型为静态文本, {}中的内容即为该静态文本显示的内容 2. InputBox (输入框) 2.1 控件说明 该类型的控件可以用于让用户输入一些内容, 并可以指定一个变量名, 脚本开始后通过该变量就可以访问到用户输入的内容 2.2 控件定义 { 'InputBox{默认值}', 'var', '注释' } 这个Table中有3个字符串成员: * 'InputBox{默认值}', 其中的InputBox是指定此控件的类型为输入框, {}中的内容是该输入框中的默认值 * 'var', 定义一个变量的名字, 脚本开始后可以通过访问这个变量来获取用户输入的内容 * '注释', 显示在输入框上方, 用于说明该输入框的用途 2.3 使用提示 需要注意的是获取到的变量的值是默认是字符串类型, 你可以使用tonumber()函数来转换成数字类型来使用。例如 var = tonumber(var); 3. DropList (下拉列表) 3.1 控件说明 该类型的控件可以用于让用户在指定的若干个值中选择其中一个, 并可以指定一个变量名, 脚本开始后通过该变量就可以访问到用户选择的内容 3.2 控件定义 { 'DropList{选项1|选项2|选项3|...}', 'var', '注释' } 这个Table中有3个字符串成员: * 'DropList{选项1|选项2|选项3|...}', 其中的DropList是指定此控件的类型为下拉列表, {}中的内容是指定的若干个选项, 每个选项间用|分隔 * 'var', 定义一个变量的名字, 脚本开始后可以通过访问这个变量来获取用户选择的内容 * '注释', 显示在下拉列表上方, 用于说明该下拉列表的用途
*** 说明 ***
全局代码块(不包含在任何函数内的代码块)会在脚本的main()函数之前被调用, 所以可以在全局代码块中对UI变量进行动态的设置, UI变量是一个Table类型的变量, 可以使用Lua的Table库函数操作, 下面是一个操作UI变量的例子:
file = io.open("/var/touchelf/conf.txt"); -- 打开配置文件 data = file:read("*a"); -- 读取全部内容 file:close(); -- 关闭文件 UI = { { 'InputBox{'.. data .. '}', 'demo', '演示:' }, } function main() notifyMessage(string.format("%s", demo)); end
函数说明: 输出调试信息到系统日志, 可以在“触摸精灵->设置->查看日志”中查看
logDebug("hello"); -- 输出"hello"到系统日志
函数说明: 进行毫秒级别延迟
mSleep(1000); -- 延迟1秒
函数说明: 以文字提示框的方式通知用户
notifyMessage("hello"); -- 在屏幕上显示"hello" notifyMessage("hello", 5000); -- 在屏幕上显示"hello", 显示5秒
函数说明: 以震动方式通知用户
notifyVibrate(1000); -- 让设备震动1秒
函数说明: 以播放音频的方式通知用户
notifyVoice("/var/touchelf/a.mp3"); -- 播放路径为"/var/touchelf/a.mp3"的音频
函数说明: 发送手指按下事件
touchDown(0, 100, 100); -- ID为0的手指在坐标为(100, 100)的点按下 touchUp(0); -- ID为0的手指抬起
函数说明: 发送手指移动事件
touchDown(0, 100, 100); -- ID为0的手指在坐标为(100, 100)的点按下 touchMove(0, 200, 100); -- ID为0的手指滑动到坐标为(200, 100)的点 touchUp(0); -- ID为0的手指抬起
函数说明: 发送手指抬起事件
touchDown(0, 100, 100); -- ID为0的手指在坐标为(100, 100)的点按下 touchUp(0); -- ID为0的手指抬起
函数说明: 发送物理按键按下事件
keyDown('HOME'); -- HOME键按下 keyUp('HOME'); -- HOME键抬起
函数说明: 发送物理按键抬起事件
keyDown('HOME'); -- HOME键按下 keyUp('HOME'); -- HOME键抬起
函数说明: 获取指定像素的颜色
c = getColor(100, 100); -- 将坐标为(100,100)的点的颜色保存在变量c中 if c == 0x0000ff then -- 如果该点颜色为0x0000ff(纯蓝色) touchDown(0, 100, 100); -- 那么点击该坐标 touchUp(0); end
函数说明: 获取指定像素颜色的R、G、B三个值
r, g, b = getColorRGB(100, 100); -- 将坐标为(100,100)的点的颜色的R、G、B分别保存在变量r、g、b中 if r == 0x00 and b == 0x00 and g == 0xff then -- 如果该点颜色为0x0000ff(纯蓝色) touchDown(0, 100, 100); -- 那么点击该坐标 touchUp(0); end
函数说明: 全屏找色
x, y = findColor(0x0000ff); -- 在全屏范围找到第一个颜色为0x0000ff的点, 将其坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end
函数说明: 全屏模糊找色
x, y = findColorFuzzy(0x0000ff, 90); -- 在全屏范围找到第一个颜色为0x0000ff的点, 精确度为90%, 将其坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end
函数说明: 区域找色
x, y = findColorInRegion(0x0000ff, 100, 100, 200, 200); -- 在区域[(100,100)(200,200)]范围找到第一个颜色为0x0000ff的点, 将其坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end
函数说明: 区域模糊找色
x, y = findColorInRegionFuzzy(0x0000ff, 90, 100, 100, 200, 200); -- 在区域[(100,100)(200,200)]范围找到第一个颜色为0x0000ff的点, 精确度为90%, 将其坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end
函数说明: 全屏找图
x, y = findImage("/var/touchelf/a.bmp"); -- 在全屏范围找到第一个路径为"/var/touchelf/a.bmp"的图片, 将其左上角坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end x, y = findImage("/var/touchelf/a.bmp", 0x000000); -- 在全屏范围找到第一个路径为"/var/sdcar/a.bmp"的图片, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end
函数说明: 全屏模糊找图
x, y = findImageFuzzy("/var/touchelf/a.bmp", 90); -- 在全屏范围找到第一个路径为"/var/sdcar/a.bmp"的图片, 精确度为90, 将其左上角坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end x, y = findImageFuzzy("/var/touchelf/a.bmp", 90, 0x000000); -- 在全屏范围找到第一个路径为"/var/sdcar/a.bmp"的图片, 精确度为90, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end
函数说明: 区域找图
x, y = findImageInRegion("/var/touchelf/a.bmp", 100, 100, 200, 200); -- 在区域[(100,100)(200,200)]范围找到第一个路径为"/var/sdcar/a.bmp"的图片, 将其左上角坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end x, y = findImageInRegion("/var/touchelf/a.bmp", 100, 100, 200, 200, 0x000000); -- 在区域[(100,100)(200,200)]范围找到第一个路径为"/var/sdcar/a.bmp"的图片, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end
函数说明: 区域模糊找图
x, y = findImageInRegionFuzzy("/var/touchelf/a.bmp", 90, 100, 100, 200, 200); -- 在区域[(100,100)(200,200)]范围找到第一个路径为"/var/sdcar/a.bmp"的图片, 精确度为90, 将其左上角坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end x, y = findImageInRegionFuzzy("/var/touchelf/a.bmp", 90, 100, 100, 200, 200, 0x000000); -- 在区域[(100,100)(200,200)]范围找到第一个路径为"/var/sdcar/a.bmp"的图片, 精确度为90, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量x和y中 if x ~= -1 and y ~= -1 then -- 如果找到了 touchDown(0, x, y); -- 点击那个点 touchUp(0); end
函数说明: 全屏截图
snapshotScreen("/mnt/sdcard/a.bmp"); -- 将全屏截图保存到路径为"/mnt/sdcard/a.bmp"的图片中, 格式为BMP snapshotScreen("/mnt/sdcard/a.jpg, 50"); -- 将全屏截图保存到路径为"/mnt/sdcard/a.jpg"的图片中, 格式为JPG, 并且尺寸缩小为原始尺寸的50%
函数说明: 区域截图
snapshotRegion("/mnt/sdcard/a.bmp", 100, 100, 200, 200); -- 将区域[(100,100)(200,200)]的截图保存到路径为/mnt/sdcard/a.bmp的图片中, 格式为BMP snapshotRegion("/mnt/sdcard/a.jpg", 100, 100, 200, 200, 50); -- 将区域[(100,100)(200,200)]的截图保存到路径为/mnt/sdcard/a.jpg的图片中, 格式为JPG, 并且尺寸缩小为原始尺寸的50%
函数说明: 进行本地图片识别
code = localOcrText("/mnt/sdcard/Touchelper/tessdata", -- 语言包tessdata目录在设备中的路径 "eng", -- 语言类型为中文 100, -- 图片左上角X坐标为100 100, -- 图片左上角Y坐标为100 200, -- 图片右下角X坐标为200 200); -- 图片右下角Y坐标为200 if code == "" then notifyMessage("识别失败"); else notifyMessage(string.format("识别成功: %s", code)); end code = localOcrText("/mnt/sdcard/Touchelper/tessdata", -- 语言包tessdata目录在设备中的路径 "eng", -- 语言类型为中文 100, -- 图片左上角X坐标为100 100, -- 图片左上角Y坐标为100 200, -- 图片右下角X坐标为200 200, -- 图片右下角Y坐标为200 "0123456789"); -- 设置白名单字符串, 只识别数字 if code == "" then notifyMessage("识别失败"); else notifyMessage(string.format("识别成功: %s", code)); end
函数说明: 选择远程代答平台
cloudOcrInit(1); -- 设置远程代答平台为打码兔
函数说明: 连接cloudOcrInit()选择的答题平台进行图片识别
cloudOcrInit(0); -- 选择代答平台为好爱答题 code = cloudOcrText("username|PASSWORDAD9EFBD3F233265DF9400E6A", -- 好爱答题参数1为密码串(http://www.haoi23.net注册并登陆后, 在会员中心获取) "1004", -- 题目类型为"1004"(4位数字字母) 100, -- 图片左上角X坐标为100 100, -- 图片左上角Y坐标为100 200, -- 图片右下角X坐标为200 200, -- 图片右下角Y坐标为200 600); -- 超时时间为600秒 if code == "" then notifyMessage("识别失败"); else notifyMessage(string.format("识别成功: %s", code)); end
函数说明: 将参数中指定的任意个数的图片合并成一个图片后, 连接cloudOcrInit()选择的远程答题平台进行图片识别
snapshotScreen("/var/touchelf/1.bmp"); -- 将屏幕截图为/var/touchelf/1.bmp图片 snapshotScreen("/var/touchelf/2.bmp"); -- 将屏幕截图为/var/touchelf/2.bmp图片 ------------------------------------------- -- 下面的代码将1.bmp和2.bmp合并成一个图片后 -- 发送到打码兔远程代答平台进行图片识别 ------------------------------------------- cloudOcrInit(1); -- 选择代答平台为打码兔答题 code = cloudOcrText("username|password", -- 打码兔答题参数1为"用户名|密码" "1004", -- 题目类型为"1004"(4位数字字母) 600, -- 超时时间为600秒 "/var/touchelf/1.bmp", -- 待合并的第一个图片 "/var/touchelf/2.bmp", -- 待合并的第二个图片 "/var/touchelf/3.bmp"); -- 待合并的第三个图片 if code == "" then notifyMessage("识别失败"); else notifyMessage(string.format("识别成功: %s", code)); end
函数说明: 开启/关闭屏幕保持。当开启屏幕保持时, 后续的找图、找色等函数不会重新获取屏幕图像, 而是使用开启屏幕保持之前的屏幕图像;当关闭屏幕保持时, 后续的找图、找色等函数会每次都重新获取屏幕图像。适当使用此函数可以优化脚本运行效率
keepScreen(true); -- 开启屏幕保持 if getColor(100, 100) == 0x000000 or getColor(200, 200) == 0x000000 then -- 进行2次取色, 由于启用了屏幕保持, 这2次取色不会重新获取2次屏幕图像, 这样可以提高性能 notifyMessage("yes"); -- 如果(100,100)和(200,200)坐标有一个颜色为黑色, 输出"yes" else -- 否则 notifyMessage("no"); -- 输出"no" end keepScreen(false); -- 关闭屏幕保持
函数说明: 旋转屏幕的坐标体系, 后续的找图、找色、截图、触摸动作都会使用新的坐标体系。
rotateScreen(90); -- 旋转坐标体系向右90度, 大多数横屏游戏使用此坐标体系. touchDown(0, 100, 100); -- 发送触摸动作, 此时点击的点使用新的坐标体系. touchUp(0);
函数说明: 复制文字到系统剪贴板, 以便后续粘贴
copyText("你好") -- 复制字符串“你好”到系统剪贴板
函数说明: 获取系统剪贴板中之前复制或剪贴的文字内容
text = clipText() -- 将之前复制或剪贴的文字读取到变量text中
函数说明: 输入字符串
inputText("你好Hello"); -- 在当前选中的文字输入框中输入字符串"你好Hello" inputText("\b\b\b\b\b"); -- 退格删除5个字符
函数说明: 打开指定软件
appRun("com.apple.mobilesafari"); -- 打开系统自带浏览器
函数说明: 关闭指定软件
appKill("com.apple.mobilesafari"); -- 关闭系统自带浏览器
函数说明: 判断指定应用是否正在运行
if appRunning("com.apple.mobilesafari") then notifyMessage("yes"); else notifyMessage("no"); end
函数说明: HTTP协议访问
data = httpGet('www.google.com'); -- 获取www.google.com的内容 notifyMessage(data); -- 显示www.google.com的内容
函数说明: ftp下载
success = ftpGet("ftp://192.168.1.100:/a.txt", "/var/touchelf/a.txt", "user", "pass") -- 将FTP服务器192.168.1.100上路径为/a.txt的文件下载到/var/touchelf/a.txt if success then notifyMessage("成功") else notifyMessage("失败") end
函数说明: ftp上传
success = ftpPut("ftp://192.168.1.100:/a.txt", "/var/touchelf/a.txt", "user", "pass") -- 将本地文件/var/touchelf/a.txt上传为FTP服务器192.168.1.100上路径为/a.txt的文件 if success then notifyMessage("成功") else notifyMessage("失败") end
函数说明: 读取指定应用的内存
success, data = memoryRead("com.test.test", 0x1000000, "U32"); -- 读取包名为com.test.test的应用中, 内存地址为0x1000000处的无符号的32位整数 if success then notifyMessage(string.format("%s", tostring(data))); else notifyMessage("fail"); end
函数说明: 写入指定应用的内存
success = memoryWrite("com.test.test", 0x1000000, "U32", 0x12345678); -- 将无符号32位整数0x12345678写入到包名为com.test.test的应用内存地址为0x1000000处 if success then notifyMessage("写入成功") end
函数说明: 搜索指定应用的内存,支持联合搜素,支持在上一次的搜索结果上再次搜索过滤
array = memorySearch("com.test.test", true, { 0x100, 4, 0x200 }) -- 搜索过程为先搜素0x100,如果该内存地址+4的位置为0x200,则为一个有效地址 logDebug("找到"..#array.."个地址") for i=1,#array do logDebug(string.format("第%d个地址为: 0x%x", i, array[i])) end
函数说明: 获取当前屏幕分辨率
w, h = getScreenResolution(); -- 将屏幕宽度和高度分别保存在变量w、h中 notifyMessage(string.format("%d,%d\n", w, h)); -- 将宽度和高度用提示框显示到屏幕上
函数说明: 获取当前屏幕色彩位数
c = getScreenColorBits(); -- 将屏幕色彩位数保存在变量c中 notifyMessage(string.format("%d\n", c)); -- 将色彩位数用提示框显示到屏幕上
函数说明: 获取设备串号
deviceID = getDeviceID(); -- 将设备ID保存到deviceID变量中
函数说明: 获取网络时间
time = getNetTime(); if time ~= -1 then tt = os.date("*t", time); if tt.year > 2014 and tt.month > 2 and tt.day > 15 and tt.hour > 12 and tt.min > 30 then notifyMessage("当前时间超过了2013年2月15日12点30分"); end else notifyMessage("请连接网络"); end
函数说明: 获取当前触摸精灵版本号
version = getVersion(); -- 将触摸精灵版本号保存在变量version中 notifyMessage(version); -- 显示版本号
函数说明: 为指定程序伪装GPS地理位置
调用该函数伪装地理位置以后,脚本停止以后伪装不会取消,直到使用该函数取消指定 应用的伪装,或执行『触摸精灵-设置-清除GPS伪装』清除设备所有伪装
fakeGPS("com.tencent.xin", 40.0234512958, 116.2185668045); -- 将微信的GPS地理位置伪装为指定纬度和经度 fakeGPS("com.tencent.xin", 0, 0); -- 取消对微信的GPS地理位置伪装