[关闭]
@touchelf 2019-07-16T14:28:02.000000Z 字数 52005 阅读 697794

触摸精灵开发手册

触摸精灵 安卓 苹果 android ios


目录

前言

  感谢您选择触摸精灵这款软件。触摸精灵是一款可以帮您自动化操作手机或平板设备的软件,它可以帮助您执行任何指定的动作,无论是在游戏中还是在日常工作中,都可以告别之前繁琐的手动## 标题 ##操作,尽情享受自动化带来的乐趣!
  
  触摸精灵简单、易用,通过录制功能不需要任何编程基础就可以录制出功能强大的脚本,还可通过编程制作出功能更为复杂,使用更为灵活的脚本。从这一刻起让触摸精灵帮您放飞双手,享受生活!

  触摸精灵脚本使用 Lua 语言进行编写,支持 Lua 5.2.3 版本的所有语法与基本函数,配合触摸精灵特有的函数,实现找图、找色、触摸等高级功能。
  
  编写脚本前请先学习 lua 的基本语法。
  Lua官方手册:http://www.lua.org/manual/5.2/
  Lua中文开发手册:http://book.luaer.cn/
  
  编写触摸精灵脚本需注意文本编码须使用 UTF-8 格式,否则中文将会显示乱码。
  


安装触摸精灵

ios 苹果 版本安装

通过Cydia源安装

1.确保您的设备已经越狱,点击桌面Cydia软件

489e6072b56d31c8t.jpg-21.9kB

2.点击Cydia软件界面的"软件源"按钮

015d26d6997a807bt.jpg-31.2kB

3.点击软件源界面右上角的"编辑"按钮

921b29a6ad883c8et.jpg-30.4kB

4.点击编辑后,左上角的"取消"按钮会变成"添加"

4e3825197d6cec1et.jpg-30.2kB

5.点 "添加"按钮,在弹出窗口输入触摸精灵官方源地址:cydia.touchelf.com

0e1a1b57b84c8cb6t.jpg-33.6kB

6.等待源添加完成

cf9812ad226e4eaet.jpg-25.4kB

7.添加完成后回到Cydia的"软件源"界面,找到刚添加好的触摸精灵官方源,点击进入

e0c5109ff3f82059t.jpg-31.6kB

8.在"分类"列表中点击"全部软件包"

780db1ddf2b64f8bt.jpg-15.3kB

9.选择"触摸精灵",点击进入"详情"界面

0fd2cadb880eebaet.jpg-14.2kB

10.进入"详情"界面后点击右上角"安装"并在确认界面点击"确认",等待软件安装完毕。

d487c47a52d1436ct.jpg-38.6kB

9c2dff704530f7eat.jpg-11.8kB

11.安装完成后点击屏幕下方的 "重启SpringBoard" 按钮,等待设备重启完毕后,就可以在桌面见到触摸精灵软件图标了。

480845f5c9d70f25t.jpg-26.3kB

deb文件安装

首先确保您的IOS已经越狱

1.下载并安装第三方管理工具(pp助手,iFunbox等),下载好触摸精灵deb文件。这里以pp助手为例

9df6c7e4b0fa8a65t.jpg-5kB

2.将手机通过数据链连接电脑

e6d060efbcddc700.jpg-229.4kB

3.打开文件 - Cydia安装目录

fca33281f88124af.jpg-160.7kB

4.将下载好的deb文件拖入/导入该目录

6351b38b623335e0.jpg-152kB

5.重启手机两次即可自动安装。

android 安卓 版本安装

首先确保您的安卓设备已经ROOT

1.下载并安装第三方管理工具(360手机助手,iTools等),这里以360手机助手为例

accc41319a5250e3.jpg-9.1kB

2.下载触摸精灵安卓软件,下载地址:http://pan.baidu.com/s/1kTtCqTT

d8c441bc75f5cc69t.jpg-3.4kB

3.将手机通过数据链连接电脑,开打360手机助手,确认手机和电脑已连接。

6830c04ed6477c68.jpg-157.8kB

4.打开文件 - SD卡目录,为了方便安装,我们将APK文件直接放入SD卡根目录(将文件直接拖入右边即可)

2b7be1cd651c9ec7.jpg-215.2kB

5.手机打开文件管理类软件,这里以RE管理器为例

bb91e4b411696a24.jpg-7.8kB

6.点击sdcard目录,找到刚才拷贝到sdcard目录内的apk文件,点击apk文件,点击"安装"

b66fb15ad530d94a.jpg-113.1kB

7.等待程序安装完成即可。

注意:不要在电脑上直接点击apk文件进行安装。


相关工具

触摸精灵PC端脚本编辑器】
下载地址:http://ide.touchelf.com

1.软件同时支持安卓版和苹果版触摸精灵。
2.支持项目管理,与最新版本触摸精灵的脚本目录结构保持一致
3.支持局域网设备扫描,提供设备的远程管理,包括远程文件管理、查看远程日志、远程截图、远程重启等操作
4.支持项目、文件的远程发送、远程运行、远程调试
5.集成最新版本触摸抓抓,提供强大图片处理功能


基本功能使用

ios 苹果版

脚本存放路径:/var/touchelf/scripts/

1.录制

1.点击底部导航栏切换到“列表”界面
2.单击左上角的“新建”按钮, 在弹出的菜单中选择“录制”
3.在弹出的对话框中填写脚本名称, 然后点击“确定”按钮
4.切换到手机的任意界面, 按下音量键开始录制
5.做一些你想要录制的触摸动作
6.再次按下音量键停止录制

2.播放

1.点击底部导航栏切换到“列表”界面
2.单击想要播放的脚本
3.在弹出的对话框中设置播放参数, 然后选择“手动播放”或者“定时播放”
4.切换到手机的任意界面。如果选择的“手动播放”, 那么需要手动按下音量键开始播放; 如果选择的“定时播放”, 脚本会在设定的时间自动播放
5.脚本在播放完毕后会自动停止, 或在播放过程中再次按下音量键停止播放

3.关闭后台服务

1.当选择播放某个脚本之后,每次按下音量键都会提示是否播放该脚本,如果想完全关闭该脚本的播放后台服务,那么在音量键弹出的对话框中选择『取消』即可
2.如果按下音量键后没有提示对话框而是直接开始播放,这是由于关闭了『播放提示』选项,请在触摸精灵的设置中开启

4.编辑

1.点击底部导航栏切换到“列表”界面
2.单击想要编辑的脚本右侧的蓝色箭头”
3.在弹出的界面中直接编辑脚本文件
4.点击“保存”按钮保存脚本文件

5.注册

1.登录http://aisence.taobao.com, 按照里面的购买流程注册
2.点击“触摸精灵”的“设置”中的“序列号激活”, 输入淘宝获取到的序列号, 点击“激活”按钮
3.软件将自动下载注册文件到/var/touchelf/key, 重新进入“注册状态”, 显示已注册和“有效期”则成功

android 安卓版

脚本存放路径:/mnt/sdcard/touchelf/scripts/

1.录制

1.点击底部导航栏切换到“脚本列表”界面
2.点击标题栏左侧的“+”(新建)按钮
3.在弹出的菜单中选择“录制脚本”
4.在弹出的对话框中输入想要录制的脚本的名称, 然后点击“确定”按钮
5.阅读弹出的对话框中的说明, 然后点击“确定”按钮
6.切换到手机的任意界面, 按下热键开始录制(在使用控制条时按下控制条“录制”按钮开始录制)
7.再次按下热键停止录制(在使用控制条时按下控制条“停止”按钮停止录制)

2.播放

1.点击底部导航栏切换到“脚本列表”界面
2.单击想要播放的脚本, 或者长按想要播放的脚本, 在弹出的菜单中选择“播放”
3.在弹出的对话框中设置播放参数, 然后选择“手动播放”或者“定时播放”
4.切换到手机的任意界面。如果选择的“手动播放”, 那么需要手动按下热键开始播放(在使用控制条时按下控制条“播放”按钮开始播放); 如果选择的“定时播放”, 脚本会在设定的时间自动播放
5.脚本在播放完毕后会自动停止, 或在播放过程中再次按下热键停止播放(在使用控制条时按下控制条“停止”按钮停止播放, 按下“暂停”按钮暂停播放, 按下“退出”按钮退出此次播放)

3.编辑

1.点击底部导航栏切换到“脚本列表”界面
2.长按脚本, 在弹出的菜单中选择“编辑”
3.在弹出的界面中直接编辑脚本文件
4.点击“保存”按钮保存脚本文件, 点击“退出”按钮退出编辑界面

4.导入

1.点击底部导航栏切换到“脚本列表”界面
2.点击标题栏左侧的“+”(新建)按钮
3.在弹出的菜单中选择“导入脚本”
4.在文件浏览器中选中要导入的脚本, 然后点击“导入”按钮

5.导出

1.点击底部导航栏切换到“脚本列表”界面
2.长按脚本, 在弹出的菜单中选择“导出”
3.在文件浏览器中选择要导出的目录
4.点击“导出脚本”按钮, 脚本将导出到选择的目录中

6.注册

1.登录http://aisence.taobao.com, 按照里面的购买流程注册
2.点击“触摸精灵”的“设置”中的“序列号激活”, 输入淘宝获取到的序列号, 点击“确定”按钮
3.软件将自动下载注册文件到设备中, 重新进入“注册状态”, 显示已注册和“有效期”则成功


基本语法

用户可参考Lua的官方手册或者其他资料来学习以下基本语法:

Lua官方手册:http://www.lua.org/manual/5.2/
Lua中文开发手册:http://book.luaer.cn/

脚本UI界面

  用户可以通过在脚本中定义一个全局变量UI来实现定义脚本的配置界面, 该界面会在脚本运行前显示给用户, 用于让用户设置一些脚本的参数, 这些参数的值会赋值给指定的变量, 脚本运行时可以通过访问这些变量来获取用户的配置。下面是一个完整的例子:

  1. UI = {
  2. { 'TextView{-请如实填写哦-}' },
  3. { 'InputBox{}', 'name', '姓名:' },
  4. { 'DropList{帅哥|美女}', 'sex', '性别:' },
  5. { 'InputBox{18}', 'age', '年龄:' },
  6. { 'DropList{是|否}', 'married', '婚否:' },
  7. };
  8. function main()
  9. notifyMessage(string.format("姓名:%s\n性别:%s\n年龄:%s\n婚否:%s", name, sex, age, married));
  10. end

上述脚本播放前会显示一个如下界面:

  全局变量UI是一个Table类型的变量, 其中包含若干个子Table, 每一个子Table都是一个界面上的控件, 控件按照顺序自上而下排列, 目前支持3中类型的控件:

1. TextView (静态文本)

1.1 控件说明
该类型的控件只用来显示一行文字, 不需要用户操作
1.2 控件定义

  1. { 'TextView{显示的内容}' }

这个Table只有一个字符串成员, 即'TextView{显示的内容}'

其中的TextView是指定此控件的类型为静态文本, {}中的内容即为该静态文本显示的内容

2. InputBox (输入框)

2.1 控件说明
  该类型的控件可以用于让用户输入一些内容, 并可以指定一个变量名, 脚本开始后通过该变量就可以访问到用户输入的内容
2.2 控件定义

  1. { 'InputBox{默认值}', 'var', '注释' }

这个Table中有3个字符串成员:

'InputBox{默认值}', 其中的InputBox是指定此控件的类型为输入框, {}中的内容是该输入框中的默认值

'var', 定义一个变量的名字, 脚本开始后可以通过访问这个变量来获取用户输入的内容
'注释', 显示在输入框上方, 用于说明该输入框的用途

'InputBox{默认值}', 其中的InputBox是指定此控件的类型为输入框, {}中的内容是该输入框中的默认值

2.3 使用提示

需要注意的是获取到的变量的值是默认是字符串类型, 你可以使用tonumber()函数来转换成数字类型来使用。例如
var = tonumber(var);

3. DropList (下拉列表)

3.1 控件说明
  该类型的控件可以用于让用户在指定的若干个值中选择其中一个, 并可以指定一个变量名, 脚本开始后通过该变量就可以访问到用户选择的内容
  
3.2 控件定义

  1. { 'DropList{选项1|选项2|选项3|...}', 'var', '注释' }

这个Table中有3个字符串成员:

'DropList{选项1|选项2|选项3|...}', 其中的DropList是指定此控件的类型为下拉列表, {}中的内容是指定的若干个选项, 每个选项间用|分隔

'var', 定义一个变量的名字, 脚本开始后可以通过访问这个变量来获取用户选择的内容

'注释', 显示在下拉列表上方, 用于说明该下拉列表的用途

使用注意:

全局代码块(不包含在任何函数内的代码块)会在脚本的main()函数之前被调用, 所以可以在全局代码块中对UI变量进行动态的设置, UI变量是一个Table类型的变量, 可以使用Lua的Table库函数操作, 下面是一个操作UI变量的例子:

  1. file = io.open("/mnt/sdcard/conf.txt"); -- 打开配置文件
  2. data = file:read("*a"); -- 读取全部内容
  3. file:close(); -- 关闭文件
  4. UI = {
  5. { 'InputBox{'.. data .. '}', 'demo', '演示:' },
  6. }
  7. function main()
  8. notifyMessage(string.format("%s", demo));
  9. end

扩展函数

函数:logDebug() 系统日志

函数说明 : 输出调试信息到系统日志
函数方法 : logDebug(文本型 contents);
返回值 : 无

参数 类型 说明
contents 文本型 输出到日志文件的内容

示例:

  1. 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 整数型 脚本暂停执行的时间,单位为毫秒

示例:

  1. mSleep(1000); -- 延迟1
  2. mSleep(60*1000); -- 延迟1分钟
  3. mSleep(60*60*1000); -- 延迟1小时
  4. mSleep(24*60*60*1000); -- 延迟1
  5. mSleep(365*24*60*60*1000); -- 延迟1

用在点击函数中可实现长按不放的效果

  1. touchDown(0,100,200); --按下坐标为100,200的点
  2. mSleep(2000); --延时 2
  3. touchUp(0); --抬起

注意事项:

毫秒与秒换算方式为 1 秒 (s) = 1000 毫秒 (ms)

函数:notifyMessage() 提示,通知

函数说明 : 以文字提示框的方式通知用户
函数方法 : notifyMessage(文本型 text, 整数型 interval);
返回值 : 无

参数 类型 说明
text 文本型 在屏幕上显示的提示文字
interval 整数型 提示多长时间,单位:毫秒,默认值1000

示例:

  1. notifyMessage("Hello World"); -- -- 在屏幕上显示"hello"显示1
  2. notifyMessage("Hello World",3000); -- -- 在屏幕上显示"hello"显示3
  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"为时间显示的格式。

函数:toast() 提示,通知(苹果专用)

函数说明 : 在屏幕底部以悬浮层形式显示字符串信息
函数方法 : toast(文本型 text, 整数型 interval);
返回值 : 无
支持版本 : V3.7.4-1 以上

参数 类型 说明
text 文本型 提示信息,将在设备屏幕上以悬浮层形式显示
interval 整数型 提示多长时间,单位:毫秒,默认值1000

示例:

  1. toast("Hello World"); -- -- 在屏幕上显示"hello"显示1
  2. toast("Hello World",3000); -- -- 在屏幕上显示"hello"显示3
  3. toast("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"为时间显示的格式。
3,显示时间并不会影响脚本运行,例如设置显示时间为60秒,脚本并不会等60秒后在继续运行。

函数:notifyVibrate() 震动

函数说明 : 以震动方式通知用户
函数方法 : notifyVibrate(整数型 interval);
返回值 : 无

参数 类型 说明
interval 整数型 震动时间,单位:毫秒

示例:

  1. notifyVibrate(1000); -- 让设备震动1

注意事项:

使用此函数需在移动设备设置里打开震动选项。

函数:notifyVoice() 播放音频

函数说明 : 以播放音频的方式通知用户
函数方法 : notifyVoice(文本型 file);
返回值 : 无

参数 类型 说明
filen 文本型 音频文件路径及名字

示例:

  1. notifyVoice("/mnt/sdcard/a.mp3"); -- 播放路径为"/mnt/sdcard/a.mp3"的音频
  2. mSleep(5000);

注意事项:

使用此函数需在后面加上延时函数,延时5000即播放音频5秒钟。

函数:touchDown() 按下

函数说明 : 发送手指按下事件
函数方法 : touchDown(整数型 ID,整数型 x,整数型 y);
返回值 : 无

参数 类型 说明
ID 整数型 手指ID, 范围0~128, 用于标识一个手指
X 整数型 X坐标
Y 整数型 Y坐标

示例:

  1. touchDown(0, 100, 100); -- ID0的手指在坐标为(100, 100)的点按下
  2. mSleep(100); --延时100毫秒
  3. touchUp(0); -- ID0的手指抬起

示例:封装一个点击函数

  1. function click(x, y)
  2. touchDown(0, x, y);
  3. mSleep(200);
  4. touchUp(0);
  5. end
  6. --------------调用方法------------
  7. click(100,100);--点击坐标为100,100的点

示例:封装一个可控制按下时间的点击函数

  1. function click(x,y,n)
  2. touchDown(0, x, y);
  3. mSleep(n);
  4. touchUp(0);
  5. end
  6. --------------调用方法------------
  7. click(100,100,1000);--按下坐标为100,100的点延时1秒后抬起

注意事项:

使用 touchDown、touchUp 函数时,中间要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。

函数:touchMove() 移动

函数说明 : 发送手指移动事件
函数方法 : touchMove(整数型 ID,整数型 x,整数型 y);
返回值 : 无

参数 类型 说明
ID 整数型 touchDown()时传入的手指ID
X 整数型 X坐标
Y 整数型 Y坐标

示例:

  1. touchDown(0, 100, 100); -- ID0的手指在坐标为(100, 100)的点按下
  2. mSleep(100); --延时100毫秒
  3. touchMove(0, 200, 100); -- ID0的手指滑动到坐标为(200, 100)的点
  4. mSleep(100); --延时100毫秒
  5. touchUp(0); -- ID0的手指抬起

示例: 连续移动到指定位置

  1. function clickMove(x1,y1,x2,y2,n)
  2. local w = math.abs(x2-x1);
  3. local h = math.abs(y2-y1);
  4. touchDown(0,x1,y1);
  5. mSleep(50);
  6. if x1 < x2 then
  7. w1 = n;
  8. else
  9. w1 = -n;
  10. end
  11. if y1 < y2 then
  12. h1 = n;
  13. else
  14. h1 = -n;
  15. end
  16. if w >= h then
  17. for i = 1 , w,n do
  18. x1 = x1 + w1;
  19. if y1 == y2 then
  20. else
  21. y1 = y1 + math.ceil(h*h1/w);
  22. end
  23. touchMove(0,x1,y1);
  24. mSleep(10);
  25. end
  26. else
  27. for i = 1 ,h,n do
  28. y1 = y1 + h1;
  29. if x1 ==x2 then
  30. else
  31. x1 = x1 + math.ceil(w*w1/h);
  32. end
  33. touchMove(0,x1,y1);
  34. mSleep(10);
  35. end
  36. end
  37. mSleep(50);
  38. touchUp(0);
  39. end
  40. --------------调用方法----------------
  41. clickMove(100,100,200,200,5);--x1,y1为起始位置坐标,x2y2为终点位置坐标,n是每次移动多少个像素

函数:touchUp() 抬起

函数说明 : 发送手指抬起事件
函数方法 : touchUp(整数型 ID);
返回值 : 无

参数 类型 说明
ID 整数型 touchDown()时传入的手指ID

示例:

  1. touchDown(0, 100, 100); -- ID0的手指在坐标为(100, 100)的点按下
  2. mSleep(100); --延时100毫秒
  3. touchUp(0); -- ID0的手指抬起

函数:keyDown() 按下物理按键

函数说明 : 发送物理按键按下事件
函数方法 : keyDown(文本型 string);
返回值 : 无

参数 类型 说明
string 文本型 物理键名称

示例:单击一次HOME按键

  1. keyDown('HOME'); -- HOME键按下
  2. mSleep(100); --延时100毫秒
  3. keyUp('HOME'); -- HOME键抬起

注意事项:

1,Android触摸精灵现在支持的有'HOME'、'BACK'、'MENU',
2,IOS触摸精灵现在支持的有'HOME'
3,其他按键可参照【附录】触摸精灵模拟物理按键的方法

函数:keyUp() 抬起物理按键

函数说明 : 发送物理按键抬起事件
函数方法 : keyUp(文本型 string);
返回值 : 无

参数 类型 说明
string 文本型 物理键名称

示例:单击一次HOME按键

  1. keyDown('HOME'); -- HOME键按下
  2. mSleep(100); --延时100毫秒
  3. keyUp('HOME'); -- HOME键抬起

注意事项:

1,Android触摸精灵现在支持的有'HOME'、'BACK'、'MENU',
2,IOS触摸精灵现在支持的有'HOME'
3,其他按键可参照【附录】触摸精灵模拟物理按键的方法

函数:getColor() 获取指定像素的颜色

函数说明 : 获取指定像素的颜色
函数方法 : getColor(整数型x, 整数型y);
返回值 : 整型 color

参数 类型 说明
整数型 将获取颜色值的X坐标
整数型 将获取颜色值的y坐标
返回值 类型 说明
color 整数型 x,y坐标点的十进制颜色值

示例:

  1. c = getColor(100, 100); -- 将坐标为(100,100)的点的颜色保存在变量c
  2. if c == 0x0000ff then -- 如果该点颜色为0x0000ff(纯蓝色)
  3. touchDown(0, 100, 100); -- 那么点击该坐标
  4. touchUp(0);
  5. end
  6. ---------------也可以写成-------------
  7. if getColor(100, 100) == 0x0000ff then -- 如果该点颜色为0x0000ff(纯蓝色)
  8. touchDown(0, 100, 100); -- 那么点击该坐标
  9. touchUp(0);
  10. 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坐标
整数型 将获取颜色值的y坐标
返回值 类型 说明
R 整数型 x,y坐标点的颜色R(红色)值
G 整数型 x,y坐标点的颜色G(绿色)值
B 整数型 x,y坐标点的颜色B(蓝色)值

示例:

  1. r, g, b = getColorRGB(100, 100); -- 将坐标为(100,100)的点的颜色的RGB分别保存在变量rgb
  2. if r == 0x00 and b == 0x00 and g == 0xff then -- 如果该点颜色为0x0000ff(纯蓝色)
  3. touchDown(0, 100, 100); -- 那么点击该坐标
  4. touchUp(0);
  5. end

示例:封装一个单点模糊比对函数

  1. function compare_color_point(x,y,r,g,b,sim)
  2. local lr,lg,lb;
  3. lr,lg,lb = getColorRGB(x,y);
  4. if math.abs(lr-r) > sim then
  5. return false;
  6. end
  7. if math.abs(lg-g) > sim then
  8. return false;
  9. end
  10. if math.abs(lb-b) > sim then
  11. return false;
  12. end
  13. return true;
  14. end
  15. -----调用方法
  16. if compare_color_point(100,100,255,255,255,30) then
  17. touchDown(0, 100, 100);
  18. mSleep(50)
  19. touchUp(0);
  20. end
  21. --sim值越小精确度越高,范围是 0-255

函数:findColor() 全屏找色

函数说明 : 全屏寻找符合指定颜色的坐标,不支持模糊查找。
函数方法 : findColor(整型 color);
返回值 : 整数型 x, y

参数 类型 说明
color 整数型 将要找的十六进制颜色值
返回值 类型 说明
x 整数型 找到的坐标X值,未找到返回 -1
y 整数型 找到的坐标Y值,未找到返回 -1

示例

  1. x, y = findColor(0x0000ff); -- 在全屏范围找到第一个颜色为0x0000ff的点, 将其坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. 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

例如:

  1. print(4 and 5) --> 5
  2. print(nil and 13) --> nil
  3. print(false and 13) --> false
  4. print(4 or 5) --> 4
  5. print(false or 5) --> 5

函数:findColorFuzzy() 全屏模糊找色

函数说明 : 全屏寻找符合指定颜色的坐标,支持模糊查找。
函数方法 : findColorFuzzy(整型 color,整数型 degree);
返回值 : 整数型 x, y

参数 类型 说明
color 整数型 将要找的十六进制颜色值
degree 整数型 精度,范围:1 ~ 100,数值越大精度越高,100为完全比配
返回值 类型 说明
x 整数型 找到的坐标X值,未找到返回 -1
y 整数型 找到的坐标Y值,未找到返回 -1

示例

  1. x, y = findColorFuzzy(0x0000ff, 90); -- 在全屏范围找到第一个颜色为0x0000ff的点, 精确度为90%, 将其坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. 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

示例

  1. x, y = findColorInRegion(0x0000ff, 100, 100, 200, 200); -- 在区域[(100,100)(200,200)]范围找到第一个颜色为0x0000ff的点, 将其坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. 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

示例

  1. x, y = findColorInRegionFuzzy(0x0000ff, 90, 100, 100, 200, 200); -- 在区域[(100,100)(200,200)]范围找到第一个颜色为0x0000ff的点, 精确度为90%, 将其坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. end

示例:此函数单点模糊找色使用方法

  1. x, y = findColorInRegionFuzzy(0x0000ff, 90, 100, 100, 100, 100); -- 将左上角和右下角两个坐标写成一样,作用就是判断(100,100)这个坐标颜色是否为0x0000ff, 精确度为90%, 将其坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. end

示例:不断降低精确度的写法

  1. for sim = 100, 50, -1 do --使用 for 循环不断降低精确度(建议精确度不低于50%)
  2. x, y = findColorInRegionFuzzy(0x0000ff, sim, 100, 100, 100, 100);
  3. if x ~= -1 and y ~= -1 then --如果在指定区域找到某点符合条件
  4. touchDown(0, x, y); --那么单击该点
  5. touchUp(0);
  6. break; --并跳出循环
  7. end
  8. 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

示例

  1. -- 在区域[(10,10)(200,200)]范围内以90%的精确度找一个满足以下条件的点:
  2. -- 1. 其颜色为0x0000ff
  3. -- 2. X坐标+10Y坐标+20的坐标上的点颜色为0x00ff00
  4. -- 3. X坐标-10Y坐标-20的坐标上的点颜色为0xff0000
  5. x, y = findMultiColorInRegionFuzzy({0x0000ff, 10, 20, 0x00ff00, -10, -20, 0xff0000 }, 90, 10, 10, 200, 200);
  6. if x ~= -1 and y ~= -1 then -- 如果找到了
  7. touchDown(0, x, y); -- 点击那个点
  8. touchUp(0);
  9. 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个坐标点变成多点找色的数组格式为:

  1. {0x123456, 4,0, 0x123456, 2,2, 0x123456, 0,4, 0x123456, 4,4, 0x123456 }

找色代码为:

  1. 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

示例

  1. x, y = findImage("/mnt/sdcard/a.bmp"); -- 在全屏范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 将其左上角坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. end

示例:忽略图片中的黑色

  1. x, y = findImage("a.bmp", 0x000000); -- 在全屏范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. 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

示例

  1. x, y = findImageFuzzy("/mnt/sdcard/a.bmp", 90, 0x000000); -- 在全屏范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 精确度为90, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. 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

示例

  1. x, y = findImageInRegion("/mnt/sdcard/a.bmp", 100, 100, 200, 200, 0x000000); -- 在区域[(100,100)(200,200)]范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. 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

示例

  1. x, y = findImageInRegionFuzzy("/mnt/sdcard/a.bmp", 90, 100, 100, 200, 200, 0x000000); -- 在区域[(100,100)(200,200)]范围找到第一个路径为"/mnt/sdcar/a.bmp"的图片, 精确度为90, 忽略图片中颜色为0x000000(黑色)的点, 将其左上角坐标保存到变量xy
  2. if x ~= -1 and y ~= -1 then -- 如果找到了
  3. touchDown(0, x, y); -- 点击那个点
  4. touchUp(0);
  5. end

注意事项:

1,图片路径不写为默认res目录,其他目录请填写绝对路径。
2,图片只支持BMP格式。

函数:snapshotScreen() 全屏截图

函数说明 : 截取屏幕并生成指定格式的图片文件。
函数方法 : snapshotScreen(文本型 picpath, 数字型 quality);
返回值 : 无

参数 类型 说明
picpath 文本型 保存截图的路径, 支持BMP格式和JPG格式, 根据文件名后缀智能判断
quality 数字型 图片尺寸缩放百分比, 有效范围为10~100, 默认为100(可选)

示例

  1. snapshotScreen("/mnt/sdcard/a.bmp"); -- 将全屏截图保存到路径为"/mnt/sdcard/a.bmp"的图片中, 格式为BMP
  2. snapshotScreen("/mnt/sdcard/a.jpg, 50"); -- 将全屏截图保存到路径为"/mnt/sdcard/a.jpg"的图片中, 格式为JPG, 并且尺寸缩小为原始尺寸的50%
  3. 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(可选)

示例

  1. snapshotRegion("/mnt/sdcard/a.bmp", 100, 100, 200, 200); -- 将区域[(100,100)(200,200)]的截图保存到路径为/mnt/sdcard/a.bmp的图片中, 格式为BMP
  2. snapshotRegion("/mnt/sdcard/a.jpg", 100, 100, 200, 200, 50); -- 将区域[(100,100)(200,200)]的截图保存到路径为/mnt/sdcard/a.jpg的图片中, 格式为JPG, 并且尺寸缩小为原始尺寸的50%
  3. 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 文本型 图片识别后得到的答案, 失败的话返回空字符串

示例:识别中文

  1. code = localOcrText("/mnt/sdcard/touchelf/tessdata", -- 语言包tessdata目录在设备中的路径
  2. "chi_sim", -- 语言类型为中文
  3. 100, -- 图片左上角X坐标为100
  4. 100, -- 图片左上角Y坐标为100
  5. 200, -- 图片右下角X坐标为200
  6. 200); -- 图片右下角Y坐标为200
  7. if code == "" then
  8. notifyMessage("识别失败");
  9. else
  10. notifyMessage(string.format("识别成功: %s", code));
  11. end

示例:识别英文和数字

  1. code = localOcrText("/mnt/sdcard/touchelf/tessdata", -- 语言包tessdata目录在设备中的路径
  2. "eng", -- 语言类型为英文
  3. 100, -- 图片左上角X坐标为100
  4. 100, -- 图片左上角Y坐标为100
  5. 200, -- 图片右下角X坐标为200
  6. 200); -- 图片右下角Y坐标为200
  7. if code == "" then
  8. notifyMessage("识别失败");
  9. else
  10. notifyMessage(string.format("识别成功: %s", code));
  11. end

示例:只识别数字

  1. code = localOcrText("/mnt/sdcard/touchelf/tessdata", -- 语言包tessdata目录在设备中的路径
  2. "eng", -- 语言类型为中文
  3. 100, -- 图片左上角X坐标为100
  4. 100, -- 图片左上角Y坐标为100
  5. 200, -- 图片右下角X坐标为200
  6. 200, -- 图片右下角Y坐标为200
  7. "0123456789"); -- 设置白名单字符串, 只识别数字
  8. if code == "" then
  9. notifyMessage("识别失败");
  10. else
  11. notifyMessage(string.format("识别成功: %s", code));
  12. end

注意事项:

1,该函数对非正规字体识别欠佳,建议识别一些背景无杂色的英文和数字。
2,需要下载ocr语言包。

函数:cloudOcrInit() 选择远程代答平台

函数说明 : 选择远程代答平台。
函数方法 : cloudOcrInit(整数型 platform);
返回值 : 无

参数 类型 说明
platform 整数型 远程代答平台ID, 默认为0

0 : 好爱答题 http://www.haoi23.net
1 : 打码兔答题 http://www.dama2.com

示例

  1. 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 文本型 图片识别后得到的答案, 失败的话返回空字符串

示例

  1. cloudOcrInit(0); -- 选择代答平台为好爱答题
  2. code = cloudOcrText("username|PASSWORDAD9EFBD3F233265DF9400E6A", -- 好爱答题参数1为密码串(http://www.haoi23.net注册并登陆后, 在会员中心获取)
  3. "1004", -- 题目类型为"1004"(4位数字字母)
  4. 100, -- 图片左上角X坐标为100
  5. 100, -- 图片左上角Y坐标为100
  6. 200, -- 图片右下角X坐标为200
  7. 200, -- 图片右下角Y坐标为200
  8. 600); -- 超时时间为600
  9. if code == "" then
  10. notifyMessage("识别失败");
  11. else
  12. notifyMessage(string.format("识别成功: %s", code));
  13. 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 文本型 图片识别后得到的答案, 失败的话返回空字符串

示例:合并三张图片进行远程识别

  1. snapshotScreen("/var/touchelf/1.bmp"); -- 将屏幕截图为/var/touchelf/1.bmp图片
  2. snapshotScreen("/var/touchelf/2.bmp"); -- 将屏幕截图为/var/touchelf/2.bmp图片
  3. snapshotScreen("/var/touchelf/3.bmp"); -- 将屏幕截图为/var/touchelf/3.bmp图片
  4. -------------------------------------------
  5. -- 下面的代码将1.bmp2.bmp3.bmp合并成一个图片后
  6. -- 发送到打码兔远程代答平台进行图片识别
  7. -------------------------------------------
  8. cloudOcrInit(1); -- 选择代答平台为打码兔答题
  9. code = cloudOcrTextEx("username|password", -- 打码兔答题参数1"用户名|密码"
  10. "1004", -- 题目类型为"1004"(4位数字字母)
  11. 600, -- 超时时间为600
  12. "/var/touchelf/1.bmp", -- 待合并的第一个图片
  13. "/var/touchelf/2.bmp", -- 待合并的第二个图片
  14. "/var/touchelf/3.bmp"); -- 待合并的第三个图片
  15. if code == "" then
  16. notifyMessage("识别失败");
  17. else
  18. notifyMessage(string.format("识别成功: %s", code));
  19. end

函数:keepScreen() 屏幕保持 缓存屏幕数据

函数说明 : 开启/关闭屏幕保持。
函数方法 : keepScreen(逻辑型 flag);
返回值 : 无

参数 类型 说明
flag 逻辑型 开启/关闭屏幕保持

示例

  1. keepScreen(true); -- 开启屏幕保持
  2. if getColor(100, 100) == 0x000000 or getColor(200, 200) == 0x000000 then -- 进行2次取色, 由于启用了屏幕保持, 2次取色不会重新获取2次屏幕图像, 这样可以提高性能
  3. notifyMessage("yes"); --如果(100,100)和(200,200)坐标有一个颜色为黑色, 输出"yes"
  4. else -- 否则
  5. notifyMessage("no"); -- 输出"no"
  6. end
  7. keepScreen(false); -- 关闭屏幕保持

注意事项:

1,当使用keepScreen(true);开启屏幕保持时, 后续的找图、找色等函数不会重新获取屏幕图像, 而是使用开启屏幕保持之前的屏幕图像,否则每次使用找图找色等函数都将截取一次屏幕内容。
2,当使用 keepScreen(false);关闭屏幕保持时, 后续的找图、找色等函数会每次都重新获取屏幕图像。
3,安卓版支持性能模式的设备不需要使用此函数。
4,苹果版和安卓兼容模式下使用此函数可显著提升找色速度。

流程图:

Created with Raphaël 2.1.2keepScreen(true)找图或者找色代码是否找到?点击坐标keepScreen(false)yesno

函数:rotateScreen() 旋转屏幕的坐标体系

函数说明 : 旋转屏幕的坐标体系, 后续的找图、找色、截图、触摸动作都会使用新的坐标体系
函数方法 : rotateScreen(整数型 Angle);
返回值 : 无

参数 类型 说明
Angle 整数型 旋转角度

0: 保持原本的坐标体系。对于IOS设备来说, 此时HOME键在下方时的屏幕左上角为原点
90: 坐标系统向右转90度。对于IOS设备来说, 此时HOME键在右方时的屏幕左上角为原点
-90: 坐标系统向左转90度。对于IOS设备来说, 此时HOME键在左方时的屏幕左上角为原点
180: 坐标系统倒立。对于IOS设备来说, 此时HOME键在下方时的屏幕左上角为原点

示例

  1. rotateScreen(90); -- 旋转坐标体系向右90度, 大多数横屏游戏使用此坐标体系.
  2. touchDown(0, 100, 100); -- 发送触摸动作, 此时点击的点使用新的坐标体系.
  3. touchUp(0);

示例 临时旋转后恢复原始坐标系

  1. rotateScreen(90); -- 旋转坐标体系向右90
  2. snapshotRegion("/mnt/sdcard/a.bmp", 100, 100, 200, 200);--截一张新的坐标体系下的图
  3. rotateScreen(0); -- 恢复坐标体系

函数:copyText() 复制文字到系统剪贴板

函数说明 : 复制文字到系统剪贴板, 以便后续粘贴。
函数方法 : copyText(文本型 text);
返回值 : 无

参数 类型 说明
text 文本型 要粘贴的文字, 中英文都支持

示例

  1. copyText("你好") -- 复制字符串“你好”到系统剪贴板

注意事项:

复制文字到系统剪贴板会覆盖以前复制的内容。

函数:clipText() 获取系统剪贴板内容

函数说明 : 获取系统剪贴板中之前复制或剪贴的文字内容。
函数方法 : clipText();
返回值 : 文本型 text

返回值 类型 说明
text 文本型 剪贴板内的文字

示例

  1. text = clipText() -- 将之前复制或剪贴的文字读取到变量text
  2. inputText(text) --在输入框中输入获取到的字符串

函数:inputText() 输入字符串

函数说明 : 在文本框内输入文本。
函数方法 : inputText(文本型 string);
返回值 : 无

参数 类型 说明
string 文本型 要输入的字符串, 其中\b字符可用于退格删除

示例

  1. inputText("你好Hello"); -- 在当前选中的文字输入框中输入字符串"你好Hello"
  2. inputText("\b\b\b\b\b"); -- 退格删除5个字符

注意事项:

1,使用该函数前,先点击输入框,例如点击用户名,再执行该函数。
2,建议切换到系统输入法再使用该函数。
3,\b字符可用于删除一个字符。

函数:appRun() 打开,运行指定软件

函数说明 : 打开,运行指定软件。
函数方法 : appRun(文本型 string);
返回值 : 无

参数 类型 说明
string 文本型 想要打开的软件的包名

示例

  1. appRun("com.android.browser"); -- 打开系统自带浏览器

注意事项:

应用包名可以触摸精灵设置--查询已安装应用包名中查看。

函数:appRunning() 判断指定应用是否正在运行

函数说明 : 判断指定应用是否正在运行。
函数方法 : appRunning(文本型 string);
返回值 : 布尔值 flag

参数 类型 说明
string 文本型 想要检测的软件的包名
参数 类型 说明
flag 布尔值 返回true或者false

示例

  1. if appRunning("com.android.browser") then
  2. notifyMessage("yes");
  3. else
  4. notifyMessage("no");
  5. end

注意事项:

应用包名可以触摸精灵设置--查询已安装应用包名中查看。

函数:appKill() 关闭指定软件

函数说明 : 关闭指定软件。
函数方法 : appKill(文本型 string);
返回值 : 无

参数 类型 说明
string 文本型 想要关闭的软件的包名

示例

  1. appKill("com.android.browser"); -- 关闭系统自带浏览器

示例

  1. --遇到某些应用一次关不掉的话可用下面的方法
  2. function kill_app(app_package)
  3. while true do
  4. if appRunning(app_package) then
  5. appKill(app_package);
  6. mSleep(1000);
  7. else
  8. return true;
  9. end
  10. end
  11. end
  12. ---调用方法
  13. kill_app("com.android.browser"); -- 关闭系统自带浏览器

注意事项:

应用包名可以触摸精灵设置--查询已安装应用包名中查看。

函数:httpGet() HTTP协议访问

函数说明 : HTTP协议访问。
函数方法 : httpGet(文本型 string);
返回值 : 文本型 data

参数 类型 说明
string 文本型 网址URL
返回值 类型 说明
data 文本型 网址的内容, 失败的话返回空字符串

示例

  1. data = httpGet('www.google.com'); -- 获取www.google.com的内容
  2. notifyMessage(data); -- 显示www.google.com的内容
  3. -----登陆爱码
  4. sms_user_name = "user";
  5. sms_user_password = "pass";
  6. sms_user_info= httpGet("http://api.f02.cn:8888/http.do?action=loginIn&uid"..sms_user_name.."&pwd="..sms_user_password);--使用 用户名为user密码为pass的用户登陆爱码取回用户信息
  7. if sms_user_info ~= "" then
  8. notifyMessage(sms_user_info); -- 显示返回的内容
  9. else
  10. notifyMessage("获取失败");
  11. end

函数:ftpGet() ftp下载

函数说明 : ftp下载。
函数方法 : ftpGet(文本型 url,文本型 file,文本型 ftpuser,文本型 ftppass);
返回值 : 布尔值 flag

参数 类型 说明
url 文本型 远程文件地址
file 文本型 本地文件路径
ftpuser 文本型 FTP服务器用户名
ftppass 文本型 FTP服务器密码
返回值 类型 说明
flag 布尔值 返回true或者false

示例

  1. 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
  2. if flag then
  3. notifyMessage("下载成功")
  4. else
  5. notifyMessage("下载失败")
  6. end

函数:ftpPut() ftp上传

函数说明 : ftp上传。
函数方法 : ftpPut(文本型 url,文本型 file,文本型 ftpuser,文本型 ftppass);
返回值 : 布尔值 flag

参数 类型 说明
url 文本型 远程文件地址
file 文本型 本地文件路径
ftpuser 文本型 FTP服务器用户名
ftppass 文本型 FTP服务器密码
返回值 类型 说明
flag 布尔值 返回true或者false

示例

  1. 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的文件
  2. if flag then
  3. notifyMessage("上传成功")
  4. else
  5. notifyMessage("上传失败")
  6. end

函数:getScreenResolution() 获取当前屏幕分辨率

函数说明 : 获取当前屏幕分辨率。
函数方法 : getScreenResolution();
返回值 : 整数型 width,height

返回值 类型 说明
width 整数型 获取到的当前屏幕宽度
height 整数型 获取到的当前屏幕高度

示例

  1. width, height = getScreenResolution(); -- 将屏幕宽度和高度分别保存在变量wh
  2. notifyMessage(string.format("%d,%d\n", width, height)); -- 将宽度和高度用提示框显示到屏幕上
  3. --脚本判断使用的机器是否是iphone5
  4. if width == 640 and height == 1136 then
  5. notifyMessage("当前设备为iphone5")
  6. else
  7. notifyMessage("请在iphone5上使用本程序")
  8. end

函数:getScreenColorBits() 获取当前屏幕色彩位数

函数说明 : 获取当前屏幕色彩位数。
函数方法 : getScreenColorBits();
返回值 : 整数型 color

返回值 类型 说明
color 整数型 色彩位数

示例

  1. color = getScreenColorBits(); -- 将屏幕色彩位数保存在变量color
  2. notifyMessage(string.format("%d\n", color)); -- 将色彩位数用提示框显示到屏幕上

函数:getDeviceID() 获取设备串号

函数说明 : 获取设备串号。
函数方法 : getDeviceID();
返回值 : 文本型 deviceID

返回值 类型 说明
deviceID 文本型 返回的设备串号

示例

  1. deviceID = getDeviceID(); -- 将设备ID保存到deviceID变量中
  2. -------------------------授权一台设备-------------------------
  3. if deviceID == "Fd452dg2421" then
  4. notifyMessage("当前设备已授权");
  5. else
  6. notifyMessage("当前设备未授权");
  7. os.exit() --结束脚本
  8. end
  9. -------------------------授权多台设备---------------------------------
  10. local deviceID_flag = false; --定义当前设备未授权
  11. deviceID_arr = {"F123456","F1234567","F12345678"};--可使用设备数组
  12. for i = 1,#deviceID_arr do --循环数组长度
  13. if deviceID == deviceID_arr[i] then--判断当前设备序列号是否和设备数组中的相同
  14. deviceID_flag = true;--定义当前设备已授权
  15. break; --跳出循环
  16. end
  17. end
  18. if deviceID_flag then
  19. notifyMessage("当前设备已授权");
  20. else
  21. notifyMessage("当前设备未授权");
  22. os.exit(); --结束脚本
  23. end

注意事项:

1,使用该函数 苹果设备返回的是序列号,安卓设备返回的是mac 。
2,os.exit() 为结束脚本函数。

函数:getNetTime() 获取网络时间

函数说明 : 获取网络时间。
函数方法 : getNetTime();
返回值 : 整数型 time

返回值 类型 说明
time 整数型 时间戳

示例

  1. time = getNetTime();
  2. if time ~= -1 then
  3. tt = os.date("*t", time);
  4. if tt.year > 2014 and tt.month > 2 and tt.day > 15 and tt.hour > 12 and tt.min > 30 then
  5. notifyMessage("当前时间超过了2013年2月15日12点30分");
  6. end
  7. else
  8. notifyMessage("请连接网络");
  9. end

示例:获取网络时间判断脚本是否到期

  1. endtime = os.time{year=2016, month=1, day=1, hour=0, min=0, sec=0};--到期时间201611000
  2. if endtime > getNetTime() then --结束日期大于现在日期
  3. notifyMessage("脚本未到期");
  4. else
  5. notifyMessage("脚本已到期");
  6. end

注意事项:

该时间与lua的os.time()函数一样, 返回的是UTC时间1970年1月1日0时0分0秒到现在流逝的秒数, 可以配合os.date()转换成方便阅读的格式。返回-1表示不能连接网络时间服务器

函数:getVersion() 获取当前触摸精灵版本号

函数说明 : 获取当前触摸精灵版本号。
函数方法 : getVersion();
返回值 : 文本型 version

返回值 类型 说明
version 文本型 触摸精灵版本号如3.3.2

示例

  1. version = getVersion(); -- 将触摸精灵版本号保存在变量version
  2. notifyMessage(version); -- 显示版本号
  3. -----判断版本号
  4. if tonumber(string.sub(version, 1, 1)..string.sub(version, 3,3)..string.sub(version, 5,5)) < 332 then
  5. notifyMessage("请使用332版本以上的触摸精灵");
  6. os.exit();
  7. end

注意事项:

返回的版本号是字符串,对比的时候需转换成数字对比。

函数:appBundlePath() 获取指定应用的主程序目录的路径(苹果专用)

函数说明 : 获取指定应用的主程序目录的路径。
函数方法 : appBundlePath(文本型 package);
返回值 : 文本型 path

参数 类型 说明
package 文本型 应用的包名
返回值 类型 说明
path 文本型 主程序目录的路径

示例

  1. path = appBundlePath("com.tencent.xin")
  2. if path ~= "" then
  3. notifyMessage(path);
  4. else
  5. notifyMessage("no");
  6. end

注意事项:

应用包名可以触摸精灵设置--查询已安装应用包名中查看。

函数:appDataPath() 获取指定应用的数据目录的路径(苹果专用)

函数说明 : 获取指定应用的数据目录的路径。
函数方法 : appDataPath(文本型 package);
返回值 : 文本型 path

参数 类型 说明
package 文本型 应用的包名
返回值 类型 说明
path 文本型 数据目录的路径

示例

  1. path = appDataPath("com.tencent.xin")
  2. if path ~= "" then
  3. notifyMessage(path);
  4. else
  5. notifyMessage("no");
  6. end

注意事项:

1,应用包名可以触摸精灵设置--查询已安装应用包名中查看。
2,如果要删除程序数据,获取完后一定要先判断下path是不是空在执行rm删除。

函数:frontAppBid() 获取当前运行的APP包名(苹果专用)

函数说明 : 获取当前运行的APP包名
函数方法 : frontAppBid();
返回值 : 文本型 bid

返回值 类型 说明
bid 文本型 当前运行的APP包名

示例

  1. notifyMessage(frontAppBid())

函数:getVPNStatus() 获取VPN开关状态(苹果专用)

函数说明 : 获取VPN开关状态
函数方法 : getVPNStatus();
返回值 : 布尔值 status

返回值 类型 说明
status 布尔值 当前VPN开关状态

示例

  1. if getVPNStatus() then
  2. notifyMessage("VPN处于开启状态")
  3. else
  4. notifyMessage("VPN处于关闭状态")
  5. end

函数:setVPNStatus() 设置VPN开关状态(苹果专用)

函数说明 : 设置VPN开关状态
函数方法 : setVPNStatus();
返回值 : 无

参数 类型 说明
status 布尔值 VPN开关状态

示例

  1. setVPNStatus(true) -- 开启VPN

函数:openURL() 打开网络地址(苹果专用)

函数说明 : 打开网络地址
函数方法 : openURL(文本型 url);
返回值 : 无
支持版本 : V3.3.6-1 以上

参数 类型 说明
url 文本型 需要打开的目标链接

示例
调用系统浏览器打开触摸精灵官方网站

  1. openURL("http://www.touchelf.com");

访问系统设置页面

  1. openURL("prefs:root=WIFI"); --打开 wifi 界面
  2. openURL("prefs:root=LOCATION_SERVICES"); --打开定位服务界面
  3. openURL("prefs:root=General&path=VPN"); --打开 VPN 界面

注意事项:

  1. 默认浏览器为 Safari。
  2. 目标链接必须以 http:// 开头,一些特殊协议也是支持的,如:mailto://, sms://, tel://, ifile://, cydia:// 等等。

附表:可用的系统设置页面

  1. prefs:root=General&path=About --关于本机页面
  2. prefs:root=General&path=ACCESSIBILITY --辅助功能页面
  3. prefs:root=AIRPLANE_MODE --飞行模式
  4. prefs:root=General&path=AUTOLOCK --自动锁定页面
  5. prefs:root=General&path=USAGE/CELLULAR_USAGE --用量页面
  6. prefs:root=Brightness --亮度页面
  7. prefs:root=Bluetooth --蓝牙页面
  8. prefs:root=General&path=DATE_AND_TIME --日期与时间页面
  9. prefs:root=FACETIME --FACETIME页面
  10. prefs:root=General --通用页面
  11. prefs:root=General&path=Keyboard --键盘页面
  12. prefs:root=CASTLE --iCloud页面
  13. prefs:root=CASTLE&path=STORAGE_AND_BACKUP --iCloud存储空间页面
  14. prefs:root=General&path=INTERNATIONAL --语音与地区页面
  15. prefs:root=LOCATION_SERVICES --定位服务页面
  16. prefs:root=ACCOUNT_SETTINGS --账号设置页面
  17. prefs:root=MUSIC --音乐设置页面
  18. prefs:root=MUSIC&path=EQ --音乐设置EQ调节页面
  19. prefs:root=MUSIC&path=VolumeLimit --音乐设置界面音量页面
  20. prefs:root=General --通用页面
  21. prefs:root=NIKE_PLUS_IPOD --NIKE页面
  22. prefs:root=NOTES --备忘录页面
  23. prefs:root=NOTIFICATIONS_ID --通知页面
  24. prefs:root=Phone --电话页面
  25. prefs:root=Photos --照片与相机页面
  26. prefs:root=General&path=ManagedConfigurationList --描述文件页面
  27. prefs:root=General&path=Reset --还原页面
  28. prefs:root=Sounds&path=Ringtone --电话铃声页面
  29. prefs:root=Safari --Safari设置页面
  30. prefs:root=General&path=Assistant
  31. prefs:root=Sounds --声音页面
  32. prefs:root=General&path=SOFTWARE_UPDATE_LINK --软件更新页面
  33. prefs:root=STORE --iTunes Store页面
  34. prefs:root=TWITTER --TWITTER页面
  35. prefs:root=FACEBOOK --FACEBOOK页面
  36. prefs:root=General&path=USAGE --用量页面
  37. prefs:root=VIDEO --视频页面
  38. prefs:root=Wallpaper --墙纸页面
  39. prefs:root=WIFI --WIFI页面
  40. prefs:root=INTERNET_TETHERING --设置页面

函数:saveImageToAlbum 将图片存入系统相册(苹果专用)

函数说明 : 将图片存入相册
函数方法 : saveImageToAlbum(文本型 path);
返回值 : 无
支持版本 : V3.3.6-2 以上

参数 类型 说明
path 文本型 需要写入系统相册的图片路径,支持绝对路径

示例

  1. saveImageToAlbum("/var/touchelf/scripts/1.jpg");
  2. saveImageToAlbum("1.jpg");

注意事项:

  1. 图片的格式可为 bmp, jpg, png。
  2. 如不填写绝对路径时,将默认为触摸精灵的 RES 目录。

函数:saveVideoToAlbum 将视频存入系统相册(苹果专用)

函数说明 : 将视频存入相册
函数方法 : saveVideoToAlbum(文本型 path);
返回值 : 无
支持版本 : V3.3.8 以上

参数 类型 说明
path 文本型 需要写入系统相册的视频路径,支持绝对路径

示例

  1. saveVideoToAlbum("/var/touchelf/scripts/1.mp4");
  2. saveVideoToAlbum("1.mp4");

注意事项:

  1. 视频的格式可为 mp4, avi, mov。
  2. 如不填写绝对路径时,将默认为触摸精灵的 RES 目录。

函数:addContactToAB 添加联系人 (苹果专用)

函数说明 : 将联系人添加到通讯录
函数方法 : addContactToAB(文本型 lastname,文本型 firstname,文本型 mobile);
返回值 : 无
支持版本 : V3.3.8 以上

参数 类型 说明
lastname 文本型 联系人姓
firstname 文本型 联系人名
mobile 文本型 联系人电话号码

示例

  1. addContactToAB("张","小明","13511112222");

函数:removeAllContactsFromAB 清空通讯录 (苹果专用)

函数说明 : 清空通讯录
函数方法 : removeAllContactsFromAB();
返回值 : 无
支持版本 : V3.3.8 以上

示例

  1. removeAllContactsFromAB();

函数:md5String 计算字符串的MD5值 (苹果专用)

函数说明 : 计算字符串的MD5值
函数方法 : md5String(string 字符串类型);
返回值 : 文本型 MD5
支持版本 : V3.4.0-1 以上

参数 类型 说明
string 字符串型 需要计算MD5值的字符串

示例

  1. MD5=md5String("touchelf");
  2. logDebug(MD5);

函数:md5File 计算文件的MD5值 (苹果专用)

函数说明 : 计算文件的MD5值
函数方法 : md5File(path 文本型);
返回值 : 文本型 MD5
支持版本 : V3.4.0-1 以上

参数 类型 说明
path 文本型 需要计算MD5值的文件路径

示例

  1. MD5=md5File("/var/touchelf/plugin/socket.lua");
  2. logDebug(MD5);

函数:jsonDecode 将json字符串转换为table (苹果专用)

函数说明 : 将json字符串转换为table
函数方法 : jsonDecode(json 文本型);
返回值 : 数组 table
支持版本 : V3.4.0-1 以上

参数 类型 说明
json 文本型 需要转换的json字符串

示例

  1. table1 = jsonDecode('{"name":"touchelf"}');
  2. logDebug(table1.name);

函数:jsonEncode 将table转为json字符串 (苹果专用)

函数说明 : 将table转为json字符串
函数方法 : jsonEncode(数组 table);
返回值 : json 文本型
支持版本 : V3.4.0-1 以上

参数 类型 说明
table 数组 需要转换成json的数组

示例

  1. table1 = {
  2. name='touchelf',sex='man',age=18
  3. }
  4. json = jsonEncode(table1);
  5. logDebug(json);

函数:plistRead 读取plist文件为table (苹果专用)

函数说明 : 读取plist文件为table
函数方法 : plistRead(path 文本型);
返回值 : 数组 plistTable
支持版本 : V3.4.0-1 以上

参数 类型 说明
path 文本型 需要读取的plist文件路径

示例

  1. plistTable = plistRead("/Library/Preferences/SystemConfiguration/com.apple.wifi.plist");
  2. logDebug(jsonEncode(plistTable));

函数:plistWrite 将table写入plist文件 (苹果专用)

函数说明 : 将table写入plist文件
函数方法 : plistWrite(table 数组, path 文本型);
返回值 : 无
支持版本 : V3.4.0-1 以上

参数 类型 说明
table 数组 需要写入 plist 文件的数组
path 文本型 需要写入的 plist 文件的绝对路径

示例

  1. --plist文件路径
  2. plistPath = "/Library/Preferences/SystemConfiguration/com.apple.wifi.plist";
  3. -- plistRead: 读取plist文件为table
  4. plistTable = plistRead(plistPath);
  5. --为表中增加touchelf键值
  6. plistTable["touchelf"] = "S.C"
  7. -- plistWrite: table写入plist文件
  8. plistWrite(plistTable, plistPath);

注意事项:

  1. 使用该函数操作文件会导致文件所有者变 root,如果需要更改用户级应用的 plist 需要在写入后修改权限。
    os.execute("chown mobile:mobile "..plistPath) -- 修正文件权限
    os.execute("chmod 644 "..plistPath)

函数:setControlBarPosition() 设置播放控制条位置(安卓专用)

函数说明 : 获取指定应用的数据目录的路径。
函数方法 : setControlBarPosition(整数型 x,整数型 y);
返回值 : 无

参数 类型 说明
x 整数型 播放控制条X坐标
y 整数型 播放控制条Y坐标

示例

  1. setControlBarPosition(100, 100) -- 将播放控制条移动到坐标(100, 100)处

函数:cleanPhone 清除已安装应用的数据 (苹果专用)

函数说明 : 清除所有已安装应用的数据,恢复应用到刚安装时候的状态。清理浏览器缓存,清理钥匙链,清理剪贴板
函数方法 : cleanPhone();
返回值 : 无
支持版本 : V3.5.0 以上

示例

  1. cleanPhone();

函数:getAirplaneMode() 获取飞行模式开关状态(苹果专用)

函数说明 : 获取飞行模式开关状态
函数方法 : getAirplaneMode();
返回值 : 布尔值 status
支持版本 : V3.5.0 以上

返回值 类型 说明
status 布尔值 当前飞行模式开关状态

示例

  1. if getAirplaneMode() then
  2. notifyMessage("飞行模式处于开启状态")
  3. else
  4. notifyMessage("飞行模式处于关闭状态")
  5. end

函数:setAirplaneMode() 设置飞行模式开关状态(苹果专用)

函数说明 : 设置飞行模式开关状态
函数方法 : setAirplaneMode();
返回值 : 无
支持版本 : V3.5.0 以上

参数 类型 说明
status 布尔值 飞行模式开关状态

示例

  1. setAirplaneMode(true) -- 开启飞行模式
  2. setAirplaneMode(false) -- 关闭飞行模式

函数:aesEncrypt 将字符串用aes加密 (苹果专用)

函数说明 : 将字符串用aes加密
函数方法 : aesEncrypt(string 字符串类型,key 字符串类型);
返回值 : str 加密字符串
支持版本 : V3.5.0 以上

参数 类型 说明
string 字符串 需要加密的字符串
key 字符串 密钥

示例

  1. --将字符串touchelf用密钥password加密
  2. enc = aesEncrypt("touchelf","passeword");
  3. logDebug(enc);

函数:aesDecrypt 将字符串用aes解密 (苹果专用)

函数说明 : 将字符串用aes解密
函数方法 : aesDecrypt(string 字符串类型,key 字符串类型);
返回值 : str 字符串
支持版本 : V3.5.0 以上

参数 类型 说明
string 字符串 需要解密的字符串
key 字符串 密钥

示例

  1. --将字符串OCMtxqU2lSHM/hFQ6s8XDQ==用密钥password解密
  2. enc="OCMtxqU2lSHM/hFQ6s8XDQ==";
  3. msg = aesDecrypt(enc,"password");
  4. logDebug(msg);

php aes加密解密示例

  1. <?php
  2. //加密
  3. $data = 'touchelf';
  4. $aesKey = 'password';
  5. $aesKey=hash('sha256', $aesKey, true);
  6. $msgData = @openssl_encrypt ($data, "aes-256-cbc", $aesKey);
  7. echo $msgData . "\r\n";
  8. //解密
  9. $data = 'OCMtxqU2lSHM/hFQ6s8XDQ==';
  10. $aesKey = 'password';
  11. $aesKey=hash('sha256', $aesKey, true);
  12. $msgData = @openssl_decrypt ($data, "aes-256-cbc", $aesKey);
  13. echo $msgData . "\r\n";
  14. ?>

教程

触摸精灵找图脚本的详细制作过程

1.截取全屏图片

图1:

图2:

2.扣取要找的图片

图3:

图4:

3.编写脚本

  1. function main() -- main函数,脚本播放时会执行该函数
  2. mSleep(2000) -- 等待2秒后执行,为了避免播放开始的提示影响找图
  3. x, y = findImage("/var/touchelf/phone.bmp") -- 参数为图片的绝对路径,请修改为你上传的图片路径
  4. if x ~= -1 and y ~= -1 then -- 如果xy不等与-1,说明找到了
  5. touchDown(0, x+5, y+5) -- 手指按下图片所在的位置,由于xy是左上角坐标,为了点中图片,xy都加了5个像素的偏移
  6. touchUp(0) -- 手指抬起
  7. notifyMessage("yes") -- 显示yes
  8. else -- 否则,如果没找到
  9. notifyMessage("no") -- 显示no
  10. end
  11. end

将上述代码保存为脚本,然后在存在电话图标的界面播放时,会点击该图标后,显示yes;在不存在Phone图标的界面上播放时,只会显示no

httpGet函数操作二进制文件的方法

  因为httpGet函数的交互只能操作字符串,所以如果想要使用该函数传送二进制文件(如图片),可以把二进制文件转换成16进制字符串,然后在服务器端逆向的把16进制字符串还原成二进制,下面代码中的fileToHexString()函数就是一个把二进制文件转换成16进制字符串的函数。

  1. --------------------------------------------------
  2. -- 将二进制文件转换成16进制字符串
  3. -- 可用于httpGet函数传送文件,服务器端将16进制字符串转换成二进制文件即可
  4. -- 实现逆向转换
  5. --------------------------------------------------
  6. function fileToHexString(file)
  7. local file = io.open(file, 'rb');
  8. local data = file:read("*all");
  9. file:close();
  10. local t = {};
  11. for i = 1, string.len(data),1 do
  12. local code = tonumber(string.byte(data, i, i));
  13. table.insert(t, string.format("%02x", code));
  14. end
  15. return table.concat(t, "");
  16. end
  17. function main()
  18. str = fileToHexString('test.dat');
  19. notifyMessage(str);
  20. end

脚本的模块化教程

当脚本过大时,模块化各个功能可以让脚本更加便于管理。

假设a.lua存放于/mnt/sdcard/touchelf/scripts/下面(默认路径),内容如下:

  1. function a1()
  2. notifyMessage("i'm a1");
  3. end

想要在b.lua中调用a.lua中的函数a1(),那么b.lua可以这样写:

  1. package.path=package.path .. ";/mnt/sdcard/touchelf/scripts/?.lua"
  2. require "a"
  3. function main()
  4. a1();
  5. end

或者:

  1. dofile("/mnt/sdcard/touchelf/scripts/a.lua");
  2. function main()
  3. a1();
  4. end

require与dofile区别:

1.require只需要指定模块名字(不需要加入.lua这样后缀),而dofile需要指定文件的完整路径。
2.require会记住load过的信息,重复调用不会导致模块被重新载入,而dofile会。(我们可以通过dofile这种特性来实现热更新)
3.require可以载入二进制模块,如c语言编写的动态库,可以通过package.cpath来显示动态库查找的路径信息。

让你的脚本随机化一些

有时候,我们可能希望脚本可以随机化一点,表现的能像是真人在操作,而不要太机械,比如循环点击一个点的时候,能够每次点击的位置能稍微变化一点,这个时候可以试用lua的math.random()函数,这个比如如下代码:

  1. math.randomseed(tostring(os.time()):sub(5):reverse()); -- 随机种子
  2. math.random(-5, 5);

每次都可以返回-5到5之间随机的一个数,那么我们可以将点击操作写一个函数:

  1. function click(x, y)
  2. touchDown(0, x + math.random(-5, 5), y + math.random(-5, 5));
  3. mSleep(math.random(1000, 2000));
  4. touchUp(0);
  5. end

然后在需要点击时之间调用这个函数,比如找图时:

  1. x, y = findImage("/mnt/sdcard/a.bmp");
  2. if x ~= -1 and y ~= -1 then
  3. click(x, y);
  4. end

这样每次循环点击的位置都是有小幅变化的,而不是每次都是点击一个点。

自定义字符串随机:

  1. function randomStr(str, num)
  2. local reStr ='';
  3. math.randomseed(tostring(os.time()):sub(5):reverse());
  4. for i = 1, num do
  5. local getStr = math.random(1, string.len(str));
  6. reStr = reStr .. string.sub(str, getStr, getStr);
  7. end
  8. return reStr;
  9. end
  10. --用法
  11. s = randomStr("abcdefghijklmnopqrstuvwxyz", 10) --生成10位随机字母

触摸精灵的坐标体系与rotateScreen()函数的用法

1.触摸精灵的默认坐标体系

  在没有rotateScreen()这个函数之前,触摸精灵的坐标体系是固定的,以IOS设备为例子,不论是找图还是点击,坐标的原点始终是在HOME键盘在下时候的左上角是原点,例如我们用如下脚本:

  1. function main()
  2. mSleep(1000); -- 延迟一秒
  3. snapshotScreen("/var/touchelf/a.bmp"); -- 将全屏截图保存到/var/touchelf/a.bmp这个文件里
  4. end

在IOS设备的主屏幕播放一次,这样就获取了如下的图:

  这个图片的尺寸和768x1024, 图片的方向是和触摸精灵默认的坐标体系是一样的,左上角的坐标为(0,0),右上角的坐标为(768, 0),左下角的坐标为(0, 1024),右下角的坐标为(768, 1024)。

2.通过坐标点击制定位置

  如果我们想在脚本中点击“触摸精灵”的图标的话,需要怎么写呢,我们需要获取到该图标的坐标,获取这个图标的坐标的方法很多,这里我们用Photoshop打开该图片,然后按F8打开信息面板,并把该面板的选项中的“鼠标坐标”单位改为“像素”,然后把鼠标移动到图标的位置,这是就可以在信息面板里看到对应的坐标了,如下图所示:

上图中的信息面板中的信息告诉我们,“触摸精灵”图标的坐标是(124,131),那么我们编写如下脚本:

  1. function main()
  2. touchDown(0, 124, 131); -- 手指按下(124,131)位置,第一个参数0是手指ID,这个在多点触摸时会用到
  3. touchUp(0); -- 手指抬起
  4. end

在主屏幕播放如上脚本,就可以自动点击到“触摸精灵”的图标了。

3.通过找图点击指定位置

  接下来,我们想通过找图来点击“触摸精灵”的坐标,那么我们首先需要获取“触摸精灵”图标的截图,我们用Photoshop截取“触摸精灵”的图标如下(保存时候的BMP选项: 文件格式为windows,深度为24位,其他的都不选):


把这个图片传到设备的/var/touchelf/touchelf.bmp文件,然后编写如下脚本:

  1. function main()
  2. x, y = findImage("/var/touchelf/touchelf.bmp"); -- 查找touchelf.bmp这个图标在屏幕的位置,坐标保存到xy
  3. if x ~= -1 and y ~= -1 then -- 如果xy都不是-1的话,说明找到了
  4. touchDown(0, x+5, y+5); -- 由于xy保存里图标的位置,我们把xy传给touchDown就可以了,这里xy都加5是由于找图返回的坐标是找到的图片的左上角的坐标,我们要先点中的话,点击的位置需要往右下方偏移一下。
  5. touchUp(0); -- 手指抬起
  6. else -- 否则,也就是xy有一个是-1的话,说明没找到
  7. notifyMessage("没有找到"); -- 显示消息
  8. end
  9. end

4.横屏游戏如何编写呢

  手游基本是横屏的,默认情况下,触摸精灵的坐标体系不会随着屏幕画面改变的,例如,我们在横屏游戏中播放上述的截图脚本,获取到的图片是这样的:


我们可以看到,截图还是竖着的,而且这时候坐标体系也没有改变的,如果我们想点击“人物头像”,使用以前Photoshop信息面板查看的方法,可以看到“人物头像”的坐标是(720,65),那么脚本如下:

  1. function main()
  2. touchDown(0, 720, 65); -- 手指按下人物头像的位置,第一个参数0是手指ID,这个在多点触摸时会用到。
  3. touchUp(0); -- 手指抬起
  4. end

那么我们想找图点击呢,这时候我们需要找图的是这样的:


就像上面的图片,我们要找的图也必须是从竖着的图片上扣取下了的。

5.横屏游戏如何更容易的编写呢

  通过第4讲里的说明,我们可以看到触摸精灵默认的坐标体系对于编写横屏游戏来说不太友好,因为我们可能想要这样的坐标体系:


我们想要上面图片中的左上角是(0,0),右上角是(0,1024),左下角是(0, 768),右下角是(1024,768),那么我们就可以使用rotateScreen()函数来做到这一点了。

rotateScreen()函数用于设置触摸精灵的坐标体系,它的参数有4个选项:

对于大部分横屏游戏来说,我们可以用rotateScreen(90)将触摸精灵的坐标体系与其设置成一样的,比如我们使用如下脚本截图:

  1. function main()
  2. mSleep(1000); -- 延迟一秒
  3. rotateScreen(90); -- 设置触摸精灵的坐标体系设置成和游戏一致
  4. snapshotScreen("/var/touchelf/a.bmp"); -- 截图保存到/var/touchelf/a.bmp文件
  5. end

通过上面的脚本截到的图片如下:


我们可以发现,这时候获取的图片和游戏的画面是一致的了,都是横着的。

那么我们想以横屏游戏的左上角为原点发送点击怎么做呢,很简单,在脚本开始的时候加入rotateScreen(90),以后的touchDown()等函数就可以传给他横屏游戏的坐标了,比如还是想点击“人物头像”,我们在Photoshop的信息面板中查看坐标如下:


可以看到“人物头像”的坐标是(58,54),那么可以这样写:

  1. function main()
  2. rotateScreen(90); -- 设置触摸精灵的坐标体系设置成和游戏一致
  3. touchDown(0, 58, 54); -- 以游戏画面左上角为原点,发送点击动作
  4. touchUp(0);
  5. end

那么我们想通过找图来点击呢,而且不想像第4讲里的那样找竖着的图,我们想找如下这样的图:


我们把这个横屏图片的人物头像截图放到/var/touchelf/b.bmp位置,然后再简单的修改上面的找图脚本就可以了:

  1. function main()
  2. rotateScreen(90); -- 设置触摸精灵的坐标体系设置成和游戏一致
  3. x, y = findImage("/var/touchelf/touchelf.bmp"); -- 查找touchelf.bmp这个图标在屏幕的位置,坐标保存到xy里,这时返回的坐标也是以横屏游戏的左上角为原点的。
  4. if x ~= -1 and y ~= -1 then -- 如果xy都不是-1的话,说明找到了
  5. touchDown(0, x+5, y+5); -- 那么点击找图返回的坐标
  6. touchUp(0); -- 手指抬起
  7. else -- 否则,也就是xy有一个是-1的话,说明没找到
  8. notifyMessage("没有找到"); -- 显示消息
  9. end
  10. end
  11. end

不建议使用第5种方案编写脚本。

"os.execute"的相关应用

  1. --注销
  2. os.execute("killall -9 SpringBoard");
  3. --关机
  4. os.execute("halt");
  5. --重启
  6. os.execute("reboot");
  7. --清除缓存
  8. os.execute("su mobile -c uicache");
  1. --安装apk
  2. os.execute("pm install /路径/文件名.apk");
  3. --卸载apk
  4. os.execute("pm uninstall 包名");
  1. --删除文件、文件夹
  2. function remove(path)
  3. return os.execute("rm -rf "..path);
  4. end
  5. 参数说明:path为要删除文件的路径,支持*通配符。
  6. 如要删除test.lua的文件,则输入:
  7. remove("/var/touchelf/scripts/test.lua");
  8. 当然也可直接用自带的系统库函数,但不能删文件夹
  9. os.remove("/var/touchelf/scripts/test.lua");
  1. --移动文件
  2. function move(path,to)
  3. return os.execute("mv "..path.." "..to);
  4. end
  5. 参数说明:
  6. 1path为待移动文件的路径,支持*通配符。
  7. 2to为要移到的文件路径,注意先判断是否有重名文件或文件夹。
  8. 如要移动log.txtscripts/test.lua,则输入:
  9. move("/var/touchelf/log.txt","/var/touchelf/scripts/test.lua");
  1. --复制文件
  2. function copy(path,to)
  3. return os.execute("cp -rf "..path.." "..to);
  4. end
  5. 参数说明:
  6. 1path为待复制文件的路径,支持*通配符。
  7. 2to为要复制到的文件路径,注意先判断是否有重名文件或文件夹。
  8. 如要复制log.txtscripts/test.lua,则输入:
  9. copy("/var/touchelf/log.txt","/var/touchelf/scripts/test.lua");
  1. --创建文件夹
  2. function newfolder(path)
  3. return os.execute("mkdir "..path);
  4. end
  5. 参数说明:path为要创建文件夹的路径。
  6. 如要创建test文件夹,则输入:
  7. newfolder("/var/touchelf/scripts/test");
  1. --创建文件
  2. function newfile(path)
  3. return os.execute("touch "..path);
  4. end
  5. 参数说明:path为要创建文件的路径。
  6. 如要创建test.lua文件,则输入:
  7. newfile("/var/touchelf/scripts/test.lua");
  1. --获取文件相关信息
  2. function main()
  3. path="/var/touchelf/scripts/test.lua"
  4. f=io.file(path) --获取文件
  5. notifyMessage(f:size()) --显示文件大小
  6. if f:chown("root") then --改变文件所有者
  7. notifyMessage(f:chown()) --显示文件所有者
  8. end
  9. if f:chmod(777) then --改变文件权限
  10. notifyMessage(f:chmod()) --显示文件权限
  11. end
  12. notifyMessage(f:time()) --显示文件修改时间
  13. end
  14. function io.file(path)
  15. local _={}
  16. function _:chmod(mode)
  17. if mode then
  18. return os.execute("chmod "..mode.." "..path)
  19. else
  20. return string.sub(io.popen("ls -l "..path):read("*l"),2,10)
  21. end
  22. end
  23. function _:chown(mode)
  24. if mode then
  25. return os.execute("chown "..mode.." "..path)
  26. else
  27. return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",2).."([^ ]+)")
  28. end
  29. end
  30. function _:size()
  31. return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",4).."([^ ]+)")
  32. end
  33. function _:time()
  34. return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",5).."("..string.rep("[^ ]+[ ]+",3)..")")
  35. end
  36. return _
  37. end
  1. --解压zip文件
  2. function unzip(path,to)
  3. return os.execute("unzip "..path.." -d "..to);
  4. end
  5. 参数说明:
  6. 1path为待解压文件的路径。
  7. 2to为要解压到的文件夹路径,默认不覆盖。
  8. 如要解压test.zip的文件,则输入:
  9. unzip("/var/touchelf/scripts/test.zip","/var/touchelf/scripts/");
  10. 补充:使用-P可以实现带密码解压,load()、dofile()可以运行字符串或脚本文件。

"io库"的相关应用

  1. --读取指定文件所有内容,返回一个数组
  2. function readFile(path)
  3. local file = io.open(path,"r");--用读模式打开一个文件
  4. if file then
  5. local _list = {};
  6. for l in file:lines() do
  7. table.insert(_list,l)
  8. end
  9. file:close();--关闭默认的输出文件
  10. return _list
  11. end
  12. end
  13. list = readFile("/var/touchelf/scripts/test.txt");
  14. 参数说明:path为要读取文件的路径。
  15. 返回值:返回一个table

io.open按指定的模式打开一个文件,成功则返回文件句柄,失败则返回nil。
常用模式:
"r": 读模式 (默认);
"w": 写模式;
"a": 添加模式;
"r+": 更新模式,所有之前的数据将被保存
"w+": 更新模式,所有之前的数据将被清除
"a+": 添加更新模式,所有之前的数据将被保存,只允许在文件尾进行添加
flie:lines()打开指定的文件为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,并自动关闭文件

  1. --遍历文件
  2. function list(path)
  3. return io.popen("ls "..path);
  4. end
  5. 参数说明:path为要列举文件的文件夹的路径,支持*通配符。
  6. 如要列举scripts文件夹下所有的脚本文件,则输入:
  7. list("/var/touchelf/scripts/")
  8. 返回值:文件,请用read()函数读取,文件结构为各文件的文件名并以\n连接的字符串,如使用通配符,则还包含父文件夹名。
  1. --查找文件
  2. function find(path)
  3. return io.popen("find "..path.." -prune");
  4. end
  5. 参数说明:path为要查找文件的路径,支持*通配符。
  6. 如要查找后缀为.lua的文件,则输入:
  7. find("/var/touchelf/scripts/*.lua")
  8. 返回值:文件,请用read()函数读取,文件结构为各文件的完整路径并以\n连接的字符串。
  1. ----检测指定文件是否存在
  2. function file_exists(file_name)
  3. local f = io.open(file_name, "r")
  4. return f ~= nil and f:close()
  5. end
  6. 参数说明:path为要查找文件的路径。
  7. 返回值:返回 truefalse
  8. if file_exists("/var/touchelf/scripts/test.lua") then
  9. notifyMessage("Yes");
  10. else
  11. notifyMessage("No");
  12. 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://pan.baidu.com/s/1mie6hIC
将cURL模块放入/system/bin/内

IOS系统Cydia内搜索并下载安装cURL软件。

完成上述内容即可使用cURL命令

  1. --下载脚本
  2. os.execute("curl -o /var/touchelf/scripts/evan.lua.E2 http://www.touchel.com/evan.lua.E2")
  3. --post命令
  4. os.execute("curl -d 'user=evan&password=12345' http://www.touchelf.com/login.php")

更多cURL命令请自行百度。

触摸精灵模拟物理按键的方法

  1. ====================
  2. 1. 模拟物理按键
  3. ====================
  4. os.execute("input keyevent 按键键码")
  5. 列子:
  6. 按下home
  7. os.execute("input keyevent 3")
  8. 打电话给10086
  9. os.execute("input keyevent 5") --按拨号键
  10. os.execute("input text \"10086\"") --输入10086
  11. os.execute("input keyevent 5") --按拨号键打通
  12. 以下就是约定的按键键码:
  13. AKEYCODE_UNKNOWN = 0,
  14. AKEYCODE_SOFT_LEFT = 1,
  15. AKEYCODE_SOFT_RIGHT = 2,
  16. AKEYCODE_HOME = 3,
  17. AKEYCODE_BACK = 4,
  18. AKEYCODE_CALL = 5,
  19. AKEYCODE_ENDCALL = 6,
  20. AKEYCODE_0 = 7,
  21. AKEYCODE_1 = 8,
  22. AKEYCODE_2 = 9,
  23. AKEYCODE_3 = 10,
  24. AKEYCODE_4 = 11,
  25. AKEYCODE_5 = 12,
  26. AKEYCODE_6 = 13,
  27. AKEYCODE_7 = 14,
  28. AKEYCODE_8 = 15,
  29. AKEYCODE_9 = 16,
  30. AKEYCODE_STAR = 17,
  31. AKEYCODE_POUND = 18,
  32. AKEYCODE_DPAD_UP = 19,
  33. AKEYCODE_DPAD_DOWN = 20,
  34. AKEYCODE_DPAD_LEFT = 21,
  35. AKEYCODE_DPAD_RIGHT = 22,
  36. AKEYCODE_DPAD_CENTER = 23,
  37. AKEYCODE_VOLUME_UP = 24,
  38. AKEYCODE_VOLUME_DOWN = 25,
  39. AKEYCODE_POWER = 26,
  40. AKEYCODE_CAMERA = 27,
  41. AKEYCODE_CLEAR = 28,
  42. AKEYCODE_A = 29,
  43. AKEYCODE_B = 30,
  44. AKEYCODE_C = 31,
  45. AKEYCODE_D = 32,
  46. AKEYCODE_E = 33,
  47. AKEYCODE_F = 34,
  48. AKEYCODE_G = 35,
  49. AKEYCODE_H = 36,
  50. AKEYCODE_I = 37,
  51. AKEYCODE_J = 38,
  52. AKEYCODE_K = 39,
  53. AKEYCODE_L = 40,
  54. AKEYCODE_M = 41,
  55. AKEYCODE_N = 42,
  56. AKEYCODE_O = 43,
  57. AKEYCODE_P = 44,
  58. AKEYCODE_Q = 45,
  59. AKEYCODE_R = 46,
  60. AKEYCODE_S = 47,
  61. AKEYCODE_T = 48,
  62. AKEYCODE_U = 49,
  63. AKEYCODE_V = 50,
  64. AKEYCODE_W = 51,
  65. AKEYCODE_X = 52,
  66. AKEYCODE_Y = 53,
  67. AKEYCODE_Z = 54,
  68. AKEYCODE_COMMA = 55,
  69. AKEYCODE_PERIOD = 56,
  70. AKEYCODE_ALT_LEFT = 57,
  71. AKEYCODE_ALT_RIGHT = 58,
  72. AKEYCODE_SHIFT_LEFT = 59,
  73. AKEYCODE_SHIFT_RIGHT = 60,
  74. AKEYCODE_TAB = 61,
  75. AKEYCODE_SPACE = 62,
  76. AKEYCODE_SYM = 63,
  77. AKEYCODE_EXPLORER = 64,
  78. AKEYCODE_ENVELOPE = 65,
  79. AKEYCODE_ENTER = 66,
  80. AKEYCODE_DEL = 67,
  81. AKEYCODE_GRAVE = 68,
  82. AKEYCODE_MINUS = 69,
  83. AKEYCODE_EQUALS = 70,
  84. AKEYCODE_LEFT_BRACKET = 71,
  85. AKEYCODE_RIGHT_BRACKET = 72,
  86. AKEYCODE_BACKSLASH = 73,
  87. AKEYCODE_SEMICOLON = 74,
  88. AKEYCODE_APOSTROPHE = 75,
  89. AKEYCODE_SLASH = 76,
  90. AKEYCODE_AT = 77,
  91. AKEYCODE_NUM = 78,
  92. AKEYCODE_HEADSETHOOK = 79,
  93. AKEYCODE_FOCUS = 80, // *Camera* focus
  94. AKEYCODE_PLUS = 81,
  95. AKEYCODE_MENU = 82,
  96. AKEYCODE_NOTIFICATION = 83,
  97. AKEYCODE_SEARCH = 84,
  98. AKEYCODE_MEDIA_PLAY_PAUSE= 85,
  99. AKEYCODE_MEDIA_STOP = 86,
  100. AKEYCODE_MEDIA_NEXT = 87,
  101. AKEYCODE_MEDIA_PREVIOUS = 88,
  102. AKEYCODE_MEDIA_REWIND = 89,
  103. AKEYCODE_MEDIA_FAST_FORWARD = 90,
  104. AKEYCODE_MUTE = 91,
  105. AKEYCODE_PAGE_UP = 92,
  106. AKEYCODE_PAGE_DOWN = 93,
  107. AKEYCODE_PICTSYMBOLS = 94,
  108. AKEYCODE_SWITCH_CHARSET = 95,
  109. AKEYCODE_BUTTON_A = 96,
  110. AKEYCODE_BUTTON_B = 97,
  111. AKEYCODE_BUTTON_C = 98,
  112. AKEYCODE_BUTTON_X = 99,
  113. AKEYCODE_BUTTON_Y = 100,
  114. AKEYCODE_BUTTON_Z = 101,
  115. AKEYCODE_BUTTON_L1 = 102,
  116. AKEYCODE_BUTTON_R1 = 103,
  117. AKEYCODE_BUTTON_L2 = 104,
  118. AKEYCODE_BUTTON_R2 = 105,
  119. AKEYCODE_BUTTON_THUMBL = 106,
  120. AKEYCODE_BUTTON_THUMBR = 107,
  121. AKEYCODE_BUTTON_START = 108,
  122. AKEYCODE_BUTTON_SELECT = 109,
  123. AKEYCODE_BUTTON_MODE = 110,

触摸精灵安卓启动APK直达某些页面的方法

  1. os.execute("am start -n {包(package)名} / {包名}.{活动(activity)名称}")

包名package和活动activity名称可以反编译apk后,在每个apk的AndroidManifest.xml里面查看。

示例:

  1. 启动计算器
  2. os.execute("am start -n com.android.calculator2/com.android.calculator2.Calculator")
  3. AlarmClock(闹钟)的启动方法为:
  4. os.execute("am start -n com.android.alarmclock/com.android.alarmclock.AlarmClock")
  5. 启动浏览器 :
  6. os.execute("am start -a android.intent.action.VIEW -d http://www.google.cn/ ")
  7. 拨打电话给10086 :
  8. os.execute("am start -a android.intent.action.CALL -d tel:10086")
  9. 启动 google map 直接定位到北京 :
  10. os.execute("am start -a android.intent.action.VIEW geo:0,0?q=beijing")
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注