用户可以通过在脚本中定义一个全局变量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', 定义一个变量的名字, 脚本开始后可以通过访问这个变量来获取用户输入的内容
'注释', 显示在输入框上方, 用于说明该输入框的用途
'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);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
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);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
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);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
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);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
interval | 整数型 | 震动时间,单位:毫秒 |
示例:
notifyVibrate(1000); -- 让设备震动1秒
注意事项:
使用此函数需在移动设备设置里打开震动选项。
函数:notifyVoice() 播放音频
函数说明 : 以播放音频的方式通知用户
函数方法 : notifyVoice(文本型 file);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
filen | 文本型 | 音频文件路径及名字 |
示例:
notifyVoice("/mnt/sdcard/a.mp3"); -- 播放路径为"/mnt/sdcard/a.mp3"的音频
mSleep(5000);
注意事项:
使用此函数需在后面加上延时函数,延时5000即播放音频5秒钟。
函数:touchDown() 按下
函数说明 : 发送手指按下事件
函数方法 : touchDown(整数型 ID,整数型 x,整数型 y);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
ID | 整数型 | 手指ID, 范围0~128, 用于标识一个手指 |
X | 整数型 | X坐标 |
Y | 整数型 | Y坐标 |
示例:
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);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
ID | 整数型 | touchDown()时传入的手指ID |
X | 整数型 | X坐标 |
Y | 整数型 | Y坐标 |
示例:
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
w1 = n;
else
w1 = -n;
end
if y1 < y2 then
h1 = n;
else
h1 = -n;
end
if w >= h then
for i = 1 , w,n do
x1 = x1 + w1;
if y1 == y2 then
else
y1 = y1 + math.ceil(h*h1/w);
end
touchMove(0,x1,y1);
mSleep(10);
end
else
for i = 1 ,h,n do
y1 = y1 + h1;
if x1 ==x2 then
else
x1 = x1 + math.ceil(w*w1/h);
end
touchMove(0,x1,y1);
mSleep(10);
end
end
mSleep(50);
touchUp(0);
end
--------------调用方法----------------
clickMove(100,100,200,200,5);--x1,y1为起始位置坐标,x2、y2为终点位置坐标,n是每次移动多少个像素
函数:touchUp() 抬起
函数说明 : 发送手指抬起事件
函数方法 : touchUp(整数型 ID);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
ID | 整数型 | touchDown()时传入的手指ID |
示例:
touchDown(0, 100, 100); -- ID为0的手指在坐标为(100, 100)的点按下
mSleep(100); --延时100毫秒
touchUp(0); -- ID为0的手指抬起
函数:keyDown() 按下物理按键
函数说明 : 发送物理按键按下事件
函数方法 : keyDown(文本型 string);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
string | 文本型 | 物理键名称 |
示例:单击一次HOME按键
keyDown('HOME'); -- HOME键按下
mSleep(100); --延时100毫秒
keyUp('HOME'); -- HOME键抬起
注意事项:
1,Android触摸精灵现在支持的有'HOME'、'BACK'、'MENU',
2,IOS触摸精灵现在支持的有'HOME'
3,其他按键可参照【附录】触摸精灵模拟物理按键的方法
函数:keyUp() 抬起物理按键
函数说明 : 发送物理按键抬起事件
函数方法 : keyUp(文本型 string);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
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 | 整数型 | 将获取颜色值的X坐标 |
Y | 整数型 | 将获取颜色值的y坐标 |
返回值 | 类型 | 说明 |
---|---|---|
color | 整数型 | 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()返回的是十进制颜色值,如纯白色获取到的数值是16777215。十进制数值和十六进制颜色对比时,十六进制前面需加"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 | 整数型 | 将获取颜色值的X坐标 |
Y | 整数型 | 将获取颜色值的y坐标 |
返回值 | 类型 | 说明 |
---|---|---|
R | 整数型 | x,y坐标点的颜色R(红色)值 |
G | 整数型 | x,y坐标点的颜色G(绿色)值 |
B | 整数型 | 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;
end
if math.abs(lg-g) > sim then
return false;
end
if math.abs(lb-b) > sim then
return false;
end
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
参数 | 类型 | 说明 |
---|---|---|
color | 整数型 | 将要找的十六进制颜色值 |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标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逻辑运算符:
and or not
逻辑运算符认为false和nil是假(false),其他为真,0也是true.
and和or的运算结果不是true和false,而是和它的两个操作数相关。
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b
例如:
print(4 and 5) --> 5
print(nil and 13) --> nil
print(false and 13) --> false
print(4 or 5) --> 4
print(false or 5) --> 5
函数:findColorFuzzy() 全屏模糊找色
函数说明 : 全屏寻找符合指定颜色的坐标,支持模糊查找。
函数方法 : findColorFuzzy(整型 color,整数型 degree);
返回值 : 整数型 x, y
参数 | 类型 | 说明 |
---|---|---|
color | 整数型 | 将要找的十六进制颜色值 |
degree | 整数型 | 精度,范围:1 ~ 100,数值越大精度越高,100为完全比配 |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标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
参数 | 类型 | 说明 |
---|---|---|
color | 整数型 | 将要找的十六进制颜色值 |
x1 | 整数型 | 欲寻找的区域左上角的X坐标 |
y1 | 整数型 | 欲寻找的区域左上角的y坐标 |
x2 | 整数型 | 欲寻找的区域右下角的X坐标 |
y2 | 整数型 | 欲寻找的区域右下角的X坐标 |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标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
参数 | 类型 | 说明 |
---|---|---|
color | 整数型 | 将要找的十六进制颜色值 |
degree | 整数型 | 精度,范围:1 ~ 100,数值越大精度越高,100为完全比配 |
x1 | 整数型 | 欲寻找的区域左上角的X坐标 |
y1 | 整数型 | 欲寻找的区域左上角的y坐标 |
x2 | 整数型 | 欲寻找的区域右下角的X坐标 |
y2 | 整数型 | 欲寻找的区域右下角的X坐标 |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标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);
break; --并跳出循环
end
end
注意事项:
1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
函数:findMultiColorInRegionFuzzy() 多点区域模糊找色
函数说明 : 区域内寻找多个符合条件的点,支持模糊查找。
函数方法 : findMultiColorInRegionFuzzy(数组 table, 整数型 degree,整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2);
返回值 : 整数型 x, y
参数 | 类型 | 说明 |
---|---|---|
table | 数组 | 要找的颜色数组 |
degree | 整数型 | 精度,范围:1 ~ 100,数值越大精度越高,100为完全比配 |
x1 | 整数型 | 欲寻找的区域左上角的X坐标 |
y1 | 整数型 | 欲寻找的区域左上角的y坐标 |
x2 | 整数型 | 欲寻找的区域右下角的X坐标 |
y2 | 整数型 | 欲寻找的区域右下角的X坐标 |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标Y值,未找到返回 -1 |
示例
-- 在区域[(10,10)(200,200)]范围内以90%的精确度找一个满足以下条件的点:
-- 1. 其颜色为0x0000ff
-- 2. 其X坐标+10,Y坐标+20的坐标上的点颜色为0x00ff00
-- 3. 其X坐标-10,Y坐标-20的坐标上的点颜色为0xff0000
x, 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的像素的图片
10001
01010
00100
01010
10001
通过取1位置的颜色用9个像素点就可以建立一个叉的模型,甚至用5个坐标点就可以建立一个大致的模型
10001
00000
00100
00000
10001
假设第一个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
参数 | 类型 | 说明 |
---|---|---|
picpath | 文本型 | 要找的图片的路径, 只支持BMP格式 |
alpha | 整数型 | 指定图片中透明颜色(可不写) |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标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
参数 | 类型 | 说明 |
---|---|---|
picpath | 文本型 | 要找的图片的路径, 只支持BMP格式 |
degree | 整数型 | 精度,范围:1 ~ 100,数值越大精度越高,100为完全比配 |
alpha | 整数型 | 指定图片中透明颜色(可不写) |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标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
参数 | 类型 | 说明 |
---|---|---|
picpath | 文本型 | 要找的图片的路径, 只支持BMP格式 |
x1 | 整数型 | 欲寻找的区域左上角的X坐标 |
y1 | 整数型 | 欲寻找的区域左上角的y坐标 |
x2 | 整数型 | 欲寻找的区域右下角的X坐标 |
y2 | 整数型 | 欲寻找的区域右下角的X坐标 |
alpha | 整数型 | 指定图片中透明颜色(可不写) |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标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
参数 | 类型 | 说明 |
---|---|---|
picpath | 文本型 | 要找的图片的路径, 只支持BMP格式 |
degree | 整数型 | 精度,范围:1 ~ 100,数值越大精度越高,100为完全比配 |
x1 | 整数型 | 欲寻找的区域左上角的X坐标 |
y1 | 整数型 | 欲寻找的区域左上角的y坐标 |
x2 | 整数型 | 欲寻找的区域右下角的X坐标 |
y2 | 整数型 | 欲寻找的区域右下角的X坐标 |
alpha | 整数型 | 指定图片中透明颜色(可不写) |
返回值 | 类型 | 说明 |
---|---|---|
x | 整数型 | 找到的坐标X值,未找到返回 -1 |
y | 整数型 | 找到的坐标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);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
picpath | 文本型 | 保存截图的路径, 支持BMP格式和JPG格式, 根据文件名后缀智能判断 |
quality | 数字型 | 图片尺寸缩放百分比, 有效范围为10~100, 默认为100(可选) |
示例
snapshotScreen("/mnt/sdcard/a.bmp"); -- 将全屏截图保存到路径为"/mnt/sdcard/a.bmp"的图片中, 格式为BMP
snapshotScreen("/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);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
picpath | 文本型 | 保存截图的路径, 支持BMP格式和JPG格式, 根据文件名后缀智能判断 |
x1 | 整数型 | 截图区域左上角的X坐标 |
y1 | 整数型 | 截图区域左上角的y坐标 |
x2 | 整数型 | 截图区域右下角的X坐标 |
y2 | 整数型 | 截图区域右下角的X坐标 |
quality | 数字型 | 图片尺寸缩放百分比, 有效范围为10~100, 默认为100(可选) |
示例
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%
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语言包。
下载地址:http://pan.baidu.com/s/1kXYMb
下载后, 将解压后的tessdata目录复制到设备中
参数 | 类型 | 说明 |
---|---|---|
ocrpath | 文本型 | 语言包tessdata目录的路径 |
language | 文本型 | 语言类型 'eng' : 英文语言类型 'chi_sim' : 中文语言类型 |
x1 | 整数型 | 待识别图片区域的左上角X坐标 |
y1 | 整数型 | 待识别图片区域的左上角Y坐标 |
x2 | 整数型 | 待识别图片区域的右下角X坐标 |
y2 | 整数型 | 待识别图片区域的右下角Y坐标 |
list | 文本型 | 设置白名单, 只有白名单中的字符才会被识别(可选) |
返回值 | 类型 | 说明 |
---|---|---|
text | 文本型 | 图片识别后得到的答案, 失败的话返回空字符串 |
示例:识别中文
code = localOcrText("/mnt/sdcard/touchelf/tessdata", -- 语言包tessdata目录在设备中的路径
"chi_sim", -- 语言类型为中文
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/touchelf/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/touchelf/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
注意事项:
1,该函数对非正规字体识别欠佳,建议识别一些背景无杂色的英文和数字。
2,需要下载ocr语言包。
函数:cloudOcrInit() 选择远程代答平台
函数说明 : 选择远程代答平台。
函数方法 : cloudOcrInit(整数型 platform);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
platform | 整数型 | 远程代答平台ID, 默认为0 |
0 : 好爱答题 http://www.haoi23.net
1 : 打码兔答题 http://www.dama2.com
示例
cloudOcrInit(1); -- 设置远程代答平台为打码兔
注意事项:
1,使用好爱答题时可不写此函数。
2,由于好爱经常出问题,建议使用打码兔平台。
3,第一次使用打码兔请去打码兔后台设置触摸精灵为白名单。否则会默认为黑名单不能返回答案。
函数:cloudOcrText() 远程代答
函数说明 : 连接cloudOcrInit()选择的答题平台进行图片识别。
函数方法 : cloudOcrText(文本型 key,文本型 type,整数型 x1,整数型y1, 整数型 x2, 整数型 y2, 整数型 timeout);
返回值 : 文本型 code
参数 | 类型 | 说明 |
---|---|---|
key | 文本型 | 用户名及密码, 根据不同平台分别设置 |
type | 文本型 | 题目类型, 请前往选择的代答平台的官网查询 |
x1 | 整数型 | 待识别图片区域的左上角X坐标 |
y1 | 整数型 | 待识别图片区域的左上角Y坐标 |
x2 | 整数型 | 待识别图片区域的右下角X坐标 |
y2 | 整数型 | 待识别图片区域的右下角Y坐标 |
timeout | 整数型 | 超时时间, 范围为20-600秒 |
好爱答题key : 密码串(http://www.haoi23.net注册并登陆后, 在会员中心获取), 如username|9CF16235AD9EFBD3F233265DF9400E6A
打码兔答题key : 用户名|密码, 如username|password
返回值 | 类型 | 说明 |
---|---|---|
code | 文本型 | 图片识别后得到的答案, 失败的话返回空字符串 |
示例
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
函数:cloudOcrTextEx() 远程合并图片代答
函数说明 : 将参数中指定的任意个数的图片合并成一个图片后, 连接cloudOcrInit()选择的远程答题平台进行图片识别。
函数方法 : cloudOcrTextEx(文本型 key,文本型 type, 整数型 timeout,文本型 picpath1,文本型 picpath2,...,文本型 picpathn,);
返回值 : 文本型 code
参数 | 类型 | 说明 |
---|---|---|
key | 文本型 | 用户名及密码, 根据不同平台分别设置 |
type | 文本型 | 题目类型, 请前往选择的代答平台的官网查询 |
timeout | 整数型 | 超时时间, 范围为20-600秒 |
picpath1 | 文本型 | 待合并的第一个图片的路径 |
picpath2 | 文本型 | 待合并的第二个图片的路径 |
picpath... | 文本型 | 待合并的第...个图片的路径 |
picpathn | 文本型 | 待合并的第n个图片的路径 |
好爱答题key : 密码串(http://www.haoi23.net注册并登陆后, 在会员中心获取), 如username|9CF16235AD9EFBD3F233265DF9400E6A
打码兔答题key : 用户名|密码, 如username|password
返回值 | 类型 | 说明 |
---|---|---|
code | 文本型 | 图片识别后得到的答案, 失败的话返回空字符串 |
示例:合并三张图片进行远程识别
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", -- 题目类型为"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() 屏幕保持 缓存屏幕数据
函数说明 : 开启/关闭屏幕保持。
函数方法 : keepScreen(逻辑型 flag);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
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"
end
keepScreen(false); -- 关闭屏幕保持
注意事项:
1,当使用keepScreen(true);开启屏幕保持时, 后续的找图、找色等函数不会重新获取屏幕图像, 而是使用开启屏幕保持之前的屏幕图像,否则每次使用找图找色等函数都将截取一次屏幕内容。
2,当使用 keepScreen(false);关闭屏幕保持时, 后续的找图、找色等函数会每次都重新获取屏幕图像。
3,安卓版支持性能模式的设备不需要使用此函数。
4,苹果版和安卓兼容模式下使用此函数可显著提升找色速度。
流程图:
函数:rotateScreen() 旋转屏幕的坐标体系
函数说明 : 旋转屏幕的坐标体系, 后续的找图、找色、截图、触摸动作都会使用新的坐标体系
函数方法 : rotateScreen(整数型 Angle);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
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);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
text | 文本型 | 要粘贴的文字, 中英文都支持 |
示例
copyText("你好") -- 复制字符串“你好”到系统剪贴板
注意事项:
复制文字到系统剪贴板会覆盖以前复制的内容。
函数:clipText() 获取系统剪贴板内容
函数说明 : 获取系统剪贴板中之前复制或剪贴的文字内容。
函数方法 : clipText();
返回值 : 文本型 text
返回值 | 类型 | 说明 |
---|---|---|
text | 文本型 | 剪贴板内的文字 |
示例
text = clipText() -- 将之前复制或剪贴的文字读取到变量text中
inputText(text) --在输入框中输入获取到的字符串
函数:inputText() 输入字符串
函数说明 : 在文本框内输入文本。
函数方法 : inputText(文本型 string);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
string | 文本型 | 要输入的字符串, 其中\b字符可用于退格删除 |
示例
inputText("你好Hello"); -- 在当前选中的文字输入框中输入字符串"你好Hello"
inputText("\b\b\b\b\b"); -- 退格删除5个字符
注意事项:
1,使用该函数前,先点击输入框,例如点击用户名,再执行该函数。
2,建议切换到系统输入法再使用该函数。
3,\b字符可用于删除一个字符。
函数:appRun() 打开,运行指定软件
函数说明 : 打开,运行指定软件。
函数方法 : appRun(文本型 string);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
string | 文本型 | 想要打开的软件的包名 |
示例
appRun("com.android.browser"); -- 打开系统自带浏览器
注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:appRunning() 判断指定应用是否正在运行
函数说明 : 判断指定应用是否正在运行。
函数方法 : appRunning(文本型 string);
返回值 : 布尔值 flag
参数 | 类型 | 说明 |
---|---|---|
string | 文本型 | 想要检测的软件的包名 |
参数 | 类型 | 说明 |
---|---|---|
flag | 布尔值 | 返回true或者false |
示例
if appRunning("com.android.browser") then
notifyMessage("yes");
else
notifyMessage("no");
end
注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:appKill() 关闭指定软件
函数说明 : 关闭指定软件。
函数方法 : appKill(文本型 string);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
string | 文本型 | 想要关闭的软件的包名 |
示例
appKill("com.android.browser"); -- 关闭系统自带浏览器
示例
--遇到某些应用一次关不掉的话可用下面的方法
function kill_app(app_package)
while true do
if appRunning(app_package) then
appKill(app_package);
mSleep(1000);
else
return true;
end
end
end
---调用方法
kill_app("com.android.browser"); -- 关闭系统自带浏览器
注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:httpGet() HTTP协议访问
函数说明 : HTTP协议访问。
函数方法 : httpGet(文本型 string);
返回值 : 文本型 data
参数 | 类型 | 说明 |
---|---|---|
string | 文本型 | 网址URL |
返回值 | 类型 | 说明 |
---|---|---|
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
参数 | 类型 | 说明 |
---|---|---|
url | 文本型 | 远程文件地址 |
file | 文本型 | 本地文件路径 |
ftpuser | 文本型 | FTP服务器用户名 |
ftppass | 文本型 | FTP服务器密码 |
返回值 | 类型 | 说明 |
---|---|---|
flag | 布尔值 | 返回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.txt
if flag then
notifyMessage("下载成功")
else
notifyMessage("下载失败")
end
函数:ftpPut() ftp上传
函数说明 : ftp上传。
函数方法 : ftpPut(文本型 url,文本型 file,文本型 ftpuser,文本型 ftppass);
返回值 : 布尔值 flag
参数 | 类型 | 说明 |
---|---|---|
url | 文本型 | 远程文件地址 |
file | 文本型 | 本地文件路径 |
ftpuser | 文本型 | FTP服务器用户名 |
ftppass | 文本型 | FTP服务器密码 |
返回值 | 类型 | 说明 |
---|---|---|
flag | 布尔值 | 返回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
参数 | 类型 | 说明 |
---|---|---|
package | 文本型 | 想要读取的软件的包名 |
address | 整数型 | 想要读取的内存地址 |
type | 文本型 | 想要读取内存的类型,支持的类型如下 |
I8: 有符号的8位整数
I16: 有符号的16位整数
I32: 有符号的32位整数
I64: 有符号的64位整数
U8: 无符号的8位整数
U16: 无符号的16位整数
U32: 无符号的32位整数
U64: 无符号的64位整数
F32: 有符号的32位浮点数
F64: 有符号的64位浮点数
返回值 | 类型 | 说明 |
---|---|---|
flag | 布尔值 | 返回true或者false |
data | 整数型 | 读取到的数据, 仅当返回值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
参数 | 类型 | 说明 |
---|---|---|
package | 文本型 | 想要写入的软件的包名 |
address | 整数型 | 想要写入的内存地址 |
type | 文本型 | 想要写入内存的类型,支持的类型如下 |
I8: 有符号的8位整数
I16: 有符号的16位整数
I32: 有符号的32位整数
I64: 有符号的64位整数
U8: 无符号的8位整数
U16: 无符号的16位整数
U32: 无符号的32位整数
U64: 无符号的64位整数
F32: 有符号的32位浮点数
F64: 有符号的64位浮点数
返回值 | 类型 | 说明 |
---|---|---|
flag | 布尔值 | 返回true或者false |
示例
flag = memoryWrite("com.test.test", 0x1000000, "U32", 0x12345678); -- 将无符号32位整数0x12345678写入到包名为com.test.test的应用内存地址为0x1000000处
if flag then
notifyMessage("写入成功")
end
注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:memorySearch() 搜索指定应用的内存
函数说明 : 搜索指定应用的内存,支持联合搜素,支持在上一次的搜索结果上再次搜索过滤。
函数方法 : memorySearch(文本型 package,布尔值 flag,数组 data);
返回值 : 数组 array
参数 | 类型 | 说明 |
---|---|---|
package | 文本型 | 想要搜索的软件的包名 |
flag | 布尔值 | true表示进行新的搜索,false表示再上一次搜索的结果上再次进行搜索过滤 |
data | 数组 | 想要搜索的内容,数组长度最多支持128个,格式为: { 数据1, 数据2相对于数据1的位置, 数据2, 数据3相对于数据1的位置, 数据3, ... } |
返回值 | 类型 | 说明 |
---|---|---|
array | 数组 | 搜索到内存地址数组, 地址为数据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 | 整数型 | 获取到的当前屏幕高度 |
示例
width, height = getScreenResolution(); -- 将屏幕宽度和高度分别保存在变量w、h中
notifyMessage(string.format("%d,%d\n", width, height)); -- 将宽度和高度用提示框显示到屏幕上
--脚本判断使用的机器是否是iphone5
if width == 640 and height == 1136 then
notifyMessage("当前设备为iphone5")
else
notifyMessage("请在iphone5上使用本程序")
end
函数:getScreenColorBits() 获取当前屏幕色彩位数
函数说明 : 获取当前屏幕色彩位数。
函数方法 : getScreenColorBits();
返回值 : 整数型 color
返回值 | 类型 | 说明 |
---|---|---|
color | 整数型 | 色彩位数 |
示例
color = getScreenColorBits(); -- 将屏幕色彩位数保存在变量color中
notifyMessage(string.format("%d\n", color)); -- 将色彩位数用提示框显示到屏幕上
函数:getDeviceID() 获取设备串号
函数说明 : 获取设备串号。
函数方法 : getDeviceID();
返回值 : 文本型 deviceID
返回值 | 类型 | 说明 |
---|---|---|
deviceID | 文本型 | 返回的设备串号 |
示例
deviceID = getDeviceID(); -- 将设备ID保存到deviceID变量中
-------------------------授权一台设备-------------------------
if deviceID == "Fd452dg2421" then
notifyMessage("当前设备已授权");
else
notifyMessage("当前设备未授权");
os.exit() --结束脚本
end
-------------------------授权多台设备---------------------------------
local deviceID_flag = false; --定义当前设备未授权
deviceID_arr = {"F123456","F1234567","F12345678"};--可使用设备数组
for i = 1,#deviceID_arr do --循环数组长度
if deviceID == deviceID_arr[i] then--判断当前设备序列号是否和设备数组中的相同
deviceID_flag = true;--定义当前设备已授权
break; --跳出循环
end
end
if deviceID_flag then
notifyMessage("当前设备已授权");
else
notifyMessage("当前设备未授权");
os.exit(); --结束脚本
end
注意事项:
1,使用该函数 苹果设备返回的是序列号,安卓设备返回的是mac 。
2,os.exit() 为结束脚本函数。
函数:getNetTime() 获取网络时间
函数说明 : 获取网络时间。
函数方法 : getNetTime();
返回值 : 整数型 time
返回值 | 类型 | 说明 |
---|---|---|
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("当前时间超过了2013年2月15日12点30分");
end
else
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时间1970年1月1日0时0分0秒到现在流逝的秒数, 可以配合os.date()转换成方便阅读的格式。返回-1表示不能连接网络时间服务器
函数:getVersion() 获取当前触摸精灵版本号
函数说明 : 获取当前触摸精灵版本号。
函数方法 : getVersion();
返回值 : 文本型 version
返回值 | 类型 | 说明 |
---|---|---|
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);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
package | 文本型 | 要伪装GPS地理位置的软件的包名 |
x | 浮点型 | 纬度,和第三个参数同时为0的时候表示取消该应用的伪装 |
y | 浮点型 | 经度,和第二个参数同时为0的时候表示取消该应用的伪装 |
示例
fakeGPS("com.baidu.map", 40.0234512958, 116.2185668045); -- 将百度地图的GPS地理位置伪装为指定纬度和经度
fakeGPS("com.tencent.xin", 0, 0); -- 取消对百度地图的GPS地理位置伪装
注意事项:
调用该函数伪装地理位置以后,脚本停止以后伪装不会取消,直到使用该函数取消指定 应用的伪装,或执行『触摸精灵-设置-清除GPS伪装』清除设备所有伪装
函数:appBundlePath() 获取指定应用的主程序目录的路径(苹果专用)
函数说明 : 获取指定应用的主程序目录的路径。
函数方法 : appBundlePath(文本型 package);
返回值 : 文本型 path
参数 | 类型 | 说明 |
---|---|---|
package | 文本型 | 应用的包名 |
返回值 | 类型 | 说明 |
---|---|---|
path | 文本型 | 主程序目录的路径 |
示例
path = appBundlePath("com.tencent.xin")
if path ~= "" then
notifyMessage(path);
else
notifyMessage("no");
end
注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:appDataPath() 获取指定应用的数据目录的路径(苹果专用)
函数说明 : 获取指定应用的数据目录的路径。
函数方法 : appDataPath(文本型 package);
返回值 : 文本型 path
参数 | 类型 | 说明 |
---|---|---|
package | 文本型 | 应用的包名 |
返回值 | 类型 | 说明 |
---|---|---|
path | 文本型 | 数据目录的路径 |
示例
path = appDataPath("com.tencent.xin")
if path ~= "" then
notifyMessage(path);
else
notifyMessage("no");
end
注意事项:
应用包名可以触摸精灵设置--查询已安装应用包名中查看。
函数:setControlBarPosition() 设置播放控制条位置(安卓专用)
函数说明 : 获取指定应用的数据目录的路径。
函数方法 : setControlBarPosition(整数型 x,整数型 y);
返回值 : 无
参数 | 类型 | 说明 |
---|---|---|
x | 整数型 | 播放控制条X坐标 |
y | 整数型 | 播放控制条Y坐标 |
示例
setControlBarPosition(100, 100) -- 将播放控制条移动到坐标(100, 100)处
教程
触摸精灵找图脚本的详细制作过程
1.截取全屏图片
- 将电脑和手机连接到同一个路由器下,使2者处于同一个子网中,假设电脑的IP为192.168.1.6,手机的IP为192.168.1.7
- 在电脑上运行『触摸精灵编辑器』 执行『菜单-图像-触摸抓抓』 点击『远程截图』,输入手机的IP:192.168.1.7(见图1)
- 等待处理完成便获取到了手机的当前屏幕截图(见图2)
图1:
图2:
2.扣取要找的图片
- 点击『图片裁剪』
- 按下鼠标左键并拖动来选取要扣取的图片(见图3)
- 将扣取的图片保存到电脑,起名为phone.bmp(见图4)
图3:
图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
else -- 否则,如果没找到
notifyMessage("no") -- 显示no
end
end
将上述代码保存为脚本,然后在存在电话图标的界面播放时,会点击该图标后,显示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));
end
return table.concat(t, "");
end
function 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();
end
require与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);
end
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); -- 手指抬起
else -- 否则,也就是x和y有一个是-1的话,说明没找到
notifyMessage("没有找到"); -- 显示消息
end
end
4.横屏游戏如何编写呢
手游基本是横屏的,默认情况下,触摸精灵的坐标体系不会随着屏幕画面改变的,例如,我们在横屏游戏中播放上述的截图脚本,获取到的图片是这样的:
我们可以看到,截图还是竖着的,而且这时候坐标体系也没有改变的,如果我们想点击“人物头像”,使用以前Photoshop信息面板查看的方法,可以看到“人物头像”的坐标是(720,65),那么脚本如下:
function main()
touchDown(0, 720, 65); -- 手指按下人物头像的位置,第一个参数0是手指ID,这个在多点触摸时会用到。
touchUp(0); -- 手指抬起
end
那么我们想找图点击呢,这时候我们需要找图的是这样的:
就像上面的图片,我们要找的图也必须是从竖着的图片上扣取下了的。
5.横屏游戏如何更容易的编写呢
通过第4讲里的说明,我们可以看到触摸精灵默认的坐标体系对于编写横屏游戏来说不太友好,因为我们可能想要这样的坐标体系:
我们想要上面图片中的左上角是(0,0),右上角是(0,1024),左下角是(0, 768),右下角是(1024,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); -- 手指抬起
else -- 否则,也就是x和y有一个是-1的话,说明没找到
notifyMessage("没有找到"); -- 显示消息
end
end
end
不建议使用第5种方案编写脚本。
"os.execute"的相关应用
--注销
os.execute("killall -9 SpringBoard");
--关机
os.execute("halt");
--重启
os.execute("reboot");
--清除缓存
os.execute("su mobile -c uicache");
--安装apk
os.execute("pm install /路径/文件名.apk");
--卸载apk
os.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()) --显示文件所有者
end
if f:chmod(777) then --改变文件权限
notifyMessage(f:chmod()) --显示文件权限
end
notifyMessage(f:time()) --显示文件修改时间
end
function io.file(path)
local _={}
function _:chmod(mode)
if mode then
return os.execute("chmod "..mode.." "..path)
else
return string.sub(io.popen("ls -l "..path):read("*l"),2,10)
end
end
function _:chown(mode)
if mode then
return os.execute("chown "..mode.." "..path)
else
return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",2).."([^ ]+)")
end
end
function _:size()
return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",4).."([^ ]+)")
end
function _:time()
return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",5).."("..string.rep("[^ ]+[ ]+",3)..")")
end
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)
end
file:close();--关闭默认的输出文件
return _list
end
end
list = 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");
else
notifyMessage("No");
end
"string库"的相关应用
基本函数
函数 | 描述 | 示例 | 结果 |
---|---|---|---|
len | 计算字符串长度 | string.len("abcd") | 4 |
rep | 返回字符串s的n个拷贝 | string.rep("abcd",2) | abcdabcd |
lower | 返回字符串全部字母大写 | string.lower("AbcD") | abcd |
upper | 返回字符串全部字母小写 | string.upper("AbcD") | ABCD |
format | 格式化字符串 | string.format("the value is:%d",4) | the value is:4 |
sub | 从字符串里截取字符串 | string.sub("abcd",2) | bcd |
string.sub("abcd",-2) | cd | ||
string.sub("abcd",2,-2) | bc | ||
string.sub("abcd",2,3) | bc | ||
find | 在字符串中查找(显示位置) | string.find("cdcdcdcd","ab") | nil |
string.find("cdcdcdcd","cd") | 1 2 | ||
string.find("cdcdcdcd","cd",7) | 7 8 | ||
match | 在字符串中查找(显示内容) | string.match("cdcdcdcd","ab") | nil |
string.match("cdcdcdcd","cd") | cd | ||
gsub | 在字符串中替换 | string.gsub("abcdabcd","a","z"); | zbcdzbcd 2 |
string.gsub("aaaa","a","z",3); | zzza 3 | ||
byte | 返回字符的整数形式 | string.byte("ABCD",4) | 68 |
char | 将整型数字转成字符并连接 | string.char(97,98,99,100) | abcd |
基本模式串
字符类 | 描述 | 示例 | 结果 |
---|---|---|---|
. | 任意字符 | string.find("",".") | nil |
%s | 空白符 | string.find("ab cd","%s%s") | 3 4 |
%S | 非空白符 | string.find("ab cd","%S%S") | 1 2 |
%p | 标点字符 | string.find("ab,.cd","%p%p") | 3 4 |
%P | 非标点字符 | string.find("ab,.cd","%P%P") | 1 2 |
%c | 控制字符 | string.find("abcd\t\n","%c%c") | 5 6 |
%C | 非控制字符 | string.find("\t\nabcd","%C%C") | 3 4 |
%d | 数字 | string.find("abcd12","%d%d") | 5 6 |
%D | 非数字 | string.find("12abcd","%D%D") | 3 4 |
%x | 十六进制数字 | string.find("efgh","%x%x") | 1 2 |
%X | 非十六进制数字 | string.find("efgh","%X%X") | 3 4 |
%a | 字母 | string.find("AB12","%a%a") | 1 2 |
%A | 非字母 | string.find("AB12","%A%A") | 3 4 |
%l | 小写字母 | string.find("ABab","%l%l") | 3 4 |
%L | 大写字母 | string.find("ABab","%L%L") | 1 2 |
%u | 大写字母 | string.find("ABab","%u%u") | 1 2 |
%U | 非大写字母 | string.find("ABab","%U%U") | 3 4 |
%w | 字母和数字 | string.find("a1()","%w%w") | 1 2 |
%W | 非字母非数字 | string.find("a1()","%W%W") | 3 4 |
转义字符%
字符类 | 描述 | 示例 | 结果 |
---|---|---|---|
% | 转义字符 | string.find("abc%..","%%") | 4 4 |
string.find("abc..d","%.%.") | 4 5 |
用[]创建字符集,"-"为连字符,"^"表示字符集的补集
字符类 | 描述 | 示例 | 结果 |
---|---|---|---|
[01] | 匹配二进制数 | string.find("32123","[01]") | 3 3 |
[AB][CD] | 匹配AC、AD、BC、BD | string.find("ABCDEF","[AB][CD]") | 2 3 |
[[]] | 匹配一对方括号[] | string.find("ABC[]D","[[]]") | 4 5 |
[1-3] | 匹配数字1-3 | string.find("312","[1-3][1-3][1-3]") | 1 3 |
[b-d] | 匹配字母b-d | string.find("dbc","[b-d][b-d][b-d]") | 1 3 |
[^%s] | 匹配任意非空字符 | string.find(" a ","[^%s]") | 3 3 |
[^%d] | 匹配任意非数字字符 | string.find("123a","[^%d]") | 4 4 |
[^%a] | 匹配任意非字母字符 | string.find("abc1","[^%a]") | 4 4 |
用"()"进行捕获
字符类 | 描述 | 示例 | 结果 |
---|---|---|---|
() | 捕获字符串 | string.find("12ab","(%a%a)") | 3 4 ab |
string.find("ab12","(%d%d)") | 3 4 12 |
模式修饰符
修饰符 | 描述 | 示例 | 结果 |
---|---|---|---|
+ | 表示1个或多个,匹配最多个 | string.find("aaabbb","(a+b)") | 1 4 aaab |
string.find("cccbbb","(a+b)") | nil | ||
- | 表示0个或多个,匹配最少个 | string.find("zzxyyy","(xy-)") | 3 3 x |
string.find("zzzyyy","(x-y)") | 4 4 y | ||
* | 表示0个或多个,匹配最多个 | string.find("mmmnnn","(m*n)") | 1 4 mmmb |
string.find("lllnnn","(m*n)") | 4 4 n | ||
? | 表示0个或1个 | string.find("aaabbb","(a?b)") | 3 4 ab |
string.find("cccbbb","(a?b)") | 4 4 b |
match的常见用法
描述 | 示例 | 结果 |
---|---|---|
匹配中文 | string.match("男女abc123","([^%w%p]+)") | 男女 |
匹配英文 | string.match("男女abc123","(%a+)") | abc |
匹配数字 | string.match("男女abc123","(%d+)") | 123 |
匹配英文和数字 | string.match("男女abc123","(%w+)") | abc123 |
"math库"的相关应用
函数名 | 描述 | 示例 | 结果 |
---|---|---|---|
pi | 圆周率 | math.pi | 3.1415926535898 |
abs | 取绝对值 | math.abs(-2012) | 2012 |
ceil | 向上取整 | math.ceil(9.1) | 10 |
floor | 向下取整 | math.floor(9.9) | 9 |
max | 取参数最大值 | math.max(2,4,6,8) | 8 |
min | 取参数最小值 | math.min(2,4,6,8) | 2 |
pow | 计算x的y次幂 | math.pow(2,16) | 65536 |
sqrt | 开平方 | math.sqrt(65536) | 256 |
mod | 取模 | math.mod(65535,2) | 1 |
modf | 取整数和小数部分 | math.modf(20.12) | 20 0.12 |
randomseed | 设随机数种子 | math.randomseed(os.time()) | |
random | 取随机数 | math.random(5,90) | 5~90 |
rad | 角度转弧度 | math.rad(180) | 3.1415926535898 |
deg | 弧度转角度 | math.deg(math.pi) | 180 |
exp | e的x次方 | math.exp(4) | 54.598150033144 |
log | 计算x的自然对数 | math.log(54.598150033144) | 4 |
log10 | 计算10为底,x的对数 | math.log10(1000) | 3 |
frexp | 将参数拆成x * (2 ^ y)的形式 | math.frexp(160) | 0.625 8 |
ldexp | 计算x * (2 ^ y) | math.ldexp(0.625,8) | 160 |
sin | 正弦 | math.sin(math.rad(30)) | 0.5 |
cos | 余弦 | math.cos(math.rad(60)) | 0.5 |
tan | 正切 | math.tan(math.rad(45)) | 1 |
asin | 反正弦 | math.deg(math.asin(0.5)) | 30 |
acos | 反余弦 | math.deg(math.acos(0.5)) | 60 |
atan | 反正切 | math.deg(math.atan(1)) | 45 |
触摸精灵使用cURL命令
安卓系下载cURL模块:http://yunpan.cn/cHstaJHupAj5u 访问密码 37b7
将cURL模块放入/system/bin/内
IOS系统Cydia内搜索并下载安装cURL软件。
完成上述内容即可使用cURL命令
--下载脚本
os.execute("curl -o /var/touchelf/scripts/evan.lua.E2 http://www.touchel.com/evan.lua.E2")
--post命令
os.execute("curl -d 'user=evan&password=12345' http://www.touchelf.com/login.php")
更多cURL命令请自行百度。
触摸精灵模拟物理按键的方法
====================
1. 模拟物理按键
====================
os.execute("input keyevent 按键键码")
列子:
按下home键
os.execute("input keyevent 3")
打电话给10086
os.execute("input keyevent 5") --按拨号键
os.execute("input text \"10086\"") --输入10086
os.execute("input keyevent 5") --按拨号键打通
以下就是约定的按键键码:
AKEYCODE_UNKNOWN = 0,
AKEYCODE_SOFT_LEFT = 1,
AKEYCODE_SOFT_RIGHT = 2,
AKEYCODE_HOME = 3,
AKEYCODE_BACK = 4,
AKEYCODE_CALL = 5,
AKEYCODE_ENDCALL = 6,
AKEYCODE_0 = 7,
AKEYCODE_1 = 8,
AKEYCODE_2 = 9,
AKEYCODE_3 = 10,
AKEYCODE_4 = 11,
AKEYCODE_5 = 12,
AKEYCODE_6 = 13,
AKEYCODE_7 = 14,
AKEYCODE_8 = 15,
AKEYCODE_9 = 16,
AKEYCODE_STAR = 17,
AKEYCODE_POUND = 18,
AKEYCODE_DPAD_UP = 19,
AKEYCODE_DPAD_DOWN = 20,
AKEYCODE_DPAD_LEFT = 21,
AKEYCODE_DPAD_RIGHT = 22,
AKEYCODE_DPAD_CENTER = 23,
AKEYCODE_VOLUME_UP = 24,
AKEYCODE_VOLUME_DOWN = 25,
AKEYCODE_POWER = 26,
AKEYCODE_CAMERA = 27,
AKEYCODE_CLEAR = 28,
AKEYCODE_A = 29,
AKEYCODE_B = 30,
AKEYCODE_C = 31,
AKEYCODE_D = 32,
AKEYCODE_E = 33,
AKEYCODE_F = 34,
AKEYCODE_G = 35,
AKEYCODE_H = 36,
AKEYCODE_I = 37,
AKEYCODE_J = 38,
AKEYCODE_K = 39,
AKEYCODE_L = 40,
AKEYCODE_M = 41,
AKEYCODE_N = 42,
AKEYCODE_O = 43,
AKEYCODE_P = 44,
AKEYCODE_Q = 45,
AKEYCODE_R = 46,
AKEYCODE_S = 47,
AKEYCODE_T = 48,
AKEYCODE_U = 49,
AKEYCODE_V = 50,
AKEYCODE_W = 51,
AKEYCODE_X = 52,
AKEYCODE_Y = 53,
AKEYCODE_Z = 54,
AKEYCODE_COMMA = 55,
AKEYCODE_PERIOD = 56,
AKEYCODE_ALT_LEFT = 57,
AKEYCODE_ALT_RIGHT = 58,
AKEYCODE_SHIFT_LEFT = 59,
AKEYCODE_SHIFT_RIGHT = 60,
AKEYCODE_TAB = 61,
AKEYCODE_SPACE = 62,
AKEYCODE_SYM = 63,
AKEYCODE_EXPLORER = 64,
AKEYCODE_ENVELOPE = 65,
AKEYCODE_ENTER = 66,
AKEYCODE_DEL = 67,
AKEYCODE_GRAVE = 68,
AKEYCODE_MINUS = 69,
AKEYCODE_EQUALS = 70,
AKEYCODE_LEFT_BRACKET = 71,
AKEYCODE_RIGHT_BRACKET = 72,
AKEYCODE_BACKSLASH = 73,
AKEYCODE_SEMICOLON = 74,
AKEYCODE_APOSTROPHE = 75,
AKEYCODE_SLASH = 76,
AKEYCODE_AT = 77,
AKEYCODE_NUM = 78,
AKEYCODE_HEADSETHOOK = 79,
AKEYCODE_FOCUS = 80, // *Camera* focus
AKEYCODE_PLUS = 81,
AKEYCODE_MENU = 82,
AKEYCODE_NOTIFICATION = 83,
AKEYCODE_SEARCH = 84,
AKEYCODE_MEDIA_PLAY_PAUSE= 85,
AKEYCODE_MEDIA_STOP = 86,
AKEYCODE_MEDIA_NEXT = 87,
AKEYCODE_MEDIA_PREVIOUS = 88,
AKEYCODE_MEDIA_REWIND = 89,
AKEYCODE_MEDIA_FAST_FORWARD = 90,
AKEYCODE_MUTE = 91,
AKEYCODE_PAGE_UP = 92,
AKEYCODE_PAGE_DOWN = 93,
AKEYCODE_PICTSYMBOLS = 94,
AKEYCODE_SWITCH_CHARSET = 95,
AKEYCODE_BUTTON_A = 96,
AKEYCODE_BUTTON_B = 97,
AKEYCODE_BUTTON_C = 98,
AKEYCODE_BUTTON_X = 99,
AKEYCODE_BUTTON_Y = 100,
AKEYCODE_BUTTON_Z = 101,
AKEYCODE_BUTTON_L1 = 102,
AKEYCODE_BUTTON_R1 = 103,
AKEYCODE_BUTTON_L2 = 104,
AKEYCODE_BUTTON_R2 = 105,
AKEYCODE_BUTTON_THUMBL = 106,
AKEYCODE_BUTTON_THUMBR = 107,
AKEYCODE_BUTTON_START = 108,
AKEYCODE_BUTTON_SELECT = 109,
AKEYCODE_BUTTON_MODE = 110,
触摸精灵安卓启动APK直达某些页面的方法
os.execute("am start -n {包(package)名} / {包名}.{活动(activity)名称}")
包名package和活动activity名称可以反编译apk后,在每个apk的AndroidManifest.xml里面查看。
示例:
启动计算器
os.execute("am start -n com.android.calculator2/com.android.calculator2.Calculator")
AlarmClock(闹钟)的启动方法为:
os.execute("am start -n com.android.alarmclock/com.android.alarmclock.AlarmClock")
启动浏览器 :
os.execute("am start -a android.intent.action.VIEW -d http://www.google.cn/ ")
拨打电话给10086 :
os.execute("am start -a android.intent.action.CALL -d tel:10086")
启动 google map 直接定位到北京 :
os.execute("am start -a android.intent.action.VIEW geo:0,0?q=beijing")