我可以用点域来lotus域在编辑状态显示脚本吗

触摸精灵开发手册触摸精灵 安卓 苹果 android ios目录
前言  感谢您选择触摸精灵这款软件。触摸精灵是一款可以帮您自动化操作手机或平板设备的软件,它可以帮助您执行任何指定的动作,无论是在游戏中还是在日常工作中,都可以告别之前繁琐的手动操作,尽情享受自动化带来的乐趣!
  触摸精灵简单、易用,通过录制功能不需要任何编程基础就可以录制出功能强大的脚本,还可通过编程制作出功能更为复杂,使用更为灵活的脚本。从这一刻起让触摸精灵帮您放飞双手,享受生活!  触摸精灵脚本使用 Lua 语言进行编写,支持 Lua 5.2.3 版本的所有语法与基本函数,配合触摸精灵特有的函数,实现找图、找色、触摸等高级功能。
  编写脚本前请先学习 lua 的基本语法。
  Lua官方手册:
  Lua中文开发手册:
  编写触摸精灵脚本需注意文本编码须使用 UTF-8 格式,否则中文将会显示乱码。
  安装触摸精灵ios 苹果 版本安装通过Cydia源安装
1.确保您的设备已经越狱,点击桌面Cydia软件
2.点击Cydia软件界面的"软件源"按钮
3.点击软件源界面右上角的"编辑"按钮
4.点击编辑后,左上角的"取消"按钮会变成"添加"
5.点 "添加"按钮,在弹出窗口输入触摸精灵官方源地址:cydia.touchelf.com
6.等待源添加完成
7.添加完成后回到Cydia的"软件源"界面,找到刚添加好的触摸精灵官方源,点击进入
8.在"分类"列表中点击"全部软件包"
9.选择"触摸精灵",点击进入"详情"界面
10.进入"详情"界面后点击右上角"安装"并在确认界面点击"确认",等待软件安装完毕。
11.安装完成后点击屏幕下方的 "重启SpringBoard" 按钮,等待设备重启完毕后,就可以在桌面见到触摸精灵软件图标了。
deb文件安装首先确保您的IOS已经越狱
1.下载并安装第三方管理工具(pp助手,iFunbox等),下载好触摸精灵deb文件。这里以pp助手为例
2.将手机通过数据链连接电脑
3.打开文件 - Cydia安装目录
4.将下载好的deb文件拖入/导入该目录
5.重启手机两次即可自动安装。
android 安卓 版本安装首先确保您的安卓设备已经ROOT
1.下载并安装第三方管理工具(360手机助手,iTools等),这里以360手机助手为例
2.下载触摸精灵安卓软件,下载地址:
3.将手机通过数据链连接电脑,开打360手机助手,确认手机和电脑已连接。
4.打开文件 - SD卡目录,为了方便安装,我们将APK文件直接放入SD卡根目录(将文件直接拖入右边即可)
5.手机打开文件管理类软件,这里以RE管理器为例
6.点击sdcard目录,找到刚才拷贝到sdcard目录内的apk文件,点击apk文件,点击"安装"
7.等待程序安装完成即可。
注意:不要在电脑上直接点击apk文件进行安装。
相关工具触摸精灵PC端脚本编辑器】
下载地址:
1.软件同时支持安卓版和苹果版触摸精灵。
2.支持项目管理,与最新版本触摸精灵的脚本目录结构保持一致
3.支持局域网设备扫描,提供设备的远程管理,包括远程文件管理、查看远程日志、远程截图、远程重启等操作
4.支持项目、文件的远程发送、远程运行、远程调试
5.集成最新版本触摸抓抓,提供强大图片处理功能
基本功能使用ios 苹果版脚本存放路径:/var/touchelf/scripts/1.录制
1.点击底部导航栏切换到“列表”界面
2.单击左上角的“新建”按钮, 在弹出的菜单中选择“录制”
3.在弹出的对话框中填写脚本名称, 然后点击“确定”按钮
4.切换到手机的任意界面, 按下音量键开始录制
5.做一些你想要录制的触摸动作
6.再次按下音量键停止录制
1.点击底部导航栏切换到“列表”界面
2.单击想要播放的脚本
3.在弹出的对话框中设置播放参数, 然后选择“手动播放”或者“定时播放”
4.切换到手机的任意界面。如果选择的“手动播放”, 那么需要手动按下音量键开始播放; 如果选择的“定时播放”, 脚本会在设定的时间自动播放
5.脚本在播放完毕后会自动停止, 或在播放过程中再次按下音量键停止播放
3.关闭后台服务
1.当选择播放某个脚本之后,每次按下音量键都会提示是否播放该脚本,如果想完全关闭该脚本的播放后台服务,那么在音量键弹出的对话框中选择『取消』即可
2.如果按下音量键后没有提示对话框而是直接开始播放,这是由于关闭了『播放提示』选项,请在触摸精灵的设置中开启
1.点击底部导航栏切换到“列表”界面
2.单击想要编辑的脚本右侧的蓝色箭头”
3.在弹出的界面中直接编辑脚本文件
4.点击“保存”按钮保存脚本文件
1.登录, 按照里面的购买流程注册
2.点击“触摸精灵”的“设置”中的“序列号激活”, 输入淘宝获取到的序列号, 点击“激活”按钮
3.软件将自动下载注册文件到/var/touchelf/key, 重新进入“注册状态”, 显示已注册和“有效期”则成功
android 安卓版脚本存放路径:/mnt/sdcard/touchelf/scripts/1.录制
1.点击底部导航栏切换到“脚本列表”界面
2.点击标题栏左侧的“+”(新建)按钮
3.在弹出的菜单中选择“录制脚本”
4.在弹出的对话框中输入想要录制的脚本的名称, 然后点击“确定”按钮
5.阅读弹出的对话框中的说明, 然后点击“确定”按钮
6.切换到手机的任意界面, 按下热键开始录制(在使用控制条时按下控制条“录制”按钮开始录制)
7.再次按下热键停止录制(在使用控制条时按下控制条“停止”按钮停止录制)
1.点击底部导航栏切换到“脚本列表”界面
2.单击想要播放的脚本, 或者长按想要播放的脚本, 在弹出的菜单中选择“播放”
3.在弹出的对话框中设置播放参数, 然后选择“手动播放”或者“定时播放”
4.切换到手机的任意界面。如果选择的“手动播放”, 那么需要手动按下热键开始播放(在使用控制条时按下控制条“播放”按钮开始播放); 如果选择的“定时播放”, 脚本会在设定的时间自动播放
5.脚本在播放完毕后会自动停止, 或在播放过程中再次按下热键停止播放(在使用控制条时按下控制条“停止”按钮停止播放, 按下“暂停”按钮暂停播放, 按下“退出”按钮退出此次播放)
1.点击底部导航栏切换到“脚本列表”界面
2.长按脚本, 在弹出的菜单中选择“编辑”
3.在弹出的界面中直接编辑脚本文件
4.点击“保存”按钮保存脚本文件, 点击“退出”按钮退出编辑界面
1.点击底部导航栏切换到“脚本列表”界面
2.点击标题栏左侧的“+”(新建)按钮
3.在弹出的菜单中选择“导入脚本”
4.在文件浏览器中选中要导入的脚本, 然后点击“导入”按钮
1.点击底部导航栏切换到“脚本列表”界面
2.长按脚本, 在弹出的菜单中选择“导出”
3.在文件浏览器中选择要导出的目录
4.点击“导出脚本”按钮, 脚本将导出到选择的目录中
1.登录, 按照里面的购买流程注册
2.点击“触摸精灵”的“设置”中的“序列号激活”, 输入淘宝获取到的序列号, 点击“确定”按钮
3.软件将自动下载注册文件到设备中, 重新进入“注册状态”, 显示已注册和“有效期”则成功
基本语法用户可参考Lua的官方手册或者其他资料来学习以下基本语法:
变量与类型
Lua官方手册:
Lua中文开发手册:脚本UI界面  用户可以通过在脚本中定义一个全局变量UI来实现定义脚本的配置界面, 该界面会在脚本运行前显示给用户, 用于让用户设置一些脚本的参数, 这些参数的值会赋值给指定的变量, 脚本运行时可以通过访问这些变量来获取用户的配置。下面是一个完整的例子:UI = {
{ 'TextView{-请如实填写哦-}'
{ 'InputBox{}',
'姓名:' },
{ 'DropList{帅哥|美女}',
'性别:' },
{ 'InputBox{18}',
'年龄:' },
{ '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是指定此控件的类型为输入框, {}中的内容是该输入框中的默认值
定义一个变量的名字, 脚本开始后可以通过访问这个变量来获取用户输入的内容
'注释', 显示在输入框上方, 用于说明该输入框的用途
'InputBox{默认值}', 其中的InputBox是指定此控件的类型为输入框, {}中的内容是该输入框中的默认值
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("/mnt/sdcard/conf.txt"); -- 打开配置文件data = file:read("*a");
-- 读取全部内容file:close();
-- 关闭文件UI = {
{ 'InputBox{'.. data .. '}', 'demo', '演示:' },}function main()
notifyMessage(string.format("%s", demo));end扩展函数函数:logDebug() 系统日志函数说明 : 输出调试信息到系统日志
函数方法 : logDebug(文本型 contents);
返回值 : 无
输出到日志文件的内容
示例:logDebug("hello"); -- 输出"hello"到系统日志注意事项:
1.日志文件所在目录目录:
 1.1 安卓 android:/mnt/sdcard/touchelf/log/log.txt
 1.2 苹果 ios:/var/touchelf/log/log.txt
2.可以在“触摸精灵-&设置-&查看日志”中查看
函数:mSleep() 延时函数说明 : 进行毫秒级别延迟
函数方法 : mSleep(整数型 interval);
返回值 : 无
脚本暂停执行的时间,单位为毫秒
示例:mSleep(1000); -- 延迟1秒mSleep(60*1000); -- 延迟1分钟mSleep(60*60*1000); -- 延迟1小时mSleep(24*60*60*1000); -- 延迟1天mSleep(365*24*60*60*1000); -- 延迟1年用在点击函数中可实现长按不放的效果touchDown(0,100,200);
--按下坐标为100,200的点mSleep(2000);
--延时 2 秒touchUp(0);
--抬起注意事项:
毫秒与秒换算方式为 1 秒 (s) = 1000 毫秒 (ms)
函数:notifyMessage() 提示,通知函数说明 : 以文字提示框的方式通知用户
函数方法 : notifyMessage(文本型 text, 整数型 interval);
返回值 : 无
在屏幕上显示的提示文字
提示多长时间,单位:毫秒,默认值1000
示例:notifyMessage("Hello World"); -- -- 在屏幕上显示"hello"显示1秒notifyMessage("Hello World",3000); -- -- 在屏幕上显示"hello"显示3秒notifyMessage("Hello World \n"..os.date("%M/%D/%Y-%H:%M:%S"),5000); -- -- 在屏幕上显示"hello"显示5秒,并换行显示当前时间注意事项:
1,当提示框显示时会影响当前屏幕取色,请合理使用该函数
2,示例里面使用的 "\n" 为换行,".."为字符串连接符号,"os.date()" 为时间函数,时间函数内的"%M/%D/%Y-%H:%M:%S"为时间显示的格式。
函数:notifyVibrate() 震动函数说明 :
以震动方式通知用户
函数方法 : notifyVibrate(整数型 interval);
返回值 : 无
震动时间,单位:毫秒
示例:notifyVibrate(1000); -- 让设备震动1秒注意事项:
使用此函数需在移动设备设置里打开震动选项。
函数:notifyVoice() 播放音频函数说明 :
以播放音频的方式通知用户
函数方法 : notifyVoice(文本型 file);
返回值 : 无
音频文件路径及名字
示例:notifyVoice("/mnt/sdcard/a.mp3"); -- 播放路径为"/mnt/sdcard/a.mp3"的音频mSleep(5000);注意事项:
使用此函数需在后面加上延时函数,延时5000即播放音频5秒钟。
函数:touchDown() 按下函数说明 :
发送手指按下事件
函数方法 : touchDown(整数型 ID,整数型 x,整数型 y);
返回值 : 无
手指ID, 范围0~128, 用于标识一个手指
示例:touchDown(0, 100, 100); -- ID为0的手指在坐标为(100, 100)的点按下mSleep(100);
--延时100毫秒touchUp(0);
-- ID为0的手指抬起示例:封装一个点击函数function click(x, y)
touchDown(0, x, y);
mSleep(200);
touchUp(0);end--------------调用方法------------click(100,100);--点击坐标为100,100的点示例:封装一个可控制按下时间的点击函数function click(x,y,n)
touchDown(0, x, y);
mSleep(n);
touchUp(0);end--------------调用方法------------click(100,100,1000);--按下坐标为100,100的点延时1秒后抬起注意事项:
使用 touchDown、touchUp 函数时,中间要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。
函数:touchMove() 移动函数说明 : 发送手指移动事件
函数方法 : touchMove(整数型 ID,整数型 x,整数型 y);
返回值 : 无
touchDown()时传入的手指ID
示例:touchDown(0, 100, 100); -- ID为0的手指在坐标为(100, 100)的点按下mSleep(100);
--延时100毫秒touchMove(0, 200, 100); -- ID为0的手指滑动到坐标为(200, 100)的点mSleep(100);
--延时100毫秒touchUp(0);
-- ID为0的手指抬起示例: 连续移动到指定位置function clickMove(x1,y1,x2,y2,n)
local w = math.abs(x2-x1);
local h = math.abs(y2-y1);
touchDown(0,x1,y1);
mSleep(50);
if x1 & x2 then
if y1 & y2 then
if w &= h then
for i = 1 , w,n do
x1 = x1 + w1;
if y1 == y2 then
y1 = y1 + math.ceil(h*h1/w);
touchMove(0,x1,y1);
mSleep(10);
for i = 1 ,h,n do
y1 = y1 + h1;
if x1 ==x2 then
x1 = x1 + math.ceil(w*w1/h);
touchMove(0,x1,y1);
mSleep(10);
mSleep(50);
touchUp(0);end--------------调用方法----------------clickMove(100,100,200,200,5);--x1,y1为起始位置坐标,x2、y2为终点位置坐标,n是每次移动多少个像素函数:touchUp() 抬起函数说明 :
发送手指抬起事件
函数方法 : touchUp(整数型 ID);
返回值 : 无
touchDown()时传入的手指ID
示例:touchDown(0, 100, 100); -- ID为0的手指在坐标为(100, 100)的点按下mSleep(100);
--延时100毫秒touchUp(0);
-- ID为0的手指抬起函数:keyDown() 按下物理按键函数说明 :
发送物理按键按下事件
函数方法 : keyDown(文本型 string);
返回值 : 无
物理键名称
示例:单击一次HOME按键keyDown('HOME');
-- HOME键按下mSleep(100);
--延时100毫秒keyUp('HOME');
-- HOME键抬起注意事项:
1,Android触摸精灵现在支持的有'HOME'、'BACK'、'MENU',
2,IOS触摸精灵现在支持的有'HOME'
3,其他按键可参照【附录】触摸精灵模拟物理按键的方法
函数:keyUp() 抬起物理按键函数说明 :
发送物理按键抬起事件
函数方法 : keyUp(文本型 string);
返回值 : 无
物理键名称
示例:单击一次HOME按键keyDown('HOME');
-- HOME键按下mSleep(100);
--延时100毫秒keyUp('HOME');
-- HOME键抬起注意事项:
1,Android触摸精灵现在支持的有'HOME'、'BACK'、'MENU',
2,IOS触摸精灵现在支持的有'HOME'
3,其他按键可参照【附录】触摸精灵模拟物理按键的方法
函数:getColor() 获取指定像素的颜色函数说明 :
获取指定像素的颜色
函数方法 : getColor(整数型x, 整数型y);
返回值 : 整型 color
将获取颜色值的X坐标
将获取颜色值的y坐标
x,y坐标点的十进制颜色值
示例:c = getColor(100, 100);
-- 将坐标为(100,100)的点的颜色保存在变量c中if c == 0x0000ff then
-- 如果该点颜色为0x0000ff(纯蓝色)
touchDown(0, 100, 100);
-- 那么点击该坐标
touchUp(0);end---------------也可以写成-------------if getColor(100, 100) == 0x0000ff then
-- 如果该点颜色为0x0000ff(纯蓝色)
touchDown(0, 100, 100);
-- 那么点击该坐标
touchUp(0);end注意事项:
1,getColor()返回的是十进制颜色值,如纯白色获取到的数值是。十进制数值和十六进制颜色对比时,十六进制前面需加"0x"即"0xFFFFFF"。
2,在十六进制颜色值"0xAABBCC"中,"AA"对应的是红(R,Red),"BB"对应的是绿(G,Green),"CC"对应的是蓝(B,Blue)。
语法说明:
c = getColor(100, 100); 中"="的作用是赋值,将getColor(100, 100)获得的值赋值给c这个变量。
if getColor(100, 100) == 0x0000ff then 中的"=="是关系运算符中等于的意思。
翻译成中文就是:如果 100,100这个坐标的颜色等于 0x0000ff 那么执行下面的语句。不等于的写法是"~="
函数:getColorRGB() 获取指定像素颜色的R、G、B三个值函数说明 :
获取指定像素颜色的R、G、B三个值
函数方法 : getColorRGB(整数型x, 整数型y);
返回值 : 整型 R,G,B
将获取颜色值的X坐标
将获取颜色值的y坐标
x,y坐标点的颜色R(红色)值
x,y坐标点的颜色G(绿色)值
x,y坐标点的颜色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示例:封装一个单点模糊比对函数function compare_color_point(x,y,r,g,b,sim)
local lr,lg,lb;
lr,lg,lb = getColorRGB(x,y);
if math.abs(lr-r) & sim then
return false;
if math.abs(lg-g) & sim then
return false;
if math.abs(lb-b) & sim then
return false;
return true;end-----调用方法if compare_color_point(100,100,255,255,255,30) then
touchDown(0, 100, 100);
mSleep(50)
touchUp(0);end--sim值越小精确度越高,范围是 0-255函数:findColor() 全屏找色函数说明 : 全屏寻找符合指定颜色的坐标,不支持模糊查找。
函数方法 : findColor(整型 color);
返回值 : 整数型 x, y
将要找的十六进制颜色值
找到的坐标X值,未找到返回 -1
找到的坐标Y值,未找到返回 -1
示例x, y = findColor(0x0000ff); -- 在全屏范围找到第一个颜色为0x0000ff的点, 将其坐标保存到变量x和y中if x ~= -1 and y ~= -1 then -- 如果找到了
touchDown(0, x, y);
-- 点击那个点
touchUp(0);end注意事项:
1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
2,尽量不要使用这个函数,全屏找色耗费资源,而且由于颜色可能会产生肉眼不可见的变化导致找色失败,建议使用区域模糊找色。
LUA逻辑运算符:
逻辑运算符认为false和nil是假(false),其他为真,0也是true.
and和or的运算结果不是true和false,而是和它的两个操作数相关。
-- 如果a为false,则返回a,否则返回b
-- 如果a为true,则返回a,否则返回b
例如:print(4 and 5)
--& 5print(nil and 13)
--& nilprint(false and 13)
--& falseprint(4 or 5)
--& 4print(false or 5)
--& 5函数:findColorFuzzy() 全屏模糊找色函数说明 : 全屏寻找符合指定颜色的坐标,支持模糊查找。
函数方法 : findColorFuzzy(整型 color,整数型 degree);
返回值 : 整数型 x, y
将要找的十六进制颜色值
精度,范围:1 ~ 100,数值越大精度越高,100为完全比配
找到的坐标X值,未找到返回 -1
找到的坐标Y值,未找到返回 -1
示例x, y = findColorFuzzy(0x0000ff, 90); -- 在全屏范围找到第一个颜色为0x0000ff的点, 精确度为90%, 将其坐标保存到变量x和y中if x ~= -1 and y ~= -1 then
-- 如果找到了
touchDown(0, x, y);
-- 点击那个点
touchUp(0);end注意事项:
1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
2,全屏找色耗费资源,尽量不要使用这个函数。
函数:findColorInRegion() 区域找色函数说明 : 区域寻找符合指定颜色的坐标,不支持模糊查找。
函数方法 : findColorInRegion(整型 color,整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2);
返回值 : 整数型 x, y
将要找的十六进制颜色值
欲寻找的区域左上角的X坐标
欲寻找的区域左上角的y坐标
欲寻找的区域右下角的X坐标
欲寻找的区域右下角的X坐标
找到的坐标X值,未找到返回 -1
找到的坐标Y值,未找到返回 -1
示例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注意事项:
1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
2,而且由于颜色可能会产生肉眼不可见的变化导致找色失败,建议使用区域模糊找色。
函数:findColorInRegionFuzzy() 区域模糊找色函数说明 : 区域寻找符合指定颜色的坐标,支持模糊查找。
函数方法 : findColorInRegionFuzzy(整型 color, 整数型 degree,整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2);
返回值 : 整数型 x, y
将要找的十六进制颜色值
精度,范围:1 ~ 100,数值越大精度越高,100为完全比配
欲寻找的区域左上角的X坐标
欲寻找的区域左上角的y坐标
欲寻找的区域右下角的X坐标
欲寻找的区域右下角的X坐标
找到的坐标X值,未找到返回 -1
找到的坐标Y值,未找到返回 -1
示例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 = findColorInRegionFuzzy(0x0000ff, 90, 100, 100, 100, 100); -- 将左上角和右下角两个坐标写成一样,作用就是判断(100,100)这个坐标颜色是否为0x0000ff, 精确度为90%, 将其坐标保存到变量x和y中if x ~= -1 and y ~= -1 then
-- 如果找到了
touchDown(0, x, y);
-- 点击那个点
touchUp(0);end示例:不断降低精确度的写法for sim = 100, 50, -1 do
--使用 for 循环不断降低精确度(建议精确度不低于50%)
x, y = findColorInRegionFuzzy(0x0000ff, sim, 100, 100, 100, 100);
if x ~= -1 and y ~= -1 then
--如果在指定区域找到某点符合条件
touchDown(0, x, y);
--那么单击该点
touchUp(0);
--并跳出循环
endend注意事项:
1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
函数:findMultiColorInRegionFuzzy() 多点区域模糊找色函数说明 : 区域内寻找多个符合条件的点,支持模糊查找。
函数方法 : findMultiColorInRegionFuzzy(数组 table, 整数型 degree,整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2);
返回值 : 整数型 x, y
要找的颜色数组
精度,范围:1 ~ 100,数值越大精度越高,100为完全比配
欲寻找的区域左上角的X坐标
欲寻找的区域左上角的y坐标
欲寻找的区域右下角的X坐标
欲寻找的区域右下角的X坐标
找到的坐标X值,未找到返回 -1
找到的坐标Y值,未找到返回 -1
示例 -- 在区域[(10,10)(200,200)]范围内以90%的精确度找一个满足以下条件的点: --
1. 其颜色为0x0000ff --
2. 其X坐标+10,Y坐标+20的坐标上的点颜色为0x00ff00 --
3. 其X坐标-10,Y坐标-20的坐标上的点颜色为0xff0000x, y = findMultiColorInRegionFuzzy({0x0000ff, 10, 20, 0x00ff00, -10, -20, 0xff0000 }, 90, 10, 10, 200, 200);if x ~= -1 and y ~= -1 then
-- 如果找到了
touchDown(0, x, y);
-- 点击那个点
touchUp(0);end指导:
此函数作用是先找到第一个基准点后,在这个点周围按照数组格式来查找其他的点,数组内所有点都符合要求即为找到。
通过多点我们可以建立一个大概的模型,比如一个关闭窗口的叉图标
假如下面是一个5*5的像素的图片
通过取1位置的颜色用9个像素点就可以建立一个叉的模型,甚至用5个坐标点就可以建立一个大致的模型
假设第一个1坐标是100,100,所有1的颜色为0x123456
那么第二个点坐标就为104,100,相对第一个坐标的偏移值为(4,0);
那么第三个点坐标就为102,102,相对第一个坐标的偏移值为(2,2);
那么第四个点坐标就为100,104,相对第一个坐标的偏移值为(0,4);
那么第五个点坐标就为104,104,相对第一个坐标的偏移值为(4,4);
把以上5个坐标点变成多点找色的数组格式为:{0x123456, 4,0, 0x123456, 2,2, 0x123456, 0,4, 0x123456, 4,4, 0x123456 }找色代码为:x, y = findMultiColorInRegionFuzzy({0x123456, 4,0, 0x123456, 2,2, 0x123456, 0,4, 0x123456, 4,4, 0x123456 }, 90, 50, 50 150, 150);返回的坐标为(100,100),即使这个图标在(50, 50 150, 150)这个范围内进行了偏移也可准确的找到该图标并点击。用5个点建立的模型从效率上来说就比25个点效率要高很多。
甚至我们可以把数字,字母,文字建立成数组模型来实现找字,判断金币数量等操作。注意事项:
1,数组内的坐标为第一个坐标的相对值。
2,多点找色代码和数组可以通过触摸精灵脚本编辑器的找色工具生成。
3,精确度设置的越低就会增大误判的可能性,建议设置60~90之间。
4,善用此函数可完全替代找图,并提高脚本效率。
函数:findImage() 全屏找图函数说明 : 全屏寻找符合指定图案,返回左上角坐标,不支持模糊查找。
函数方法 : findImage(文本型 picpath, 整型 alpha);
返回值 : 整数型 x, y
要找的图片的路径, 只支持BMP格式
指定图片中透明颜色(可不写)
找到的坐标X值,未找到返回 -1
找到的坐标Y值,未找到返回 -1
示例x, y = findImage("/mnt/sdcard/a.bmp"); -- 在全屏范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 将其左上角坐标保存到变量x和y中if x ~= -1 and y ~= -1 then
-- 如果找到了
touchDown(0, x, y);
-- 点击那个点
touchUp(0);end示例:忽略图片中的黑色x, y = findImage("a.bmp", 0x000000); -- 在全屏范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量x和y中if x ~= -1 and y ~= -1 then
-- 如果找到了
touchDown(0, x, y);
-- 点击那个点
touchUp(0);end教程:透明找图时图片的处理 在找图时,如果需要忽略掉一部分会变动的背景,这时候可以使用透明找图,将要找的图片中不参与比较的颜色填充成一个固定的颜色,然后在找图时指定该颜色为透明色,这样在找图时,即使那部分画面变了,也一样可以找到图片。如下图是原图,除文字以外的部分背景是变化的,用其他找图时会因为变化的背景导致图片找不到:那么可以将图片处理成下图这样,然后在找图时指定黑色(0x000000)为透明色,那么就算是背景变化,也可以找到了。注意事项:
1,全屏找图耗费资源,速度慢,不推荐使用。
2,图片路径不写为默认res目录,其他目录请填写绝对路径。
3,图片只支持BMP格式。
函数:findImageFuzzy() 全屏模糊找图函数说明 : 全屏寻找符合指定图案,返回左上角坐标,支持模糊查找。
函数方法 : findImageFuzzy(文本型 picpath, 整数型 degree,整型 alpha);
返回值 : 整数型 x, y
要找的图片的路径, 只支持BMP格式
精度,范围:1 ~ 100,数值越大精度越高,100为完全比配
指定图片中透明颜色(可不写)
找到的坐标X值,未找到返回 -1
找到的坐标Y值,未找到返回 -1
示例x, y = findImageFuzzy("/mnt/sdcard/a.bmp", 90, 0x000000); -- 在全屏范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 精确度为90, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量x和y中if x ~= -1 and y ~= -1 then
-- 如果找到了
touchDown(0, x, y);
-- 点击那个点
touchUp(0);end注意事项:
1,全屏找图耗费资源,速度慢,不推荐使用。
2,图片路径不写为默认res目录,其他目录请填写绝对路径。
3,图片只支持BMP格式。
函数:findImageInRegion() 区域找图函数说明 : 在指定区域中寻找符合指定图案,返回左上角坐标,不支持模糊查找。
函数方法 : findImageInRegion(文本型 picpath,
整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2,整型 alpha);
返回值 : 整数型 x, y
要找的图片的路径, 只支持BMP格式
欲寻找的区域左上角的X坐标
欲寻找的区域左上角的y坐标
欲寻找的区域右下角的X坐标
欲寻找的区域右下角的X坐标
指定图片中透明颜色(可不写)
找到的坐标X值,未找到返回 -1
找到的坐标Y值,未找到返回 -1
示例x, y = findImageInRegion("/mnt/sdcard/a.bmp", 100, 100, 200, 200, 0x000000); -- 在区域[(100,100)(200,200)]范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量x和y中if x ~= -1 and y ~= -1 then
-- 如果找到了
touchDown(0, x, y);
-- 点击那个点
touchUp(0);end注意事项:
1,由于颜色可能会产生肉眼不可见的变化导致找图失败,建议使用区域模糊找图。
2,图片路径不写为默认res目录,其他目录请填写绝对路径。
3,图片只支持BMP格式。
函数:findImageInRegionFuzzy() 区域模糊找图函数说明 : 在指定区域中寻找符合指定图案,返回左上角坐标,支持模糊查找。
函数方法 : findImageInRegionFuzzy(文本型 picpath, 整数型 degree, 整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2,整型 alpha);
返回值 : 整数型 x, y
要找的图片的路径, 只支持BMP格式
精度,范围:1 ~ 100,数值越大精度越高,100为完全比配
欲寻找的区域左上角的X坐标
欲寻找的区域左上角的y坐标
欲寻找的区域右下角的X坐标
欲寻找的区域右下角的X坐标
指定图片中透明颜色(可不写)
找到的坐标X值,未找到返回 -1
找到的坐标Y值,未找到返回 -1
示例x, y = findImageInRegionFuzzy("/mnt/sdcard/a.bmp", 90, 100, 100, 200, 200, 0x000000); -- 在区域[(100,100)(200,200)]范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 精确度为90, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量x和y中if x ~= -1 and y ~= -1 then
-- 如果找到了
touchDown(0, x, y);
-- 点击那个点
touchUp(0);end注意事项:
1,图片路径不写为默认res目录,其他目录请填写绝对路径。
2,图片只支持BMP格式。
函数:snapshotScreen() 全屏截图函数说明 : 截取屏幕并生成指定格式的图片文件。
函数方法 : snapshotScreen(文本型 picpath, 数字型 quality);
返回值 : 无
保存截图的路径, 支持BMP格式和JPG格式, 根据文件名后缀智能判断
图片尺寸缩放百分比, 有效范围为10~100, 默认为100(可选)
示例snapshotScreen("/mnt/sdcard/a.bmp"); -- 将全屏截图保存到路径为"/mnt/sdcard/a.bmp"的图片中, 格式为BMPsnapshotScreen("/mnt/sdcard/a.jpg, 50"); -- 将全屏截图保存到路径为"/mnt/sdcard/a.jpg"的图片中, 格式为JPG, 并且尺寸缩小为原始尺寸的50%snapshotScreen(string.format( "/mnt/sdcard/%s.bmp",os.time())); -- 以时间戳命名进行截图,防止截图重名被覆盖注意事项:
1,图片路径不写为默认res目录,其他目录请填写绝对路径。
2,保存图片的格式可为 bmp, jpg。
3,当截图为JPG可使用quality参数对图片进行片尺寸缩放。
4,os.time()为 Lua 操作系统库函数。string.format()为String库函数。
函数:snapshotRegion() 区域截图函数说明 : 截取屏幕中指定区域的图像并生成指定格式的图片文件。
函数方法 : snapshotRegion(文本型 picpath,整数型 x1,整数型y1, 整数型 x2, 整数型 y2, 数字型 quality);
返回值 : 无
保存截图的路径, 支持BMP格式和JPG格式, 根据文件名后缀智能判断
截图区域左上角的X坐标
截图区域左上角的y坐标
截图区域右下角的X坐标
截图区域右下角的X坐标
图片尺寸缩放百分比, 有效范围为10~100, 默认为100(可选)
示例snapshotRegion("/mnt/sdcard/a.bmp", 100, 100, 200, 200); -- 将区域[(100,100)(200,200)]的截图保存到路径为/mnt/sdcard/a.bmp的图片中, 格式为BMPsnapshotRegion("/mnt/sdcard/a.jpg", 100, 100, 200, 200, 50); -- 将区域[(100,100)(200,200)]的截图保存到路径为/mnt/sdcard/a.jpg的图片中, 格式为JPG, 并且尺寸缩小为原始尺寸的50%snapshotScreen(string.format( "/mnt/sdcard/%s.bmp",os.time()), 100, 100, 200, 200); -- 以时间戳命名进行截图,防止截图重名被覆盖注意事项:
1,图片路径不写为默认res目录,其他目录请填写绝对路径。
2,保存图片的格式可为 bmp, jpg。
3,当截图为JPG可使用quality参数对图片进行片尺寸缩放。
4,os.time()为 Lua 操作系统库函数。string.format()为String库函数。
函数:localOcrText() 本地图片识别函数说明 : 将指定区域的图像识别成文字。
函数方法 : localOcrText(文本型 ocrpath,文本型 language,整数型 x1,整数型y1, 整数型 x2, 整数型 y2, 文本型 list);
返回值 : 文本型 text说明:使用该函数需要ocr语言包。
   下载地址:
   下载后, 将解压后的tessdata目录复制到设备中
语言包tessdata目录的路径
语言类型 'eng' : 英文语言类型 'chi_sim' : 中文语言类型
待识别图片区域的左上角X坐标
待识别图片区域的左上角Y坐标
待识别图片区域的右下角X坐标
待识别图片区域的右下角Y坐标
设置白名单, 只有白名单中的字符才会被识别(可选)
图片识别后得到的答案, 失败的话返回空字符串
示例:识别中文code = localOcrText("/mnt/sdcard/touchelf/tessdata",
-- 语言包tessdata目录在设备中的路径
"chi_sim",
-- 语言类型为中文
-- 图片左上角X坐标为100
-- 图片左上角Y坐标为100
-- 图片右下角X坐标为200
200); -- 图片右下角Y坐标为200if code == "" then
notifyMessage("识别失败");else
notifyMessage(string.format("识别成功: %s", code));end示例:识别英文和数字code = localOcrText("/mnt/sdcard/touchelf/tessdata",
-- 语言包tessdata目录在设备中的路径
-- 语言类型为英文
-- 图片左上角X坐标为100
-- 图片左上角Y坐标为100
-- 图片右下角X坐标为200
200); -- 图片右下角Y坐标为200if code == "" then
notifyMessage("识别失败");else
notifyMessage(string.format("识别成功: %s", code));end示例:只识别数字code = localOcrText("/mnt/sdcard/touchelf/tessdata",
-- 语言包tessdata目录在设备中的路径
-- 语言类型为中文
-- 图片左上角X坐标为100
-- 图片左上角Y坐标为100
-- 图片右下角X坐标为200
-- 图片右下角Y坐标为200
""); -- 设置白名单字符串, 只识别数字if code == "" then
notifyMessage("识别失败");else
notifyMessage(string.format("识别成功: %s", code));end注意事项:
1,该函数对非正规字体识别欠佳,建议识别一些背景无杂色的英文和数字。
2,需要下载ocr语言包。
函数:cloudOcrInit() 选择远程代答平台函数说明 : 选择远程代答平台。
函数方法 : cloudOcrInit(整数型 platform);
返回值 : 无
远程代答平台ID, 默认为0
0 : 好爱答题
1 : 打码兔答题
示例cloudOcrInit(1);
-- 设置远程代答平台为打码兔注意事项:
1,使用好爱答题时可不写此函数。
2,由于好爱经常出问题,建议使用打码兔平台。
3,第一次使用打码兔请去打码兔后台设置触摸精灵为白名单。否则会默认为黑名单不能返回答案。
函数:cloudOcrText() 远程代答函数说明 : 连接cloudOcrInit()选择的答题平台进行图片识别。
函数方法 : cloudOcrText(文本型 key,文本型 type,整数型 x1,整数型y1, 整数型 x2, 整数型 y2, 整数型 timeout);
返回值 : 文本型 code
用户名及密码, 根据不同平台分别设置
题目类型, 请前往选择的代答平台的官网查询
待识别图片区域的左上角X坐标
待识别图片区域的左上角Y坐标
待识别图片区域的右下角X坐标
待识别图片区域的右下角Y坐标
超时时间, 范围为20-600秒
好爱答题key : 密码串(注册并登陆后, 在会员中心获取), 如username|9CF16235AD9EFBD3F00E6A
打码兔答题key : 用户名|密码, 如username|password
图片识别后得到的答案, 失败的话返回空字符串
示例cloudOcrInit(0);
-- 选择代答平台为好爱答题code = cloudOcrText("username|PASSWORDAD9EFBD3F00E6A",
-- 好爱答题参数1为密码串(http://www.haoi23.net注册并登陆后, 在会员中心获取)
-- 题目类型为"1004"(4位数字字母)
-- 图片左上角X坐标为100
-- 图片左上角Y坐标为100
-- 图片右下角X坐标为200
-- 图片右下角Y坐标为200
600); -- 超时时间为600秒if code == "" then
notifyMessage("识别失败");else
notifyMessage(string.format("识别成功: %s", code));end函数:cloudOcrTextEx() 远程合并图片代答函数说明 : 将参数中指定的任意个数的图片合并成一个图片后, 连接cloudOcrInit()选择的远程答题平台进行图片识别。
函数方法 : cloudOcrTextEx(文本型 key,文本型 type, 整数型 timeout,文本型 picpath1,文本型 picpath2,...,文本型 picpathn,);
返回值 : 文本型 code
用户名及密码, 根据不同平台分别设置
题目类型, 请前往选择的代答平台的官网查询
超时时间, 范围为20-600秒
待合并的第一个图片的路径
待合并的第二个图片的路径
picpath...
待合并的第...个图片的路径
待合并的第n个图片的路径
好爱答题key : 密码串(注册并登陆后, 在会员中心获取), 如username|9CF16235AD9EFBD3F00E6A
打码兔答题key : 用户名|密码, 如username|password
图片识别后得到的答案, 失败的话返回空字符串
示例:合并三张图片进行远程识别snapshotScreen("/var/touchelf/1.bmp");
-- 将屏幕截图为/var/touchelf/1.bmp图片snapshotScreen("/var/touchelf/2.bmp");
-- 将屏幕截图为/var/touchelf/2.bmp图片snapshotScreen("/var/touchelf/3.bmp");
-- 将屏幕截图为/var/touchelf/3.bmp图片--------------------------------------------- 下面的代码将1.bmp、2.bmp和3.bmp合并成一个图片后-- 发送到打码兔远程代答平台进行图片识别-------------------------------------------cloudOcrInit(1);
-- 选择代答平台为打码兔答题code = cloudOcrTextEx("username|password",
-- 打码兔答题参数1为"用户名|密码"
-- 题目类型为"1004"(4位数字字母)
-- 超时时间为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() 屏幕保持 缓存屏幕数据函数说明 : 开启/关闭屏幕保持。
函数方法 : keepScreen(逻辑型 flag);
返回值 : 无
开启/关闭屏幕保持
示例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"endkeepScreen(false);
-- 关闭屏幕保持注意事项:
1,当使用keepScreen(true);开启屏幕保持时, 后续的找图、找色等函数不会重新获取屏幕图像, 而是使用开启屏幕保持之前的屏幕图像,否则每次使用找图找色等函数都将截取一次屏幕内容。
2,当使用 keepScreen(false);关闭屏幕保持时, 后续的找图、找色等函数会每次都重新获取屏幕图像。
3,安卓版支持性能模式的设备不需要使用此函数。
4,苹果版和安卓兼容模式下使用此函数可显著提升找色速度。
流程图:Created with Rapha?l 2.1.2keepScreen(true)找图或者找色代码是否找到?点击坐标keepScreen(false)yesno函数:rotateScreen() 旋转屏幕的坐标体系函数说明 : 旋转屏幕的坐标体系, 后续的找图、找色、截图、触摸动作都会使用新的坐标体系
函数方法 : rotateScreen(整数型 Angle);
返回值 : 无
0: 保持原本的坐标体系。对于IOS设备来说, 此时HOME键在下方时的屏幕左上角为原点
90: 坐标系统向右转90度。对于IOS设备来说, 此时HOME键在右方时的屏幕左上角为原点
-90: 坐标系统向左转90度。对于IOS设备来说, 此时HOME键在左方时的屏幕左上角为原点
180: 坐标系统倒立。对于IOS设备来说, 此时HOME键在下方时的屏幕左上角为原点
示例rotateScreen(90);
-- 旋转坐标体系向右90度, 大多数横屏游戏使用此坐标体系.touchDown(0, 100, 100);
-- 发送触摸动作, 此时点击的点使用新的坐标体系.touchUp(0);示例 临时旋转后恢复原始坐标系
rotateScreen(90);
-- 旋转坐标体系向右90度
snapshotRegion("/mnt/sdcard/a.bmp", 100, 100, 200, 200);--截一张新的坐标体系下的图
rotateScreen(0);
-- 恢复坐标体系函数:copyText() 复制文字到系统剪贴板函数说明 : 复制文字到系统剪贴板, 以便后续粘贴。
函数方法 : copyText(文本型 text);
返回值 : 无
要粘贴的文字, 中英文都支持
示例copyText("你好") -- 复制字符串“你好”到系统剪贴板注意事项:
复制文字到系统剪贴板会覆盖以前复制的内容。
函数:clipText() 获取系统剪贴板内容函数说明 : 获取系统剪贴板中之前复制或剪贴的文字内容。
函数方法 : clipText();
返回值 : 文本型 text
剪贴板内的文字
示例text = clipText()
-- 将之前复制或剪贴的文字读取到变量text中inputText(text)
--在输入框中输入获取到的字符串函数:inputText() 输入字符串函数说明 : 在文本框内输入文本。
函数方法 : inputText(文本型 string);
返回值 : 无
要输入的字符串, 其中\b字符可用于退格删除
示例inputText("你好Hello"); -- 在当前选中的文字输入框中输入字符串"你好Hello"inputText("\b\b\b\b\b"); -- 退格删除5个字符注意事项:
1,使用该函数前,先点击输入框,例如点击用户名,再执行该函数。
2,建议切换到系统输入法再使用该函数。
3,\b字符可用于删除一个字符。
函数:appRun() 打开,运行指定软件函数说明 : 打开,运行指定软件。
函数方法 : appRun(文本型 string);
返回值 : 无
想要打开的软件的包名
示例appRun("com.android.browser"); -- 打开系统自带浏览器注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:appRunning() 判断指定应用是否正在运行函数说明 : 判断指定应用是否正在运行。
函数方法 : appRunning(文本型 string);
返回值 : 布尔值 flag
想要检测的软件的包名
返回true或者false
示例if appRunning("com.android.browser") then
notifyMessage("yes");else
notifyMessage("no");end注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:appKill() 关闭指定软件函数说明 : 关闭指定软件。
函数方法 : appKill(文本型 string);
返回值 : 无
想要关闭的软件的包名
示例appKill("com.android.browser"); -- 关闭系统自带浏览器示例--遇到某些应用一次关不掉的话可用下面的方法function kill_app(app_package)
while true do
if appRunning(app_package) then
appKill(app_package);
mSleep(1000);
return true;
endend---调用方法kill_app("com.android.browser"); -- 关闭系统自带浏览器注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:httpGet() HTTP协议访问函数说明 : HTTP协议访问。
函数方法 : httpGet(文本型 string);
返回值 : 文本型 data
网址的内容, 失败的话返回空字符串
示例data = httpGet('www.google.com'); -- 获取www.google.com的内容notifyMessage(data);
-- 显示www.google.com的内容-----登陆爱码sms_user_name = "user";sms_user_password = "pass";sms_user_info= httpGet("http://api.f02.cn:8888/http.do?action=loginIn&uid"..sms_user_name.."&pwd="..sms_user_password);--使用 用户名为user密码为pass的用户登陆爱码取回用户信息if sms_user_info ~= "" then
notifyMessage(sms_user_info);
-- 显示返回的内容else
notifyMessage("获取失败");end函数:ftpGet() ftp下载函数说明 : ftp下载。
函数方法 : ftpGet(文本型 url,文本型 file,文本型 ftpuser,文本型 ftppass);
返回值 : 布尔值 flag
远程文件地址
本地文件路径
FTP服务器用户名
FTP服务器密码
返回true或者false
示例flag = ftpGet("ftp://192.168.1.100:/a.txt", "/var/touchelf/a.txt", "user", "pass") -- 将FTP服务器192.168.1.100上路径为/a.txt的文件下载到/var/touchelf/a.txtif flag then
notifyMessage("下载成功")else
notifyMessage("下载失败")end函数:ftpPut() ftp上传函数说明 : ftp上传。
函数方法 : ftpPut(文本型 url,文本型 file,文本型 ftpuser,文本型 ftppass);
返回值 : 布尔值 flag
远程文件地址
本地文件路径
FTP服务器用户名
FTP服务器密码
返回true或者false
示例flag = 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 flag then
notifyMessage("上传成功")else
notifyMessage("上传失败")end函数:memoryRead() 读取指定应用的内存函数说明 : 读取指定应用的内存。
函数方法 : memoryRead(文本型 package,整数型 address,文本型 type);
返回值 : 布尔值 flag ,整数型 data
想要读取的软件的包名
想要读取的内存地址
想要读取内存的类型,支持的类型如下
I8: 有符号的8位整数
I16: 有符号的16位整数
I32: 有符号的32位整数
I64: 有符号的64位整数
U8: 无符号的8位整数
U16: 无符号的16位整数
U32: 无符号的32位整数
U64: 无符号的64位整数
F32: 有符号的32位浮点数
F64: 有符号的64位浮点数
返回true或者false
读取到的数据, 仅当返回值1为真时有效
示例flag, data = memoryRead("com.test.test", 0x1000000, "U32");
-- 读取包名为com.test.test的应用中, 内存地址为0x1000000处的无符号的32位整数if flag then
notifyMessage(string.format("%s", tostring(data)));else
notifyMessage("fail");end注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:memoryWrite() 写入指定应用的内存函数说明 : 写入指定应用的内存。
函数方法 : memoryWrite(文本型 package,整数型 address,文本型 type,整数型 data);
返回值 : 布尔值 flag
想要写入的软件的包名
想要写入的内存地址
想要写入内存的类型,支持的类型如下
I8: 有符号的8位整数
I16: 有符号的16位整数
I32: 有符号的32位整数
I64: 有符号的64位整数
U8: 无符号的8位整数
U16: 无符号的16位整数
U32: 无符号的32位整数
U64: 无符号的64位整数
F32: 有符号的32位浮点数
F64: 有符号的64位浮点数
返回true或者false
示例flag = memoryWrite("com.test.test", 0x1000000, "U32", 0x);
-- 将无符号32位整数0x写入到包名为com.test.test的应用内存地址为0x1000000处if flag then
notifyMessage("写入成功")end注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数说明 : 搜索指定应用的内存,支持联合搜素,支持在上一次的搜索结果上再次搜索过滤。
函数方法 : memorySearch(文本型 package,布尔值 flag,数组 data);
返回值 : 数组 array
想要搜索的软件的包名
true表示进行新的搜索,false表示再上一次搜索的结果上再次进行搜索过滤
想要搜索的内容,数组长度最多支持128个,格式为: { 数据1, 数据2相对于数据1的位置, 数据2, 数据3相对于数据1的位置, 数据3, ... }
搜索到内存地址数组, 地址为数据1的地址,最多返回128个
示例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注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:getScreenResolution() 获取当前屏幕分辨率函数说明 : 获取当前屏幕分辨率。
函数方法 : getScreenResolution();
返回值 : 整数型 width,height
获取到的当前屏幕宽度
获取到的当前屏幕高度
示例width, height = getScreenResolution();
-- 将屏幕宽度和高度分别保存在变量w、h中notifyMessage(string.format("%d,%d\n", width, height)); -- 将宽度和高度用提示框显示到屏幕上--脚本判断使用的机器是否是iphone5if width == 640 and height == 1136 then
notifyMessage("当前设备为iphone5")else
notifyMessage("请在iphone5上使用本程序")end函数:getScreenColorBits() 获取当前屏幕色彩位数函数说明 : 获取当前屏幕色彩位数。
函数方法 : getScreenColorBits();
返回值 : 整数型 color
示例color = getScreenColorBits();
-- 将屏幕色彩位数保存在变量color中notifyMessage(string.format("%d\n", color)); -- 将色彩位数用提示框显示到屏幕上函数:getDeviceID() 获取设备串号函数说明 : 获取设备串号。
函数方法 : getDeviceID();
返回值 : 文本型 deviceID
返回的设备串号
示例deviceID = getDeviceID(); -- 将设备ID保存到deviceID变量中-------------------------授权一台设备-------------------------if deviceID == "Fd452dg2421" then
notifyMessage("当前设备已授权");else
notifyMessage("当前设备未授权");
os.exit() --结束脚本end-------------------------授权多台设备---------------------------------local deviceID_flag = false; --定义当前设备未授权deviceID_arr = {"F123456","F1234567","F"};--可使用设备数组for i = 1,#deviceID_arr do --循环数组长度
if deviceID == deviceID_arr[i] then--判断当前设备序列号是否和设备数组中的相同
deviceID_flag = true;--定义当前设备已授权
break; --跳出循环
endendif deviceID_flag then
notifyMessage("当前设备已授权");else
notifyMessage("当前设备未授权");
os.exit(); --结束脚本end注意事项:
1,使用该函数 苹果设备返回的是序列号,安卓设备返回的是mac 。
2,os.exit() 为结束脚本函数。
函数说明 : 获取网络时间。
函数方法 : getNetTime();
返回值 : 整数型 time
示例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("当前时间超过了日12点30分");
notifyMessage("请连接网络");end示例:获取网络时间判断脚本是否到期endtime = os.time{year=2016, month=1, day=1, hour=0, min=0, sec=0};--到期时间2016年1月1日0点0分0秒if endtime & getNetTime() then --结束日期大于现在日期
notifyMessage("脚本未到期");else
notifyMessage("脚本已到期");end注意事项:
该时间与lua的os.time()函数一样, 返回的是UTC时间日0时0分0秒到现在流逝的秒数, 可以配合os.date()转换成方便阅读的格式。返回-1表示不能连接网络时间服务器
函数:getVersion() 获取当前触摸精灵版本号函数说明 : 获取当前触摸精灵版本号。
函数方法 : getVersion();
返回值 : 文本型 version
触摸精灵版本号如3.3.2
示例version = getVersion(); -- 将触摸精灵版本号保存在变量version中notifyMessage(version); -- 显示版本号-----判断版本号if tonumber(string.sub(version, 1, 1)..string.sub(version, 3,3)..string.sub(version, 5,5)) & 332 then
notifyMessage("请使用332版本以上的触摸精灵");
os.exit();end注意事项:
返回的版本号是字符串,对比的时候需转换成数字对比。
函数:fakeGPS() 修改GPS地理位置(苹果专用)函数说明 : 为指定程序伪装GPS地理位置。
函数方法 : fakeGPS(文本型 package,浮点型 x,浮点型 y);
返回值 : 无
要伪装GPS地理位置的软件的包名
纬度,和第三个参数同时为0的时候表示取消该应用的伪装
经度,和第二个参数同时为0的时候表示取消该应用的伪装
示例fakeGPS("com.baidu.map", 40., 116.);
-- 将百度地图的GPS地理位置伪装为指定纬度和经度fakeGPS("com.tencent.xin", 0, 0);
-- 取消对百度地图的GPS地理位置伪装注意事项:
调用该函数伪装地理位置以后,脚本停止以后伪装不会取消,直到使用该函数取消指定 应用的伪装,或执行『触摸精灵-设置-清除GPS伪装』清除设备所有伪装
函数:appBundlePath() 获取指定应用的主程序目录的路径(苹果专用)函数说明 : 获取指定应用的主程序目录的路径。
函数方法 : appBundlePath(文本型 package);
返回值 : 文本型 path
应用的包名
主程序目录的路径
示例path = appBundlePath("com.tencent.xin")if path ~= "" then
notifyMessage(path);else
notifyMessage("no");end注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:appDataPath() 获取指定应用的数据目录的路径(苹果专用)函数说明 : 获取指定应用的数据目录的路径。
函数方法 : appDataPath(文本型 package);
返回值 : 文本型 path
应用的包名
数据目录的路径
示例path = appDataPath("com.tencent.xin")if path ~= "" then
notifyMessage(path);else
notifyMessage("no");end注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:frontAppBid() 获取当前运行的APP包名(苹果专用)函数说明 : 获取当前运行的APP包名
函数方法 : frontAppBid();
返回值 : 文本型 bid
当前运行的APP包名
示例notifyMessage(frontAppBid())函数:shakeDevice()模拟摇一摇(苹果专用)函数说明 : 模拟摇一摇
函数方法 : shakeDevice(整数型 x,整数型 y,整数型 z,整数型 time);
返回值 : 无
支持版本 : V3.3.9-1 以上
选填,摇动左右、前后角度,不填则默认为轻微幅度摇动
选填,摇动持续时间
示例shakeDevice()
--轻微摇动shakeDevice(0,60,0,500) --仅上下摇动,持续时间 0.5秒注意事项:
参数x为左右,参数y为上下,参数z为前后。
调用此函数时请将目标应用置于前台。
本函数为异步代码,在摇一摇的同时会继续执行下面的代码,如需阻塞,请自行添加间隔时间。
函数:getVPNStatus() 获取VPN开关状态(苹果专用)函数说明 : 获取VPN开关状态
函数方法 : getVPNStatus();
返回值 : 布尔值 status
当前VPN开关状态
示例if getVPNStatus() then
notifyMessage("VPN处于开启状态")else
notifyMessage("VPN处于关闭状态")end函数:setVPNStatus() 设置VPN开关状态(苹果专用)函数说明 : 设置VPN开关状态
函数方法 : setVPNStatus();
返回值 : 无
VPN开关状态
示例setVPNStatus(true) -- 开启VPN函数:openURL() 打开网络地址(苹果专用)函数说明 : 打开网络地址
函数方法 : openURL(文本型 url);
返回值 : 无
支持版本 : V3.3.6-1 以上
需要打开的目标链接
调用系统浏览器打开触摸精灵官方网站openURL("http://www.touchelf.com");访问系统设置页面openURL("prefs:root=WIFI");
--打开 wifi 界面openURL("prefs:root=LOCATION_SERVICES"); --打开定位服务界面openURL("prefs:root=General&path=VPN");
--打开 VPN 界面注意事项:
默认浏览器为 Safari。
目标链接必须以 http:// 开头,一些特殊协议也是支持的,如:mailto://, sms://, tel://, ifile://, cydia:// 等等。
附表:可用的系统设置页面prefs:root=General&path=About
--关于本机页面prefs:root=General&path=ACCESSIBILITY
--辅助功能页面prefs:root=AIRPLANE_MODE
--飞行模式prefs:root=General&path=AUTOLOCK
--自动锁定页面prefs:root=General&path=USAGE/CELLULAR_USAGE
--用量页面prefs:root=Brightness
--亮度页面prefs:root=Bluetooth
--蓝牙页面prefs:root=General&path=DATE_AND_TIME
--日期与时间页面prefs:root=FACETIME
--FACETIME页面prefs:root=General
--通用页面prefs:root=General&path=Keyboard
--键盘页面prefs:root=CASTLE
--iCloud页面prefs:root=CASTLE&path=STORAGE_AND_BACKUP
--iCloud存储空间页面prefs:root=General&path=INTERNATIONAL
--语音与地区页面prefs:root=LOCATION_SERVICES
--定位服务页面prefs:root=ACCOUNT_SETTINGS
--账号设置页面prefs:root=MUSIC
--音乐设置页面prefs:root=MUSIC&path=EQ
--音乐设置EQ调节页面prefs:root=MUSIC&path=VolumeLimit
--音乐设置界面音量页面prefs:root=General
--通用页面prefs:root=NIKE_PLUS_IPOD
--NIKE页面prefs:root=NOTES
--备忘录页面prefs:root=NOTIFICATIONS_ID
--通知页面prefs:root=Phone
--电话页面prefs:root=Photos
--照片与相机页面prefs:root=General&path=ManagedConfigurationList --描述文件页面prefs:root=General&path=Reset
--还原页面prefs:root=Sounds&path=Ringtone
--电话铃声页面prefs:root=Safari
--Safari设置页面prefs:root=General&path=Assistant
prefs:root=Sounds
--声音页面prefs:root=General&path=SOFTWARE_UPDATE_LINK --软件更新页面prefs:root=STORE
--iTunes Store页面prefs:root=TWITTER
--TWITTER页面prefs:root=FACEBOOK
--FACEBOOK页面prefs:root=General&path=USAGE
--用量页面prefs:root=VIDEO
--视频页面prefs:root=Wallpaper
--墙纸页面prefs:root=WIFI
--WIFI页面prefs:root=INTERNET_TETHERING
--设置页面函数:saveImageToAlbum 将图片存入系统相册(苹果专用)函数说明 : 将图片存入相册
函数方法 : saveImageToAlbum(文本型 path);
返回值 : 无
支持版本 : V3.3.6-2 以上
需要写入系统相册的图片路径,支持绝对路径
示例saveImageToAlbum("/var/touchelf/scripts/1.jpg");saveImageToAlbum("1.jpg");注意事项:
图片的格式可为 bmp, jpg, png。
如不填写绝对路径时,将默认为触摸精灵的 RES 目录。
函数:saveVideoToAlbum 将视频存入系统相册(苹果专用)函数说明 : 将视频存入相册
函数方法 : saveVideoToAlbum(文本型 path);
返回值 : 无
支持版本 : V3.3.8 以上
需要写入系统相册的视频路径,支持绝对路径
示例saveVideoToAlbum("/var/touchelf/scripts/1.mp4");saveVideoToAlbum("1.mp4");注意事项:
视频的格式可为 mp4, avi, mov。
如不填写绝对路径时,将默认为触摸精灵的 RES 目录。
函数:addContactToAB 添加联系人 (苹果专用)函数说明 : 将联系人添加到通讯录
函数方法 : addContactToAB(文本型 lastname,文本型 firstname,文本型 mobile);
返回值 : 无
支持版本 : V3.3.8 以上
联系人电话号码
示例addContactToAB("张","小明","");函数:removeAllContactsFromAB 清空通讯录 (苹果专用)函数说明 : 清空通讯录
函数方法 : removeAllContactsFromAB();
返回值 : 无
支持版本 : V3.3.8 以上示例removeAllContactsFromAB();函数:md5String 计算字符串的MD5值 (苹果专用)函数说明 : 计算字符串的MD5值
函数方法 : md5String(string 字符串类型);
返回值 : 文本型 MD5
支持版本 : V3.4.0-1 以上
需要计算MD5值的字符串
示例MD5=md5String("touchelf");logDebug(MD5);函数:md5File 计算文件的MD5值 (苹果专用)函数说明 : 计算文件的MD5值
函数方法 : md5File(path 文本型);
返回值 : 文本型 MD5
支持版本 : V3.4.0-1 以上
需要计算MD5值的文件路径
示例MD5=md5File("/var/touchelf/plugin/socket.lua");logDebug(MD5);函数:jsonDecode 将json字符串转换为table (苹果专用)函数说明 : 将json字符串转换为table
函数方法 : jsonDecode(json 文本型);
返回值 : 数组 table
支持版本 : V3.4.0-1 以上
需要转换的json字符串
示例table1 = jsonDecode('{"name":"touchelf"}');logDebug(table1.name);函数:jsonEncode 将table转为json字符串 (苹果专用)函数说明 : 将table转为json字符串
函数方法 : jsonEncode(数组 table);
返回值 : json 文本型
支持版本 : V3.4.0-1 以上
需要转换成json的数组
示例table1 = {
name='touchelf',sex='man',age=18}json = jsonEncode(table1);logDebug(json);函数:plistRead 读取plist文件为table (苹果专用)函数说明 : 读取plist文件为table
函数方法 : plistRead(path 文本型);
返回值 : 数组 plistTable
支持版本 : V3.4.0-1 以上
需要读取的plist文件路径
示例plistTable = plistRead("/Library/Preferences/SystemConfiguration/com.apple.wifi.plist");logDebug(jsonEncode(plistTable));函数:plistWrite 将table写入plist文件 (苹果专用)函数说明 : 将table写入plist文件
函数方法 : plistWrite(table 数组, path 文本型);
返回值 : 无
支持版本 : V3.4.0-1 以上
需要写入 plist 文件的数组
需要写入的 plist 文件的绝对路径
示例--plist文件路径plistPath = "/Library/Preferences/SystemConfiguration/com.apple.wifi.plist";-- plistRead: 读取plist文件为tableplistTable = plistRead(plistPath);--为表中增加touchelf键值plistTable["touchelf"] = "S.C" -- plistWrite: 将table写入plist文件plistWrite(plistTable, plistPath);注意事项:
使用该函数操作文件会导致文件所有者变 root,如果需要更改用户级应用的 plist 需要在写入后修改权限。
os.execute("chown mobile:mobile "..plistPath)
-- 修正文件权限
os.execute("chmod 644 "..plistPath)
函数:setControlBarPosition() 设置播放控制条位置(安卓专用)函数说明 : 获取指定应用的数据目录的路径。
函数方法 : setControlBarPosition(整数型 x,整数型 y);
返回值 : 无
播放控制条X坐标
播放控制条Y坐标
示例setControlBarPosition(100, 100) -- 将播放控制条移动到坐标(100, 100)处函数:cleanPhone 清除已安装应用的数据 (苹果专用)函数说明 : 清除所有已安装应用的数据,恢复应用到刚安装时候的状态。清理浏览器缓存,清理钥匙链,清理剪贴板
函数方法 : cleanPhone();
返回值 : 无
支持版本 : V3.5.0 以上示例cleanPhone();函数:getAirplaneMode() 获取飞行模式开关状态(苹果专用)函数说明 : 获取飞行模式开关状态
函数方法 : getAirplaneMode();
返回值 : 布尔值 status
支持版本 : V3.5.0 以上
当前飞行模式开关状态
示例if getAirplaneMode() then
notifyMessage("飞行模式处于开启状态")else
notifyMessage("飞行模式处于关闭状态")end函数:setAirplaneMode() 设置飞行模式开关状态(苹果专用)函数说明 : 设置飞行模式开关状态
函数方法 : setAirplaneMode();
返回值 : 无
支持版本 : V3.5.0 以上
飞行模式开关状态
示例setAirplaneMode(true) -- 开启飞行模式setAirplaneMode(false) -- 关闭飞行模式函数:aesEncrypt 将字符串用aes加密 (苹果专用)函数说明 : 将字符串用aes加密
函数方法 : aesEncrypt(string 字符串类型,key 字符串类型);
返回值 : str 加密字符串
支持版本 : V3.5.0 以上
需要加密的字符串
示例--将字符串touchelf用密钥password加密enc = aesEncrypt("touchelf","passeword");logDebug(enc);函数:aesDecrypt 将字符串用aes解密 (苹果专用)函数说明 : 将字符串用aes解密
函数方法 : aesDecrypt(string 字符串类型,key 字符串类型);
返回值 : str 字符串
支持版本 : V3.5.0 以上
需要解密的字符串
示例--将字符串OCMtxqU2lSHM/hFQ6s8XDQ==用密钥password解密enc="OCMtxqU2lSHM/hFQ6s8XDQ==";msg = aesDecrypt(enc,"password");logDebug(msg);php aes加密解密示例&?php//加密$data = 'touchelf';$aesKey = 'password';$aesKey=hash('sha256', $aesKey, true);$msgData = @openssl_encrypt ($data, "aes-256-cbc", $aesKey);echo $msgData . "\r\n";//解密$data = 'OCMtxqU2lSHM/hFQ6s8XDQ==';$aesKey = 'password';$aesKey=hash('sha256', $aesKey, true);$msgData = @openssl_decrypt ($data, "aes-256-cbc", $aesKey);echo $msgData . "\r\n";?&教程触摸精灵找图脚本的详细制作过程1.截取全屏图片
将电脑和手机连接到同一个路由器下,使2者处于同一个子网中,假设电脑的IP为192.168.1.6,手机的IP为192.168.1.7
在电脑上运行『触摸精灵编辑器』 执行『菜单-图像-触摸抓抓』 点击『远程截图』,输入手机的IP:192.168.1.7(见图1)
等待处理完成便获取到了手机的当前屏幕截图(见图2)
2.扣取要找的图片
点击『图片裁剪』
按下鼠标左键并拖动来选取要扣取的图片(见图3)
将扣取的图片保存到电脑,起名为phone.bmp(见图4)
3.编写脚本
将截取的图片phone.bmp上传到手机中的某个目录中(例如:IOS设备可以存放到/var/touchelf目录下,安卓设备可以存放到/mnt/sdcard/目录下)
假如我们想要执行的动作为:如果播放脚本时屏幕上存在电话图标,那么点击该图标,并显示yes;如果不存在该图标,那么就显示no
function main() -- main函数,脚本播放时会执行该函数
mSleep(2000)
-- 等待2秒后执行,为了避免播放开始的提示影响找图
x, y = findImage("/var/touchelf/phone.bmp")
-- 参数为图片的绝对路径,请修改为你上传的图片路径
if x ~= -1 and y ~= -1 then
-- 如果x和y不等与-1,说明找到了
touchDown(0, x+5, y+5)
-- 手指按下图片所在的位置,由于x和y是左上角坐标,为了点中图片,x和y都加了5个像素的偏移
touchUp(0)
-- 手指抬起
notifyMessage("yes")
-- 显示yes
-- 否则,如果没找到
notifyMessage("no")
将上述代码保存为脚本,然后在存在电话图标的界面播放时,会点击该图标后,显示yes;在不存在Phone图标的界面上播放时,只会显示no
httpGet函数操作二进制文件的方法  因为httpGet函数的交互只能操作字符串,所以如果想要使用该函数传送二进制文件(如图片),可以把二进制文件转换成16进制字符串,然后在服务器端逆向的把16进制字符串还原成二进制,下面代码中的fileToHexString()函数就是一个把二进制文件转换成16进制字符串的函数。---------------------------------------------------- 将二进制文件转换成16进制字符串-- 可用于httpGet函数传送文件,服务器端将16进制字符串转换成二进制文件即可-- 实现逆向转换--------------------------------------------------function fileToHexString(file)
local file = io.open(file, 'rb');
local data = file:read("*all");
file:close();
local t = {};
for i = 1, string.len(data),1 do
local code = tonumber(string.byte(data, i, i));
table.insert(t, string.format("%02x", code));
return table.concat(t, "");endfunction main()
str = fileToHexString('test.dat');
notifyMessage(str);end脚本的模块化教程当脚本过大时,模块化各个功能可以让脚本更加便于管理。假设a.lua存放于/mnt/sdcard/touchelf/scripts/下面(默认路径),内容如下:function a1()
notifyMessage("i'm a1");end想要在b.lua中调用a.lua中的函数a1(),那么b.lua可以这样写:package.path=package.path .. ";/mnt/sdcard/touchelf/scripts/?.lua"require "a"function main()
a1();end或者:dofile("/mnt/sdcard/touchelf/scripts/a.lua");function main()
a1();endrequire与dofile区别:
1.require只需要指定模块名字(不需要加入.lua这样后缀),而dofile需要指定文件的完整路径。
2.require会记住load过的信息,重复调用不会导致模块被重新载入,而dofile会。(我们可以通过dofile这种特性来实现热更新)
3.require可以载入二进制模块,如c语言编写的动态库,可以通过package.cpath来显示动态库查找的路径信息。
让你的脚本随机化一些有时候,我们可能希望脚本可以随机化一点,表现的能像是真人在操作,而不要太机械,比如循环点击一个点的时候,能够每次点击的位置能稍微变化一点,这个时候可以试用lua的math.random()函数,这个比如如下代码:math.randomseed(tostring(os.time()):sub(5):reverse()); -- 随机种子math.random(-5, 5);每次都可以返回-5到5之间随机的一个数,那么我们可以将点击操作写一个函数:function click(x, y)
touchDown(0, x + math.random(-5, 5), y + math.random(-5, 5));
mSleep(math.random(1000, 2000));
touchUp(0);end然后在需要点击时之间调用这个函数,比如找图时: x, y = findImage("/mnt/sdcard/a.bmp");
if x ~= -1 and y ~= -1 then
click(x, y);
end这样每次循环点击的位置都是有小幅变化的,而不是每次都是点击一个点。自定义字符串随机:function randomStr(str, num)
local reStr ='';
math.randomseed(tostring(os.time()):sub(5):reverse());
for i = 1, num do
local getStr = math.random(1, string.len(str));
reStr = reStr .. string.sub(str, getStr, getStr);
return reStr;end--用法s = randomStr("abcdefghijklmnopqrstuvwxyz", 10) --生成10位随机字母触摸精灵的坐标体系与rotateScreen()函数的用法1.触摸精灵的默认坐标体系  在没有rotateScreen()这个函数之前,触摸精灵的坐标体系是固定的,以IOS设备为例子,不论是找图还是点击,坐标的原点始终是在HOME键盘在下时候的左上角是原点,例如我们用如下脚本: function main()
mSleep(1000);
-- 延迟一秒
snapshotScreen("/var/touchelf/a.bmp");
-- 将全屏截图保存到/var/touchelf/a.bmp这个文件里end在IOS设备的主屏幕播放一次,这样就获取了如下的图:
  这个图片的尺寸和768x1024, 图片的方向是和触摸精灵默认的坐标体系是一样的,左上角的坐标为(0,0),右上角的坐标为(768, 0),左下角的坐标为(0, 1024),右下角的坐标为(768, 1024)。 2.通过坐标点击制定位置   如果我们想在脚本中点击“触摸精灵”的图标的话,需要怎么写呢,我们需要获取到该图标的坐标,获取这个图标的坐标的方法很多,这里我们用Photoshop打开该图片,然后按F8打开信息面板,并把该面板的选项中的“鼠标坐标”单位改为“像素”,然后把鼠标移动到图标的位置,这是就可以在信息面板里看到对应的坐标了,如下图所示:
上图中的信息面板中的信息告诉我们,“触摸精灵”图标的坐标是(124,131),那么我们编写如下脚本:function main()
touchDown(0, 124, 131);
-- 手指按下(124,131)位置,第一个参数0是手指ID,这个在多点触摸时会用到
touchUp(0);
-- 手指抬起end在主屏幕播放如上脚本,就可以自动点击到“触摸精灵”的图标了。3.通过找图点击指定位置  接下来,我们想通过找图来点击“触摸精灵”的坐标,那么我们首先需要获取“触摸精灵”图标的截图,我们用Photoshop截取“触摸精灵”的图标如下(保存时候的BMP选项: 文件格式为windows,深度为24位,其他的都不选):
把这个图片传到设备的/var/touchelf/touchelf.bmp文件,然后编写如下脚本:function main()
x, y = findImage("/var/touchelf/touchelf.bmp");
-- 查找touchelf.bmp这个图标在屏幕的位置,坐标保存到x和y里
if x ~= -1 and y ~= -1 then
如果x和y都不是-1的话,说明找到了
touchDown(0, x+5, y+5);
-- 由于x和y保存里图标的位置,我们把x和y传给touchDown就可以了,这里x和y都加5是由于找图返回的坐标是找到的图片的左上角的坐标,我们要先点中的话,点击的位置需要往右下方偏移一下。
touchUp(0);
-- 手指抬起
-- 否则,也就是x和y有一个是-1的话,说明没找到
notifyMessage("没有找到");
-- 显示消息
endend4.横屏游戏如何编写呢  手游基本是横屏的,默认情况下,触摸精灵的坐标体系不会随着屏幕画面改变的,例如,我们在横屏游戏中播放上述的截图脚本,获取到的图片是这样的:
我们可以看到,截图还是竖着的,而且这时候坐标体系也没有改变的,如果我们想点击“人物头像”,使用以前Photoshop信息面板查看的方法,可以看到“人物头像”的坐标是(720,65),那么脚本如下:function main()
touchDown(0, 720, 65);
-- 手指按下人物头像的位置,第一个参数0是手指ID,这个在多点触摸时会用到。
touchUp(0);
-- 手指抬起end那么我们想找图点击呢,这时候我们需要找图的是这样的:
就像上面的图片,我们要找的图也必须是从竖着的图片上扣取下了的。5.横屏游戏如何更容易的编写呢  通过第4讲里的说明,我们可以看到触摸精灵默认的坐标体系对于编写横屏游戏来说不太友好,因为我们可能想要这样的坐标体系:
我们想要上面图片中的左上角是(0,0),右上角是(0,1024),左下角是(0, 768),右下角是(),那么我们就可以使用rotateScreen()函数来做到这一点了。rotateScreen()函数用于设置触摸精灵的坐标体系,它的参数有4个选项:
0:这个是默认的选项,就是竖着拿设备,HOME键在下面时候,左上角是(0,0)原点
90:这个对应大部分的横屏游戏,即横着拿设备,HOME键在右面的时候,左上角是(0, 0)原点
-90:这个对应小部分横屏游戏,即横着拿设备,HOME键在左面的时候,左上角是(0,0)原点
180:这个是竖着拿设备,HOME键在上面时候,左上角是(0,0)原点
对于大部分横屏游戏来说,我们可以用rotateScreen(90)将触摸精灵的坐标体系与其设置成一样的,比如我们使用如下脚本截图:function main()
mSleep(1000);
-- 延迟一秒
rotateScreen(90);
-- 设置触摸精灵的坐标体系设置成和游戏一致
snapshotScreen("/var/touchelf/a.bmp");
-- 截图保存到/var/touchelf/a.bmp文件end通过上面的脚本截到的图片如下:
我们可以发现,这时候获取的图片和游戏的画面是一致的了,都是横着的。那么我们想以横屏游戏的左上角为原点发送点击怎么做呢,很简单,在脚本开始的时候加入rotateScreen(90),以后的touchDown()等函数就可以传给他横屏游戏的坐标了,比如还是想点击“人物头像”,我们在Photoshop的信息面板中查看坐标如下:
可以看到“人物头像”的坐标是(58,54),那么可以这样写:function main()
rotateScreen(90);
-- 设置触摸精灵的坐标体系设置成和游戏一致
touchDown(0, 58, 54);
-- 以游戏画面左上角为原点,发送点击动作
touchUp(0);end那么我们想通过找图来点击呢,而且不想像第4讲里的那样找竖着的图,我们想找如下这样的图:
我们把这个横屏图片的人物头像截图放到/var/touchelf/b.bmp位置,然后再简单的修改上面的找图脚本就可以了:function main()
rotateScreen(90);
-- 设置触摸精灵的坐标体系设置成和游戏一致
x, y = findImage("/var/touchelf/touchelf.bmp");
-- 查找touchelf.bmp这个图标在屏幕的位置,坐标保存到x和y里,这时返回的坐标也是以横屏游戏的左上角为原点的。
if x ~= -1 and y ~= -1 then
如果x和y都不是-1的话,说明找到了
touchDown(0, x+5, y+5);
那么点击找图返回的坐标
touchUp(0);
-- 手指抬起
-- 否则,也就是x和y有一个是-1的话,说明没找到
notifyMessage("没有找到");
-- 显示消息
不建议使用第5种方案编写脚本。
"os.execute"的相关应用--注销os.execute("killall -9 SpringBoard");--关机os.execute("halt");--重启os.execute("reboot");--清除缓存os.execute("su mobile -c uicache");--安装apkos.execute("pm install /路径/文件名.apk");--卸载apkos.execute("pm uninstall 包名");--删除文件、文件夹function remove(path)
return os.execute("rm -rf "..path);end参数说明:path为要删除文件的路径,支持*通配符。如要删除test.lua的文件,则输入:
remove("/var/touchelf/scripts/test.lua");当然也可直接用自带的系统库函数,但不能删文件夹
os.remove("/var/touchelf/scripts/test.lua");--移动文件function move(path,to)
return os.execute("mv "..path.." "..to);end参数说明:1.path为待移动文件的路径,支持*通配符。2.to为要移到的文件路径,注意先判断是否有重名文件或文件夹。如要移动log.txt到scripts/test.lua,则输入:
move("/var/touchelf/log.txt","/var/touchelf/scripts/test.lua");--复制文件function copy(path,to)
return os.execute("cp -rf "..path.." "..to);end参数说明:1.path为待复制文件的路径,支持*通配符。2.to为要复制到的文件路径,注意先判断是否有重名文件或文件夹。如要复制log.txt到scripts/test.lua,则输入:
copy("/var/touchelf/log.txt","/var/touchelf/scripts/test.lua");--创建文件夹function newfolder(path)
return os.execute("mkdir "..path);end参数说明:path为要创建文件夹的路径。如要创建test文件夹,则输入:
newfolder("/var/touchelf/scripts/test");--创建文件function newfile(path)
return os.execute("touch "..path);end参数说明:path为要创建文件的路径。如要创建test.lua文件,则输入:
newfile("/var/touchelf/scripts/test.lua");--获取文件相关信息function main()
path="/var/touchelf/scripts/test.lua"
f=io.file(path)
--获取文件
notifyMessage(f:size())
--显示文件大小
if f:chown("root") then
--改变文件所有者
notifyMessage(f:chown())
--显示文件所有者
if f:chmod(777) then
--改变文件权限
notifyMessage(f:chmod())
--显示文件权限
notifyMessage(f:time())
--显示文件修改时间endfunction io.file(path)
local _={}
function _:chmod(mode)
if mode then
return os.execute("chmod "..mode.." "..path)
return string.sub(io.popen("ls -l "..path):read("*l"),2,10)
function _:chown(mode)
if mode then
return os.execute("chown "..mode.." "..path)
return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",2).."([^ ]+)")
function _:size()
return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",4).."([^ ]+)")
function _:time()
return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",5).."("..string.rep("[^ ]+[ ]+",3)..")")
return _end--解压zip文件function unzip(path,to)
return os.execute("unzip "..path.." -d "..to);end参数说明:1.path为待解压文件的路径。2.to为要解压到的文件夹路径,默认不覆盖。如要解压test.zip的文件,则输入:
unzip("/var/touchelf/scripts/test.zip","/var/touchelf/scripts/");补充:使用-P可以实现带密码解压,load()、dofile()可以运行字符串或脚本文件。"io库"的相关应用--读取指定文件所有内容,返回一个数组function readFile(path)
local file = io.open(path,"r");--用读模式打开一个文件
if file then
local _list = {};
for l in file:lines() do
table.insert(_list,l)
file:close();--关闭默认的输出文件
return _list
endendlist = readFile("/var/touchelf/scripts/test.txt");参数说明:path为要读取文件的路径。返回值:返回一个table。
io.open按指定的模式打开一个文件,成功则返回文件句柄,失败则返回nil。
常用模式:
"r": 读模式 (默认);
"w": 写模式;
"a": 添加模式;
"r+": 更新模式,所有之前的数据将被保存
"w+": 更新模式,所有之前的数据将被清除
"a+": 添加更新模式,所有之前的数据将被保存,只允许在文件尾进行添加
flie:lines()打开指定的文件为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,并自动关闭文件
--遍历文件function list(path)
return io.popen("ls "..path);end参数说明:path为要列举文件的文件夹的路径,支持*通配符。如要列举scripts文件夹下所有的脚本文件,则输入:
list("/var/touchelf/scripts/")返回值:文件,请用read()函数读取,文件结构为各文件的文件名并以\n连接的字符串,如使用通配符,则还包含父文件夹名。--查找文件function find(path)
return io.popen("find "..path.." -prune");end参数说明:path为要查找文件的路径,支持*通配符。如要查找后缀为.lua的文件,则输入:
find("/var/touchelf/scripts/*.lua")返回值:文件,请用read()函数读取,文件结构为各文件的完整路径并以\n连接的字符串。----检测指定文件是否存在function file_exists(file_name)
local f = io.open(file_name, "r")
return f ~= nil and f:close()end参数说明:path为要查找文件的路径。返回值:返回 true、false。if file_exists("/var/touchelf/scripts/test.lua") then
notifyMessage("Yes");
notifyMessage("No");
end"string库"的相关应用基本函数
计算字符串长度
string.len("abcd")
返回字符串s的n个拷贝
string.rep("abcd",2)
返回字符串全部字母大写
string.lower("AbcD")
返回字符串全部字母小写
string.upper("AbcD")
格式化字符串
string.format("the value is:%d",4)
the value is:4
从字符串里截取字符串
string.sub("abcd",2)
string.sub("abcd",-2)
string.sub("abcd",2,-2)
string.sub("abcd",2,3)
在字符串中查找(显示位置)
string.find("cdcdcdcd","ab")
string.find("cdcdcdcd","cd")
string.find("cdcdcdcd","cd",7)
在字符串中查找(显示内容)
string.match("cdcdcdcd","ab")
string.match("cdcdcdcd","cd")
在字符串中替换
string.gsub("abcdabcd","a","z");
zbcdzbcd 2
string.gsub("aaaa","a","z",3);
返回字符的整数形式
string.byte("ABCD",4)
将整型数字转成字符并连接
string.char(97,98,99,100)
基本模式串
string.find("",".")
string.find("ab cd","%s%s")
string.find("ab cd","%S%S")
string.find("ab,.cd","%p%p")
非标点字符
string.find("ab,.cd","%P%P")
string.find("abcd\t\n","%c%c")
非控制字符
string.find("\t\nabcd","%C%C")
string.find("abcd12","%d

我要回帖

更多关于 编辑时输入{}即可建立一个域 的文章

 

随机推荐