[关闭]
@xxzhushou 2017-01-09T01:38:24.000000Z 字数 44325 阅读 58307

叉叉脚本开发手册

引擎版本:1.6.0

前言

  叉叉脚本使用 Lua 语言进行编写,支持Lua的所有语法与基本函数,配合叉叉脚本特有的函数命令,实现找图、找色、触摸等高级功能。
  编写脚本前请先学习 lua 的基本语法。
  Lua官方手册:http://www.lua.org/manual/5.1/
  Lua中文开发手册:http://book.luaer.cn/
  叉叉开发者平台:http://dev.xxzhushou.cn/

特别注意:

1.由于安全性方面的考虑,以下函数在叉叉脚本中不予以支持:
debub库所有函数、io.tmpfile、io.popen、os.execute、os.exit、os.remove、os.rename、os.tmpname
2.io.open的用法比较特殊,参数中不能填写具体路径,只能是文件名,比如:
io.open('aa.txt') 是正确的,io.open('../../../aa.txt')则运行会报错。
另外,io库支持公共文件夹,比如io.input('[public]xx.txt'),就会在[temp]/public下读取xx.txt这个文件。

公共文件夹路径:

脚本文件格式支持说明:

叉叉助手 开发助手 说明 生成方式
xsp0 不支持 支持 主要用于开发调试,没有加密处理 IDE生成或者打包工具
xsp1 支持 支持 主要用于不开源的脚本免费分享,有加密处理 上传后台直接加密
xsp2 支持 不支持 在国内开发者平台上架后,下载到叉叉助手,动态加密 在用户下载时生成

- xsp0
xsp0文件包复制到移动设备对应开发助手脚本存放目录中即可本地运行,开发助手本地脚本存放目录: Android:/sdcard/xsp/
iOS(开发助手版本>= 1.0.10):/var/mobile/Library/XXIDEHelper/xsp/
iOS(开发助手版本<1.0.10):/Library/ApplicationSupport/XXIDEHelper/xsp/ 保存成功后,进入开发助手客户端“本地脚本”列表即可运行保存好的脚本
 *
- xsp1
xsp1文件包复制到移动设备对应叉叉助手存放目录中即可本地运行,叉叉助手本地脚本存放目录: Android:/sdcard/com.xxAssistant/script/
iOS(叉叉版本>=2.5.0): /var/mobile/Library/XXAssistant/Lua/LocalLuas/
iOS(叉叉版本<2.5.0): /Library/ApplicationSupport/XXAssistant/Lua/LocalLuas/
保存成功后,进入叉叉客户端“我的”tab启动应用,打开悬浮窗即可运行保存好的脚本

 *iOS可使用ifunbox等工具将脚本文件复制到设备

函数:init 初始化

函数功能:脚本使用触摸函数前必须调用,以指定应用程序以及坐标系
函数语法:
  init(appid, rotate)

参数说明:

参数 类型 说明
appid 文本型 目标程序的应用ID,当填写"0"时,自动使用当前运行的应用
rotate 整数型 屏幕方向,0 - 竖屏, 1 - Home键在右边, 2 - Home键在左边

返回值:无

脚本实例:

  1. init("com.apple.Music", 0); --以应用 "com.apple.Music" 竖屏初始化
  2. init("0", 1); --以当前应用 Home 键在右初始化

函数:touchDown 触摸按下

函数功能:发送触摸事件
函数语法:
  touchDown(index, x, y)

参数说明:

参数 类型 说明
index 整数型 手指序号,用于多点触控中标记多只手指,分别控制它们的移动
x,y 整数型 屏幕坐标

返回值:无

脚本实例:

  1. touchDown(1, 150, 150) --ID1的手指在坐标(150,150)处按下
  2. mSleep(200) --延时200毫秒
  3. touchUp(1, 150, 150) --ID1的手指抬起
  1. function tap(x, y)
  2. touchDown(0, x, y);
  3. mSleep(200);
  4. touchUp(0, x, y);
  5. end
  6. tap(100,100); --调用:点击坐标为100,100的点

注意事项:

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

函数:touchMove 移动

函数功能:发送触摸事件
函数语法:
  touchMove(index, x, y)

参数说明:

参数 类型 说明
index 整数型 手指序号,用于多点触控中标记多只手指,分别控制它们的移动
x,y 整数型 屏幕坐标

返回值:无

脚本实例:

  1. touchDown(1, 150, 150); --ID1的手指在 (150, 150) 按下
  2. mSleep(50);
  3. touchMove(1, 150, 400); --移动到 (150, 400)
  4. mSleep(50);
  5. touchUp(1, 150, 400); --在 (150, 400) 抬起
  1. touchDown(1, 150, 550); --在 (150, 550) 按下
  2. for i = 0, 200, 10 do --使用for循环连续滑动
  3. touchMove(1, 150 + i, 550);
  4. mSleep(150); --延迟
  5. end
  6. touchUp(1, 150 + 200, 550); --在 (350, 550) 抬起
  1. touchDown(1, 100, 100); --ID1的手指在 (100, 100) 按下
  2. touchDown(2, 300, 500); --ID2的手指在 (300, 500) 按下
  3. mSleep(50);
  4. for i = 1, 100, 1 do --使用 for 循环使两只手指向不同方向分离
  5. touchMove(1, 200 - i, 400 - i);
  6. touchMove(2, 300 + i, 500 + i);
  7. mSleep(50);
  8. end
  9. touchUp(1, 200 - 100, 400 - 100);
  10. touchUp(2, 300 + 100, 500 + 100); --分别抬起2只手指

注意事项:

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

函数:touchUp 触摸抬起

函数功能:发送触摸事件
函数语法:
  touchUp(index, x, y)

参数说明:

参数 类型 说明
index 整数型 手指序号,用于多点触控中标记多只手指,分别控制它们的移动
x,y 整数型 屏幕坐标

返回值:无

脚本实例:

  1. touchDown(1, 150, 150); --ID1的手指在 (150, 150) 按下
  2. mSleep(50);
  3. touchMove(1, 150, 400); --移动到 (150, 400)
  4. mSleep(50);
  5. touchUp(1, 150, 400); --在 (150, 400) 抬起
  1. touchDown(1, 150, 550); --在 (150, 550) 按下
  2. for i = 0, 200, 10 do --使用for循环连续滑动
  3. touchMove(1, 150 + i, 550);
  4. mSleep(150); --延迟
  5. end
  6. touchUp(1, 150 + 200, 550); --在 (350, 550) 抬起
  1. touchDown(1, 100, 100); --ID1的手指在 (100, 100) 按下
  2. touchDown(2, 300, 500); --ID2的手指在 (300, 500) 按下
  3. mSleep(50);
  4. for i = 1, 100, 1 do --使用 for 循环使两只手指向不同方向分离
  5. touchMove(1, 200 - i, 400 - i);
  6. touchMove(2, 300 + i, 500 + i);
  7. mSleep(50);
  8. end
  9. touchUp(1, 200 - 100, 400 - 100);
  10. touchUp(2, 300 + 100, 500 + 100); --分别抬起2只手指

注意事项:

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

函数:catchTouchPoint 获取用户点击坐标

函数功能:调用该函数后,将等待用户完成一次或多次屏幕点击,并返回点击的坐标
函数语法:
  results = catchTouchPoint(touchCount)
  x,y = catchTouchPoint()

参数说明:

参数 类型 说明
touchCount 整数型 所需获取的 点/坐标 个数
返回值 类型 说明
x,y 整数型 单次点击时,返回该点击对应的屏幕坐标
results table型 当touchCount参数有效时,将返回一个包含所有点击坐标的table

脚本实例:

  1. dialog("请点击屏幕一次", 0);
  2. x,y = catchTouchPoint();
  3. mSleep(1000);
  4. dialog("x:"..x.." y:"..y, 0);
  1. local results = catchTouchPoint(3);
  2. for i = 1, #results do
  3. sysLog("第"..i.."个坐标为:"..i..",x="..results[i].x..",y="..results[i].y);
  4. end

注意事项:

1.此函数触发后将一直等待用户完成屏幕点击,并阻止脚本继续运行。
2.此函数获取到的坐标为竖屏坐标,横屏情况需要自行转换。
3.此函数有较小的延迟,连续点击时,请勿点击过快。

函数:findColorInRegionFuzzy 模糊区域找色

函数功能:在指定区域中,寻找符合指定颜色的坐标,模糊查找。
函数语法:
  x, y = findColorInRegionFuzzy(color, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整数型 将要找的十六进制颜色值
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1,y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
x,y 整数型 找到的点坐标,如未找到则返回 -1,-1

脚本实例:

  1. x, y = findColorInRegionFuzzy(0x112233, 100, 50, 50, 300, 300);
  2. if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点
  3. touchDown(1, x, y); --点击该点
  4. mSleep(50)
  5. touchUp(1, x, y);
  6. else --如找不到符合条件的点
  7. dialog("没找到你要的坐标呢",0);
  8. end
  1. for deg = 100, 70, -1 do --使用 for 循环不断降低精确度
  2. x, y = findColorInRegionFuzzy(0xffffff, deg, 50, 50, 300, 300);
  3. if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点
  4. touchDown(1, x, y); --点击该点
  5. mSleep(50)
  6. touchUp(1, x, y);
  7. break; --跳出循环
  8. end
  9. end
  10. dialog("噢天哪!还是没找到",0);

注意事项:

1.未找到则返回 (-1, -1) ,所以找到时 x, y 均不等于 -1,~= 为不等于操作符,是 Lua 基本语法, 属于逻辑控制。
2.该代码应用过程中,建议使用"保持屏幕"优化找色速度。

函数:findMultiColorInRegionFuzzy 区域多点找色

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找
函数语法:
  x, y = findMultiColorInRegionFuzzy(color, posandcolor, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整型 欲寻找的参照点颜色
posandcolor 文本型 周边点颜色参数
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1, y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
x, y 整数型 返回符合条件的参照点的坐标,如未找到则返回 -1,-1

脚本实例:
使用“区域模糊找色”函数时,常常会因为屏幕上有大量符合指定颜色的点而不能找到需要的坐标。该函数通过在寻找到一个符合指定颜色color的坐标后,进一步确认其周边点坐标的方式,来确定准确目标。例如,现在我们在图像上找到了我们需要的一个按钮,这个按钮的样式是不变的,但是它的整体位置却会在整个屏幕上变化,现在我们想要在脚本运行时得到其坐标。

首先确定一个参照点:
颜色为 0x181F85,坐标为 (268, 802),下表序号1。
记录下来,继续寻找周边的几个参照点,以及与第一个参照点的相对坐标,分别为下表序号2~4:

现在我们找到了需要的所有参照点:

序号 颜色 坐标 相对坐标
1 0x181F85 (268, 802) (0, 0)
2 0x00BBFE (297, 803) (29, 1)
3 0x0B6BBE (371, 798) (103, -4)
4 0x150972 (333, 811) (65, 9)

应用上述坐标写成多点找色脚本:

  1. x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE,103|-4|0x0B6BBE,65|9|0x150972", 100, 0, 0, 639, 959);

注意事项:

1.posandcolor 参数中的坐标为相对坐标。
2.颜色值的十六进制文本中,其顺序为RGB。
3.相对于第一个点的坐标,即用这个点的横坐标、纵坐标分别减去第一个点的横坐标、纵坐标,可以为负数。
4.使用此函数时精度参数设置过低,会导致性能大幅下降。

函数:findMultiColorInRegionFuzzy2 区域多点找色

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找
函数语法:
  x, y = findMultiColorInRegionFuzzy2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整型 欲寻找的参照点颜色
posandcolor table型 周边点颜色参数
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1, y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
x, y 整数型 返回符合条件的参照点的坐标,如未找到则返回 -1,-1

脚本实例:
该函数是区域多点找色函数findMultiColorInRegionFuzzy的增强版,将周边参照点的颜色及相对坐标写成table的形式,更方便动态调整。

  1. x, y = findMultiColorInRegionFuzzy2(0x181F85, {{x=29, y=1, color=0x00BBFE},{x=103,y=- 4,color=0x0B6BBE},{x=65,y=9,color=0x150972}}, 100, 0, 0, 639, 959)

函数:findMultiColorInRegionFuzzyExt 高级区域多点找色

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找
函数语法:
  point = findMultiColorInRegionFuzzyExt(color, posandcolor, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整型 欲寻找的参照点颜色
posandcolor 文本型 周边点颜色参数
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1, y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
point table类型 以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空

返回的 table 为key-value的形式,如下:
table = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}

脚本实例:

  1. point = findMultiColorInRegionFuzzyExt(0xcf0000,"-37|3|0x942814,-38|20|0xeba62d,1|54|0xf2b054,28|22|0x8a5707", 90, 97, 220, 903, 701)
  2. if #point ~= 0 then --如果找到符合条件的点
  3. for var = 1,#point do
  4. sysLog(point[var].x..":"..point[var].y)
  5. end
  6. end

注意事项:

1.高级区域多点找色函数目前最多支持返回99个点。

函数:findMultiColorInRegionFuzzyExt2 高级区域多点找色

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找
函数语法:
  point = findMultiColorInRegionFuzzyExt2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数 类型 说明
color 整型 欲寻找的参照点颜色
posandcolor table型 周边点颜色参数
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1, y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
hdir 整数型 水平搜索方向,0表示从左到右,1表示从右到左,默认为0
vdir 整数型 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0
返回值 类型 说明
point table类型 以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空

返回的 table 为为key-value的形式,如下:
table = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}

脚本实例:
该函数是高级区域多点找色函数findMultiColorInRegionFuzzyExt的增强版,将周边参照点的颜色及相对坐标写成table的形式,更方便动态调整。

  1. point = findMultiColorInRegionFuzzyExt2(0xcf0000, {{x=-37,y=3,color=0x942814},{x=-38,y=20,color=0xeba62d},{x=1,y=54,color=0xf2b054},{x=28,y=22,color=0x8a5707}}, 90, 97, 220, 903, 701)
  2. if #point ~= 0 then
  3. for var = 1,#point do
  4. sysLog(point[var].x..":"..point[var].y)
  5. end
  6. end

注意事项:

1.高级区域多点找色函数目前最多支持返回99个点。

函数:getColor 获取屏幕某点颜色值

函数功能:获取屏幕某点颜色值
函数语法:
  color = getColor(x, y)

参数说明:

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

脚本实例:

  1. if getColor(100, 100) == 0xffffff then
  2. touchDown(1, 100, 100);
  3. touchUp(1, 100, 100);
  4. end

注意事项:

getColor函数获得的颜色值十六进制文本中,实际顺序为RGB

函数:getColorRGB 获取颜色RGB值

函数功能:获取屏幕某点颜色值R,G,B 值。
函数语法:
  color_r, color_g, color_b = getColorRGB(x, y)

参数说明:

参数 类型 说明
x,y 整数型 将获取颜色值的屏幕坐标
返回值 类型 说明
color_r, color_g, color_b 整数型 该点颜色的RGB值

脚本实例:

  1. r,g,b = getColorRGB(100,100); --获取该点的R,G,B
  2. if r > 200 and b < 150 then --判断颜色强度
  3. touchDown(1,100,100);
  4. touchUp(1,100,100);
  5. end
  1. function isColor(x,y,c,s) --x,y为坐标值,c为颜色值,s为相似度,范围0~100
  2. local fl,abs = math.floor,math.abs
  3. s = fl(0xff*(100-s)*0.01)
  4. local r,g,b = fl(c/0x10000),fl(c%0x10000/0x100),fl(c%0x100)
  5. local rr,gg,bb = getColorRGB(x,y)
  6. if abs(r-rr)<s and abs(g-gg)<s and abs(b-bb)<s then
  7. return true
  8. end
  9. return false
  10. end
  11. if isColor(963, 961, 0x7b593f,90) then touchDown(963, 961)
  12. mSleep(50)
  13. touchUp(963, 961)
  14. end

函数:findImageInRegionFuzzy 模糊区域找图

函数功能:在指定区域中,寻找指定的图案,返回其左上角顶点坐标,支持模糊查找。
函数语法:
  x, y = findImageInRegionFuzzy(picpath, degree, x1, y1, x2, y2, alpha)

参数说明:

参数 类型 说明
picpath 文本型 将要寻找的图片文件名
degree 整数型 寻找精度,范围:1 ~ 100,当是100时为完全匹配
x1,y1 整数型 欲寻找的区域左上角顶点屏幕坐标
x2,y2 整数型 欲寻找的区域右下角顶点屏幕坐标
alpha 整数型 忽略的颜色值(透明色) 若无请填 0
返回值 类型 说明
x,y 整数型 找到的图片的左上角顶点坐标,如未找到则返回 -1,-1

脚本实例:

  1. x, y = findImageInRegionFuzzy("test_alpha.png", 100, 0, 0, 320, 480, 0xffffff);
  2. if x ~= -1 and y ~= -1 then --忽略背景色白色的情况下找到符合条件的图片则点击
  3. touchDown(1, x, y);
  4. mSleep(50)
  5. touchUp(1, x, y);
  6. else --如果没找到符合条件的
  7. dialog("没找到 ╮(╯▽╰)╭",0);
  8. end

函数:snapshot 截图

函数功能:截取屏幕中指定区域的图像并生成指定格式的图片文件
函数语法:
  snapshot(picname, x1, y1, x2, y2, quality)

参数说明:

参数 类型 说明
picname 文本型 截图保存的文件名
x1,y1 整数型 欲截取的区域左上角顶点屏幕坐标
x2,y2 整数型 欲截取的区域右下角顶点屏幕坐标
quality 数字型 当截图格式选为jpg时,可用此参数控制图片质量,此参数值为大于0且小于等于1的值

返回值:无

脚本实例:

  1. current_time = os.date("%Y-%m-%d", os.time());
  2. snapshot(current_time..".png", 0, 0, 1079, 1919); --截图并以当前时间戳命名
  3. snapshot('[public]'..i..".jpg", 0, 0, 1079, 1919, 0.9); --使用jpg格式截图,质量为0.9

注意事项:

1.保存图片的格式可为 bmp, jpg, png,推荐选择 png。
2.截图时,如使用全屏截图,右下角顶点坐标最大为当前分辨率最大值,否则会出现越界错误。
3.默认图片路径为脚本私有文件夹,文件相同将会被覆盖
4.本文实例中 os.date 与 os.time 为 Lua 基本库函数,请查阅附录 Lua 操作系统函数库。
5.".." 为字符串连接操作符,可以将字符串变量、常量连接在一起。
6.截图保存路径:
android: /data/data/com.xxAssistant/cache
iOS(叉叉版本>=2.5.0):/var/mobile/Library/XXAssistant/Lua/Luas/Temp
iOS(叉叉版本<2.5.0):/Library/Application Support/XXAssistant/Lua/Luas/Temp
7.公共目录路径:
android: /data/data/com.xxAssistant/cache/public
iOS(叉叉版本>=2.5.0):/var/mobile/Library/XXAssistant/Lua/Luas/Temp/public
iOS(叉叉版本<2.5.0):/Library/Application Support/XXAssistant/Lua/Luas/Temp/public
8.引擎1.3.0版本增加对公共目录[public]访问支持,截图方向跟随init

函数:keepScreen 保持屏幕

函数功能:函数功能:在脚本中保持当前屏幕内容不变,多次调用取色、找色、截图、找图等函数时,直接调用保持的屏幕内容。该函数主要用于优化找图找色函数的效率。
函数语法:
  keepScreen(flag)

参数说明:

参数 类型 说明
flag 逻辑型 保持开关

返回值:无

脚本实例:

  1. keepScreen(true);
  2. for k = 1, 640, 10 do
  3. for j = 1, 960, 10 do
  4. --格式化颜色为十六进制文本
  5. color = string.format("%X", getColor(k, j));
  6. --输出系统日志
  7. sysLog("("..k..", "..j..") Color: "..color..".");
  8. end
  9. end
  10. keepScreen(false);

函数:inputText 输入字符串

函数功能:向输入框中输入文本
函数语法:
  inputText(string)

参数说明:

参数 类型 说明
string 文本型 将输入的文本以及控制字符

返回值:无

脚本实例:

  1. touchDown(150,150); --点击输入框获取焦点(假设已知输入框坐标150,150
  2. mSleep(50)
  3. touchUp(150,150);
  4. mSleep(1000);
  5. inputText("#CLEAR#") --删除输入框中的文字(假设输入框中已存在文字)
  6. inputText("Welcome.#ENTER#"); --在输入框中输入字符串"Welcome."并回车

注意事项:

1.使用该函数前,必须先点击输入框获取焦点(指使当前的输入光标停留在某一输入框中)。
2.iOS系统上,该函数不支持第三方输入法(指百度输入法、搜狗输入法等),请切换到系统内置输入法方可使用,对于弹出的窗口,需要先初始化再使用该函数,例如 App Store登录窗口(该窗口识别ID 为"com.apple.springboard"),安卓则无此限制。。
3.可使用控制字符,包括 \n、\r、#ENTER#、#CLEAR#;#CLEAR#表示清空,需要注意的是,#ENTER#并非支持在所有应用中使用。

函数:createOcrDict 加载自定义的点阵字库

函数功能:加载自定义的点阵字库
函数语法:
  index = createOcrDict(dict)

参数说明:

参数 类型 说明
dict 文本型/table型 字库名,如:dict.txt,需放置于脚本内 res 目录;或table型字库编码
返回值 类型 说明
index 整数型 字库标识,由 createOcrDict 函数返回值生成,ocrText第一个参数需要用到此值

脚本实例:

  1. lines = {}
  2. lines[1] = 'FFFFFC000000000000000000000001FFF$u$0.0.56$15'
  3. lines[2] = 'FFFFFC$l$0.0.42$21'
  4. lines[3] = '10EE1B06608811062084108218C1FF8FF$a$0.1.77$15'
  5. lines[4] = 'FFFFFC03008030040080100200600F00F$h$0.0.71$21'
  6. lines[5] = '0040080100200400801002FFFFFC010020040080100200400800400$王$4.2.83$21'
  7. lines[6] = '1FE200400801002007F8000000000080601804030300E002002001001001001001$哈$0.1.118$26'
  8. local dict = createOcrDict(lines)
  9. --或者可以写成这样的形式 local dict = createOcrDict("dict.txt")
  10. result = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020","0x797979-0x202020"}, 100, 0, 0) -- 表示范围内全部搜索,以字符串形式返回识别结果
  11. sysLog('result: ' .. result)
  12. results = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020"}, 100, 1, 1) -- 表示范围内横向搜索,以table形式返回识别到的所有结果及其坐标
  13. for k,v in pairs(results) do
  14. sysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))
  15. end

注意事项:

1.ocr函数不支持多分辨率,不受setScreenScale影响
2.字库文件“dict.txt”需注意文本编码必须使用 UTF-8 格式,并放置于脚本内 res 目录
3.搜索方向横向或竖向时的检索规则为:从识别到第一个匹配结果开始给予该位置横向或竖向搜索,忽略选定区域内其他范围;合理使用搜索方向参数可有效提高ocr函数性能。

函数:ocrText 文字点阵化识别

函数功能:识别屏幕上的文字。
函数语法:
  result = ocrText(index, x1, y1, x2, y2, {"c0-c1"} , sim, flag, dir)

参数说明:

参数 类型 说明
index 整数型 字库标识,由 createOcrDict 函数返回值生成
x1, y1 整数型 识别区域左上角顶点屏幕坐标
x2, y2 整数型 识别区域右下角顶点屏幕坐标
c0, c1 文本型 偏色范围,由字库制作中获取,需要与制作字库时所设值保持一致,多组偏色用,分割
sim 整数型 精确度,范围 0 - 100
flag 整数型 表示选择返回结果的类型, 0 == 字符串形式返回识别结果,1 == table形式返回识别到的结果及其坐标
dir 整数型 选填项,表示识别方向,0 == 区域内全部搜索,1 == 横向搜索, 2 ==竖向搜索, 忽略此项则默认为0
返回值 类型 说明
result 文本型/table型 返回识别结果/返回识别到的结果及其坐标

脚本实例:

  1. lines = {}
  2. lines[1] = 'FFFFFC000000000000000000000001FFF$u$0.0.56$15'
  3. lines[2] = 'FFFFFC$l$0.0.42$21'
  4. lines[3] = '10EE1B06608811062084108218C1FF8FF$a$0.1.77$15'
  5. lines[4] = 'FFFFFC03008030040080100200600F00F$h$0.0.71$21'
  6. lines[5] = '0040080100200400801002FFFFFC010020040080100200400800400$王$4.2.83$21'
  7. lines[6] = '1FE200400801002007F8000000000080601804030300E002002001001001001001$哈$0.1.118$26'
  8. local dict = createOcrDict(lines)
  9. --或者可以写成这样的形式 local dict = createOcrDict("dict.txt")
  10. result = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020","0x797979-0x202020"}, 100, 0, 0) -- 表示范围内全部搜索,以字符串形式返回识别结果
  11. sysLog('result: ' .. result)
  12. results = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020"}, 100, 1, 1) -- 表示范围内横向搜索,以table形式返回识别到的所有结果及其坐标
  13. for k,v in pairs(results) do
  14. sysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))
  15. end

注意事项:

1.ocr函数不支持多分辨率,不受setScreenScale影响
2.字库文件“dict.txt”需注意文本编码必须使用 UTF-8 格式,并放置于脚本内 res 目录
3.搜索方向横向或竖向时的检索规则为:从识别到第一个匹配结果开始给予该位置横向或竖向搜索,忽略选定区域内其他范围;合理使用搜索方向参数可有效提高ocr函数性能。

函数:runApp 运行应用

函数功能:打开一个应用程序。
函数语法:
  flag = runApp(appid)

参数说明:

参数 类型 说明
appid 文本型 应用程序的应用ID
返回值 类型 说明
flag 整数型 0 == 应用启动成功;非0 == 应用启动失败

脚本实例:

  1. r = runApp("com.apple.Music");
  2. mSleep(10 * 1000); --等待程序响应
  3. if r == 0 then
  4. closeApp("com.apple.Music");
  5. else
  6. toast("启动应用失败",3);
  7. end

注意事项:

1.runApp函数需要系统响应时间,响应时间根据机型有所不同,调用此函数需做好延迟或判断。

函数:closeApp 关闭应用

函数功能:关闭一个应用程序。
函数语法:
  closeApp(appid)

参数说明:

参数 类型 说明
appid 文本型 应用程序的应用ID

返回值:无

脚本实例:

  1. r = runApp("com.apple.Music");
  2. mSleep(10 * 1000); --等待程序响应
  3. if r == 0 then
  4. closeApp("com.apple.Music");
  5. else
  6. toast("启动应用失败",3);
  7. end

函数:appIsRunning 检测应用是否运行

函数功能:检测应用是否运行
函数语法:
  flag = appIsRunning(appid)

参数说明:

参数 类型 说明
appid 文本型 目标应用程序的应用ID
返回值 类型 说明
flag 整数型 0 - 目标应用未运行;1 - 目标应用运行中

脚本实例:

  1. flag = appIsRunning("com.xxAssistant"); --检测叉叉助手是否在运行
  2. if flag == 0 then
  3. runApp("com.xxAssistant") --运行叉叉助手
  4. end

注意事项:

此函数将判断目标应用的运行状态,目标应用前台运行或者后台运行返回值都为 1。

函数:isFrontApp 判断是否为前台应用

函数功能:根据应用ID判断应用是否处于前台。
函数语法:
  flag = isFrontApp(appid)

参数说明:

参数 类型 说明
appid 文本型 待检测的应用程序的应用ID
返回值 类型 说明
flag 整数型 0 == 不在前台运行;1 == 在前台运行

脚本实例:

  1. while true do
  2. isfront = isFrontApp("com.xxAssistant"); --前台状态
  3. if isfront == 1 then
  4. break
  5. end
  6. toast("请打开叉叉助手");
  7. mSleep(3000)
  8. end

函数:frontAppName 获取前台应用识别ID

函数功能:获取前台应用程序的应用ID。
函数语法:
  appid = frontAppName()

参数说明:

返回值 类型 说明
appid 文本型 返回前台应用程序的应用ID,若无应用处于前台,则返回空字符串

脚本实例:

  1. appid = frontAppName();
  2. if appid ~= "com.apple.mobilesafari" then
  3. dialog("请打开 Safari 再运行该脚本!", 5);
  4. mSleep(3000);
  5. lua_exit();
  6. end

函数:showUI 自定义脚本界面

函数功能:显示一个自定义的界面,用来接收用户相关的自定义配置。
函数语法:
  ret,results = showUI(ui_json)

参数说明:

参数 类型 说明
ui_json 文本型 自定义界面json格式字符串,或UI目录下的json文件名称
返回值 类型 说明
ret 整数型 返回用户按下的按钮 0 - 取消;1 - 确定
results table类型 返回用户输入的多项数据

脚本界面说明

脚本界面通过json格式存储 ,以下是一个包含所有控件及其属性的例子:

  1. {
  2. "style" : "default",
  3. "config" : "save_111.dat",
  4. "width" : 700,
  5. "height" : 1080,
  6. "cancelname" : "Cancel",
  7. "okname" : "Let's Rock",
  8. "views" : [
  9. {
  10. "text" : "基本设置",
  11. "type" : "Page",
  12. "views" : [
  13. {
  14. "align" : "center",
  15. "color" : "0,0,225",
  16. "size" : "30",
  17. "text" : "设置:这是一行文本",
  18. "type" : "Label"
  19. },
  20. {
  21. "id" : "RadioGroup1",
  22. "list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7",
  23. "select" : "0",
  24. "size" : "30",
  25. "type" : "RadioGroup",
  26. "orientation" : "vertical" //选项排布方式为竖排
  27. },
  28. {
  29. "align" : "left",
  30. "color" : "0,100,0",
  31. "id" : "Edit1",
  32. "kbtype" : "number",
  33. "prompt" : "这是提示文本",
  34. "size" : "25",
  35. "text" : "这是预输入文本",
  36. "type" : "Edit"
  37. },
  38. {
  39. "id" : "CheckBoxGroup1",
  40. "list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7",
  41. "select" : "3@5",
  42. "size" : "30",
  43. "type" : "CheckBoxGroup",
  44. "orientation" : "horizontal" //选项排布方式为智能横排
  45. },
  46. {
  47. "id" : "ComboBox1",
  48. "list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7",
  49. "select" : "1",
  50. "size" : "30",
  51. "type" : "ComboBox"
  52. },
  53. {
  54. "src" : "b.png", //这是来源为本地文件的图片
  55. "type" : "Image"
  56. },
  57. {
  58. "src" : "http://www.baidu.com/img/bdlogo.png", //这是来源为网络地址的图片
  59. "type" : "Image"
  60. }
  61. ]
  62. },
  63. {
  64. "text" : "水平布局示例",
  65. "type" : "Page",
  66. "views" : [
  67. {
  68. "color" : "100,100,100",
  69. "size" : 30,
  70. "text" : "以下是水平布局排列的三个控件",
  71. "type" : "Label"
  72. },
  73. {
  74. "height" : 300,
  75. "width" : 700,
  76. "id" : "group1",
  77. "type" : "LinearLayout", //这是LinearLayout控件
  78. "valign" : "top",
  79. "views" : [
  80. //从这里开始是LinearLayout控件内部的子控件,不可嵌套LinearLayout控件,可添加LinearLayout、Page以外的所有控件
  81. {
  82. "color" : "100,100,100",
  83. "size" : 30,
  84. "text" : "选择",
  85. "type" : "Label",
  86. "width" : 100
  87. //LinearLayout控件内部的子控件均需要指定一个width属性,不指定则无法显示
  88. },
  89. {
  90. "id" : "checkboxgroup2",
  91. "list" : "选项1,选项2,选项3",
  92. "select" : "2@3@",
  93. "type" : "CheckBoxGroup",
  94. "width" : 180
  95. },
  96. {
  97. "id" : "4",
  98. "list" : "选项1,选项2,选项3,选项4,选项5",
  99. "select" : "1",
  100. "size" : 20,
  101. "type" : "ComboBox",
  102. "width" : 250
  103. }
  104. ]
  105. },
  106. {
  107. "color" : "100,100,100",
  108. "size" : 30,
  109. "text" : "以下是一张默认布局方式的图片,水平布局可与普通布局样式联合使用",
  110. //这里是一个Label,跟上面的LinearLayout同层级
  111. "type" : "Label",
  112. "width" : 100
  113. },
  114. {
  115. "src" : "b.png",
  116. "type" : "Image"
  117. },
  118. {
  119. "color" : "100,100,100",
  120. "size" : "30",
  121. "text" : "以下又是一个水平布局区域",
  122. //这里也是一个Label,跟上面的LinearLayout同层级
  123. "type" : "Label"
  124. },
  125. {
  126. //在同层级的情况下,可以多个LinearLayout联合使用,以下是第二个LinearLayout控件中的内容
  127. "height" : 400,
  128. "width" : 700,
  129. "id" : "group1",
  130. "type" : "LinearLayout",
  131. "valign" : "top",
  132. "views" : [
  133. {
  134. "color" : "100,100,100",
  135. "size" : 30,
  136. "text" : "右边是一张图片",
  137. "type" : "Label",
  138. "width" : 150
  139. },
  140. {
  141. "src" : "b.png",
  142. "type" : "Image",
  143. "width" : "400"
  144. }
  145. ]
  146. }
  147. ]
  148. },
  149. {
  150. "text" : "跳转示例",
  151. "type" : "Page",
  152. "views" : [
  153. {
  154. "color" : "100,110,200",
  155. "extra" : [ //附加属性指定
  156. {
  157. "goto" : "http://www.baidu.com", //跳转到网址
  158. "text" : "阅读原文"
  159. },
  160. {
  161. "goto" : "qq", //跳转到QQ咨询
  162. "text" : "1602127440"
  163. }
  164. ],
  165. "size" : 30,
  166. "text" : "阅读原文 QQ:1602127440",
  167. "type" : "Label"
  168. }
  169. ]
  170. }
  171. ]
  172. }

创建一个界面,需要包含style和views两个参数。

界面控件:
界面包含有8种控件:标签 Label,单选框 RadioGroup,编辑框 Edit,多选框CheckBoxGroup,下拉框 ComboBox,图片 Image,页面Page,水平布局LinearLayout。
例如一个标签控件的例子:

  1. {
  2. "type": "Label",
  3. "text": "设置",
  4. "size": 25,
  5. "align": "center",
  6. "color": "0,0,255"
  7. }

以上七种控件均可重复使用,这个界面的样式 style 为 default,即默认样式,这个样式下的控件将会自动排列,不需要指定其坐标。部分控件带有id参数,id不可重复,需要注意的是,涉及到用户操作的控件,其id参数为必填项。

  1. {
  2. "id" : "group1",
  3. "width" : 1780,
  4. "height" : 600,
  5. "type" : "LinearLayout",
  6. "views" : [
  7. {
  8. "color" : "100,110,200",
  9. "size" : 30,
  10. "text" : "标题栏",
  11. "type" : "Label",
  12. "width" : 100
  13. },
  14. {
  15. "id" : "checkboxgroup2",
  16. "list" : "选项1,选项2,选项3",
  17. "select" : "2@3@",
  18. "type" : "CheckBoxGroup",
  19. "width" : 250
  20. },
  21. {
  22. "id" : "4",
  23. "list" : "选项1,选项2,选项3,选项4,选项5",
  24. "select" : "1",
  25. "size" : 20,
  26. "type" : "ComboBox",
  27. "width" : 210
  28. }
  29. ]
  30. }

另一种界面style样式为 custom,当界面样式被指定为这种,则必须指定每个控件的 rect 属性以调整控件的尺寸以及位置,例如:

  1. {
  2. "type": "Edit", "size": 15, "align": "left",
  3. "prompt": "提示文字",
  4. "text": "默认文字",
  5. "color": "255,0,0",
  6. "rect": "0,0,100,40"
  7. }

函数:getUIContent 获取UI文件信息

函数功能:获取json文件中的内容
函数语法:
  content = getUIContent(string)

参数说明:

参数、返回值 类型 说明
string 文本型 脚本UI目录下json文件名称
content 文本型 所获取的json文件内容

脚本实例:

  1. --ui.json文件内具体内容如下
  2. {
  3. "style": "default",
  4. "config": "save.dat",
  5. "width": 400,
  6. "height": 300,
  7. "cancelname": "Quit",
  8. "okname": "Let's Rock!",
  9. "views": [
  10. {
  11. "type": "Page",
  12. "text": "settings",
  13. "views": [
  14. {
  15. "type": "Label",
  16. "text": "Settings",
  17. "size": 25,
  18. "align": "center",
  19. "color": "0,0,255",
  20. }
  21. ]
  22. }
  23. ]
  24. }
  1. --lua文件中示例如下
  2. local bb = require("badboy")
  3. local json = bb.json
  4. ret,results=showUI("ui.json"); --显示未更改的UI界面
  5. content = getUIContent("ui.json") --获得文件ui.json的内容
  6. lua_value = json.decode(content) --对获取到的json字符串解码
  7. lua_value.width = 500 --将ui窗口宽度赋值为500
  8. lua_value.height = 400 --将ui窗口宽度赋值为450
  9. showUI(json.encode(lua_value)) --重新编码json字符串,窗口将按照新设定的尺寸显示

注意事项:

1.badboy是专为叉叉脚本开发的开源工具库,具体使用方法参照对应章节

函数:getScreenSize 获取屏幕分辨率

函数功能:获取设备屏幕的分辨率,用来判断坐标系的使用。
函数语法:
  width,height = getScreenSize()

参数说明:

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

注意事项:

统一为竖直(Home 键在下方时)屏幕的宽度和高度。

函数:setScreenScale 设置屏幕缩放

函数功能:设置当前脚本开发环境的屏幕分辩率,使脚本适配不同分辩率的设备。
函数语法:
  setScreenScale(width, height, scale)

参数说明:

参数 类型 说明
width 整数型 脚本开发时使用的设备宽度
height 整数型 脚本开发时使用的设备高度
scale 整数型 返回坐标缩放参数, 默认为0; 0 - 返回的坐标进行反向缩放,1 - 返回的坐标不缩放

  该函数使脚本根据开发环境的屏幕分辩率和当前使用环境分辨率自动将脚本里XY坐标进行等比换算
  受影响命令包括:touchDown、touchUp、touchMove、findColorInRegionFuzzy、findMultiColorInRegionFuzzy、findMultiColorInRegionFuzzy2 、findMultiColorInRegionFuzzyExt、findMultiColorInRegionFuzzyExt2、getColor、getColorRGB、showHUD

脚本实例:
假设一名作者在540*960分辨率的手机中开发了脚本,要在720*1280的设备中运行

  1. setScreenScale(540,960) --或者setScreenScale(540,960,0)效果相同
  2. touchDown(0, 100, 200) --此处实际点击坐标为:100*(720/540),200*(1280/960)
  3. mSleep(50)
  4. touchMove(0, 100, 200) --此处实际移动坐标为:100*(720/540),200*(1280/960)
  5. mSleep(50)
  6. touchUp(0, 100, 200)
  7. x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE", 100, 0, 0, 400, 600)
  8. --此处实际查找范围为坐标(0,0)到(400*720/540,600*1280/960),同时坐标偏移也进行换算,即匹配首点x,y坐标后,再比对(x+29*720/540,y+1*1280/960)这个坐标是否为"0x00BBFE"
  9. if x~=-1 then
  10. touchDown(0, x, y) --第三参数为0或省略情况下返回的坐标为经过反向缩放的坐标,
  11. mSleep(100)
  12. touchUp(0, x, y)
  13. end

注意事项:

1.通分辨率取色要点:取色点周边颜色相近为佳,由于字体或图形边缘线的点就很可能由于缩放而消失,导致找色失败。
2.只适用等比例分辨率:例如540*960,720*1280都是9:16就可通用,而540*960与400*800的一般不通用。
3.在最小分辨率开发,同比例的大分辨可用。例如:540*960下开发的脚本,在720*1280可用,反过来,一般不能通用。

函数:mTime 获取Unix时间戳

函数功能:显示从1970年到现在经过的毫秒数
函数语法:
  t = mTime()

参数说明:

返回值 类型 说明
t 整数型 表示从1970年到现在经过的毫秒数

脚本实例:

  1. sysLog('mTime:' .. mTime())

函数:getNetTime 获取网络时间

函数功能:获取GMT时区从1970年到现在经过的毫秒数
函数语法:
  t = getNetTime()

参数说明:

返回值 类型 说明
t 整数型 表示网络时间GMT时区从1970年到现在经过的毫秒数,无网络情况下返回值为0

脚本实例:

  1. sysLog(NetTime:' .. getNetTime())

函数:pressHomeKey 模拟主屏幕按键

函数功能:模拟用户点击主屏幕按键的操作。
函数语法:
  pressHomeKey()

参数说明:
返回值:无

函数:doublePressHomeKey 双击HOME键

函数功能:模拟用户双击HOME键的操作,用于打开后台。
函数语法:
  doublePressHomeKey()

参数说明:
返回值:无

脚本实例:

  1. doublePressHomeKey();

函数:pressKey 导航栏按键

函数功能:模拟用户点击导航栏按键的操作,仅安卓适用
函数语法:
  ret = pressKey(keyname,mode)

参数说明:

参数/返回值 类型 说明
keyname 文本型 必填参数,为'BACK','MENU'和'HOME'三项之一
mode 逻辑型 可选参数,控制是否长按,true表示长按,false表示不长按
ret 文本型 返回值为0时表示成功

脚本实例:
ret = pressKey('BACK',false)

函数:setWifiEnable 设置无线局域网开关

函数功能:设置无线局域网开关
函数语法:
  setWifiEnable(flag)

参数说明:

参数 类型 说明
flag 逻辑型 打开WIFI - true; 关闭WIFI - false
返回值 类型 说明
ret 逻辑型 开关设置变更前的状态 false - 关闭;true - 开启

脚本实例:

  1. setWifiEnable(true); --打开 Wifi
  2. setWifiEnable(false); --关闭 Wifi

函数:setAirplaneMode 设置飞行模式开关

函数功能:设置飞行模式开关
函数语法:
  setAirplaneMode(flag)

参数说明:

参数 类型 说明
flag 逻辑型 打开飞行模式 - true;关闭飞行模式 - false
返回值 类型 说明
ret 逻辑型 开关设置变更前的状态 false - 关闭;true - 开启

脚本实例:

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

函数:setBTEnable 设置蓝牙开关

函数功能:设置蓝牙开关
函数语法:
  setBTEnable(flag)

参数说明:

参数 类型 说明
flag 逻辑型 打开蓝牙 - true;关闭蓝牙 - false
返回值 类型 说明
ret 逻辑型 开关设置变更前的状态 false - 关闭;true - 开启

脚本实例:

  1. setBTEnable(true); --打开 蓝牙
  2. setBTEnable(false); --关闭 蓝牙

函数:lockDevice 锁定设备

函数功能:锁定设备并关闭屏幕,仅支持iOS。
函数语法:
  lockDevice()

参数说明:
返回值:无

脚本实例:

  1. lockDevice();
  2. lua_exit();

函数:unlockDevice 解锁设备

函数功能:解除屏幕锁定状态,仅支持iOS。
函数语法:
  unlockDevice()

参数说明:
返回值:无

脚本实例:

  1. flag = deviceIsLock(); --判断屏幕锁定状态
  2. if flag == 0 then
  3. dialog("未锁定",3);
  4. else
  5. unlockDevice(); --解锁
  6. end

注意事项:

1.如果设备设置了锁屏密码,则此函数只能唤醒屏幕。

函数:deviceIsLock 设备锁定状态

函数功能:判断当前设备的屏幕锁定状态
函数语法:
  flag = deviceIsLock()

参数说明:

返回值 类型 说明
flag 整数型 0 == 表示设备未锁定;非0 == 表示设备已锁定

脚本实例:

  1. flag = deviceIsLock(); --判断屏幕锁定状态
  2. if flag == 0 then
  3. dialog("未锁定",3);
  4. else
  5. unlockDevice(); --解锁
  6. end

函数:vibrator 手机振动

函数功能:使手机振动一次。
函数语法:
  vibrator()

参数说明:
返回值:无

脚本实例:

  1. for var = 1,5 do
  2. vibrator(); --振动
  3. mSleep(1000); --持续 1
  4. end

注意事项:

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

函数:resetIDLETimer 重置锁屏时间

函数功能:重置系统空闲时间,阻止自动锁屏,保持屏幕常亮。
函数语法:
  resetIDLETimer()

参数说明:
返回值:无

脚本实例:

  1. while true do
  2. mSleep(30 * 1000); --等待 30
  3. resetIDLETimer(); --重置锁屏计时
  4. end

函数:resetScreenScale 取消屏幕缩放

函数功能:取消屏幕比例缩放设置,一般与setScreenScale配套使用。
函数语法:
  resetScreenScale()

参数说明:
返回值:无

脚本实例:

  1. setScreenScale(540,960) --或者setScreenScale(540,960,0)效果相同
  2. resetScreenScale() --取消缩放

函数:playAudio 播放音频

函数功能:在后台播放指定的声音文件
函数语法:
  playAudio(file)

参数说明:

参数 类型 说明
file 文本型 音频文件名,支持mp3

返回值:无

脚本实例:

  1. playAudio("music.mp3") -- 播放音乐文件music.mp3
  2. mSleep(5000)
  3. stopAudio() --停止播放音频文件

注意事项:

1.如果播放一个音频文件后,使用此函数播放另一音频文件,将会先停止正在播放的音频,再播放第二段音频文件。
2.用于播放的音乐文件需置于脚本对应的res文件夹内。

函数:stopAudio 停止播放音频

函数功能:停止正在播放的音频
函数语法:
  stopAudio()

参数说明:
返回值:无

脚本实例:

  1. playAudio("music.mp3") -- 播放音乐文件music.mp3
  2. mSleep(5000)
  3. stopAudio() --停止播放音频文件

注意事项:

如果播放一个音频文件后,使用此函数播放另一音频文件,将会先停止正在播放的音频,再播放第二段音频文件。

函数:mSleep 延时

函数功能:发送系统等待事件。
函数语法:
  mSleep(interval)

参数说明:

参数 类型 说明
interval 整数型 单位为毫秒,脚本暂停执行的时间长度

脚本实例:

  1. mSleep(5000);
  1. touchDown(1, 200, 300); --按下
  2. mSleep(3000); --延迟 3
  3. touchUp(1, 200, 300); --抬起

注意事项:

1.延迟函数一般是用来模拟人在界面上的操作,因此要考虑人在各种情况下的延迟、界面加载时的响应时间。
2.延迟间隔不可过短,当 interval <= 50 ms 时,延迟精确度大幅下降,当 interval <= 16 ms 时,实际延迟约在16 ms左右。
3.请勿将此函数用于长时间的精确计时。
4.1 秒 (s) = 1000 毫秒 (ms)。

函数:toast 提示

函数功能:以HUD方式显示提示信息。
函数语法:
  toast(text)

参数说明:

参数 类型 说明
text 文本型 提示信息,将在设备屏幕上以HUD形式显示

返回值:无

脚本实例:

  1. toast("欢迎使用叉叉脚本!");
  2. mSleep(1000);
  3. toast("本脚本仅供演示toast函数效果。\n提示信息可以换行。");

注意事项:

该函数所产生的提示信息将以HUD形式显示在屏幕上,该函数所产生的提示信息可能会影响当前屏幕的找色,请合理使用。

函数:dialog 提示框

函数功能:弹出提示信息
函数语法:
  dialog(text, time)

参数说明:

参数 类型 说明
text 文本型 提示信息,将在设备屏幕上以弹窗形式显示
time 整数型 提示信息显示的时间,不限时间请填0

返回值:无

脚本实例:

  1. dialog("欢迎使用叉叉脚本!", 5);
  2. mSleep(1000);
  3. dialog("本脚本仅供演示对话框的用法。\n提示信息可以换行。",0);

注意事项:

1.time 参数时间设置过短有可能因出现时间太短看不清楚。
2.该函数仅供呈现提示信息给用户,不可接收返回值。
3.该函数所产生的提示窗口显示的时候会影响当前屏幕取色,请在合理的位置使用该函数。
4.关于转义字符:\n 为换行,请查阅 Lua 转义字符表。
5.time 参数可省略,如省略将按 0 处理。

函数:dialogRet 带按钮的对话框

函数功能:弹出提示信息,并提供 1 ~ 3 个按钮给用户选择。
函数语法:
  choice = dialogRet(text, cbtn, btn1, btn2, time)

参数说明:

参数 类型 说明
Text 文本型 提示信息
cbtn 文本型 默认按钮标题,不需要请填 ""
btn1 文本型 可选按钮 1,不需要请填 ""
btn2 文本型 可选按钮 2,不需要请填 ""
time 整数型 提示信息显示的时间,不限时间请填 0
返回值 类型 说明
choice 整数型 返回用户按下按钮的序号 cbtn == 0;btn1 == 1;btn2 == 2;如用户在规定显示时间内未进行选择,返回值为 -1

脚本实例:

  1. choice = dialogRet("请选择您的屏幕方向:", "横屏", "竖屏", "", 0);
  1. choice = dialogRet("请选择您的屏幕方向:", "HOME键在下", "HOME键在左", "HOME键在右", 0);
  1. dialogRet("请花30秒仔细阅读该许可协议。", "", "", "", 30);

注意事项:

1.请勿将三个按钮都设置为空,再将 time 参数设置为 0,这样将造成出现无法消失也没有按钮的 对话框,造成设备无法进行其它操作,只能重启。
2.cbtn 总是对话框的最右边或者最下面的按钮。

函数:dialogInput 带参数的对话框

函数功能:弹出提示信息,并提供 1 ~ 2 个编辑框给用户输入。
函数语法:
  text_a,text_b = dialogInput(title, format, btn)

参数说明:

参数 类型 说明
title 文本型 提示标题
format 文本型 编辑框中浅色的提示文字
btn 文本型 确认按钮标题
返回值 类型 说明
text_a,text_b 文本型 返回用户输入的文本

脚本实例:

  1. text_a = dialogInput("请输入循环副本的次数", "在这里输入次数", "确认");
  2. mSleep(1000);
  1. text_a, text_b = dialogInput("请输入使用的设置方案","在这里输入方案编号#在这里输入次数","确认");
  2. mSleep(1000);
  3. if text_b ~= "" and text_a ~= "" then --如果均已填写
  4. dialog("打本信息:"..text_b.." 次数 "..text_a.." 。", 5);
  5. mSleep(1000);
  6. else --未填写完整
  7. dialog("请完整填写打本的设置信息", 5);
  8. mSleep(1000);
  9. lua_exit()
  10. end

注意事项:

1.使用该函数都要对用户输入的数据进行一定的检查,例如要求非空、长度不得少于。
2.需要注意使用双编辑框时,函数返回的两个字符串顺序与 format中的顺序相反。
3.由于对话框事件需要响应时间,所以建议使用对话框时配合设置相应的延迟。

函数:sysLog 系统日志

函数功能:输出系统日志 NSLog
函数语法:
  sysLog(contents)

参数说明:

参数 类型 说明
content 文本型 需要显示的日志内容

返回值:无

注意事项:

该函数将日志输出到对应平台的开发窗口

函数:setStringConfig 存字符串

函数功能:将字符串存入配置文件
函数语法:
  setStringConfig("key","string")

参数说明:

参数 类型 说明
key1 文本型 将要写入的参数名称
string1 文本型 将要写入参数的内容

返回值:无

脚本实例:

  1. sex = getStringConfig("gender","male");
  2. toast(sex) -- 未对“gender”进行新的赋值,toast结果为默认值"male"
  3. setStringConfig("gender","female");
  4. sex = getStringConfig("gender","male");
  5. toast(sex) -- toast结果为新的赋值"female"

函数:getStringConfig 取字符串

函数功能:读取配置文件的字符串
函数语法:
  ret = getStringConfig("key","default_string")

参数说明:

参数 类型 说明
key1 文本型 将要读取的参数名称
default_string 文本型 参数"key1"所对应的默认值,如果没有对key1进行新的赋值,或无法找到对key1的赋值,将返回默认值“default_string”
返回值 类型 说明
ret 文本型 获取到名为"key1"的参数当前的值

脚本实例:

  1. sex = getStringConfig("gender","male");
  2. toast(sex) -- 未对“gender”进行新的赋值,toast结果为默认值"male"
  3. setStringConfig("gender","female");
  4. sex = getStringConfig("gender","male");
  5. toast(sex) -- toast结果为新的赋值"female"

函数:setNumberConfig 存入数值

函数功能:将数值存入配置文件
函数语法:
  setNumberConfig("key",num)

参数说明:

参数 类型 说明
key2 文本型 将要写入的参数名称
num1 数字型 将要写入参数的数值

返回值:无

脚本实例:

  1. a = getNumberConfig("age",18);
  2. toast(a) -- toast结果"18"
  3. setNumberConfig("age",20);
  4. a = getNumberConfig("age",18);
  5. toast(a) -- toast结果"20"

函数:getNumberConfig 读取数值

函数功能:读取配置文件的数值
函数语法:
  num = getNumberConfig("key",default_num)

参数说明:

参数 类型 说明
key2 文本型 将要读取的参数名称
default_num 数字型 参数"key2"所对应的默认值,如果没有对key2进行新的赋值,或无法找到对key2的赋值,将返回默认值 default_num
返回值 类型 说明
num 数字型 获取到名为"key2"的参数当前的值

脚本实例:

  1. a = getNumberConfig("age",18);
  2. toast(a) -- toast结果"18"
  3. setNumberConfig("age",20);
  4. a = getNumberConfig("age",18);
  5. toast(a) -- toast结果"20"

函数:readPasteboard 读取剪贴板

函数功能:读写系统剪贴板
函数语法:
  string = readPasteboard()

参数说明:

返回值 类型 说明
string 文本型 写入或读出的剪贴板字符串

脚本实例:

  1. string = readPasteboard(); --读取剪贴板内容
  2. mSleep(1000); --延迟 1 秒等待响应
  3. inputText(string); --输入字符串

函数:writePasteboard 写入剪贴板

函数功能:读写系统剪贴板
函数语法:
  writePasteboard(string)

参数说明:

参数 类型 说明
string 文本型 写入的剪贴板字符串

返回值:无

脚本实例:

  1. file = io.open("test.txt" ,"r"); --以只读方式打开一个文本文件
  2. if file then --如打开成功
  3. writePasteboard(file:read()); --写入到剪贴板
  4. file:close(); --关闭文件
  5. end

注意事项:

1.该函数将覆盖系统剪贴板,如有重要数据储存在剪贴板请事先备份。

函数:lua_exit 退出脚本执行

函数功能:直接终止脚本。
函数语法:
  lua_exit()
  

参数说明:
返回值:无

脚本实例:

  1. ret = dialogRet("该脚本不支持当前手机分辨率", "继续", "退出","",0);
  2. if ret == 0 then --如果按下"继续"按钮
  3. init("0",0); --开始初始化
  4. else
  5. lua_exit(); --否则退出脚本
  6. end

函数:lua_restart 重载脚本

函数功能:重新加载运行脚本
函数语法:
  lua_restart()
  

参数说明:
返回值:无

注意事项:

此函数作用相当于停止脚本后重新运行脚本。

函数:beforeUserExit 终止运行之前运行

函数功能:在用户主动终止脚本运行之前执行
函数语法:
  beforeUserExit()

参数说明:
返回值:无

脚本实例:

  1. function beforeUserExit()
  2. dialog("OK",0)
  3. end
  4. for var = 1,30 do
  5. mSleep(1000)
  6. sysLog("var")
  7. end

注意事项:

1.函数名必须为 beforeUserExit才能够被识别,请勿在函数体中使用死循环,否则会造成脚本无法终止或其他不可预料的问题。
2.此函数可以被 lua_exit()、悬浮窗停止、远程接口停止 触发。

函数:getEngineVersion 获取引擎的版本号

函数功能:获取引擎的版本号
函数语法:
  ver = getEngineVersion()

参数说明:

返回值 类型 说明
ver 文本型 返回当前引擎的版本号

脚本实例:

  1. ver = getEngineVersion()
  2. sysLog(string.format('当前版本号: %s', ver))

函数:getOSType 获取系统类型

函数功能:获取系统类型
函数语法:
  ver = getOSType()

参数说明:

返回值 类型 说明
ver 文本型 返回当前系统的类型

脚本实例:
ver = getOSType()
sysLog(string.format('设备系统: %s', ver))

函数:getSystemProperty 获取系统常量属性

函数功能:获取系统常量属性,仅安卓可用
函数语法:
  value = getSystemProperty('key')

参数说明:

参数 类型 说明
key 文本型 CPU构架 - 'ro.arch'; 手机产品号 - 'ro.build.product'
返回值 类型 说明
value 文本型 返回所获取的系统常量属性结果

脚本实例:

  1. sysLog('CPU构架: ' .. getSystemProperty('ro.arch'))
  2. sysLog('手机产品号:' .. getSystemProperty('ro.build.product'))

函数:getLocalInfo 获取当前系统语言属性

函数功能:获取当前系统语言属性
函数语法:
  ret = getLocalInfo()

参数说明:

返回值 类型 说明
ret 文本型 获取到的当前系统语言,格式:语言-国家,例如:zh-CN, es-US,用于支持多语言脚本适配

脚本实例:

  1. ret = getLocalInfo()
  2. sysLog(string.format('当前系统语言: %s', ret))

函数:getUserID 获取用户ID

函数功能:获取用户的识别ID
函数语法:
  id = getUserID()

参数说明:

返回值 类型 说明
id 文本型 表示拿到的用户的ID,没有登录时则返回null

脚本实例:

  1. sysLog("id: "..getUserID())

函数:getScreenDPI 获取当前设备屏幕DPI

函数功能:获取当前设备屏幕DPI,仅安卓适用
函数语法:
  ret = getScreenDPI()

参数说明:

返回值 类型 说明
ret 文本型 返回的当前设备屏幕DPI

脚本实例:

  1. ret = getScreenDPI()
  2. sysLog(string.format('当前设备屏幕DPI: %s', ret))

函数:getDeviceIMEI 获取当前设备IMEI码

函数功能:获取当前设备IMEI码,仅安卓适用
函数语法:
  ret = getDeviceIMEI()

参数说明:

返回值 类型 说明
ret 文本型 返回的当前设备IMEI码

脚本实例:

  1. ret = getDeviceIMEI()
  2. sysLog(string.format('当前设备IMEI码: %s', ret))

函数:getDeviceIMSI 获取当前设备IMSI码

函数功能:获取当前设备IMSI码,仅安卓适用
函数语法:
  ret = getDeviceIMSI()

参数说明:

返回值 类型 说明
ret 文本型 返回的当前设备IMSI码

脚本实例:

  1. ret = getDeviceIMSI()
  2. sysLog(string.format('当前设备IMSI码: %s', ret))

函数:getDeviceUUID 获取当前设备UUID

函数功能:获取当前设备UUID,仅iOS适用
函数语法:
  ret = getDeviceUUID()

参数说明:

返回值 类型 说明
ret 文本型 返回的当前设备UUID

脚本实例:

  1. ret = 获取当前设备UUID()
  2. sysLog(string.format('当前设备UUID: %s', ret))

函数:createHUD 创建HUD内容

函数功能:创建、显示、隐藏HUD内容
函数语法:
  id = createHUD()

参数说明:

返回值 类型 说明
id 整数型 用于标示HUD

脚本实例:

  1. init("",1)
  2. id = createHUD() --创建一个HUD
  3. showHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容
  4. mSleep(2000)
  5. showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容
  6. mSleep(5000)
  7. hideHUD(id) --隐藏HUD
  8. mSleep(3000)

注意事项:

1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。

函数:showHUD 显示HUD内容

函数功能:创建、显示、隐藏HUD内容
函数语法:
  showHUD(id,text,size,color,bg,pos,x,y,width,height)

参数说明:

参数 类型 说明
id 整数型 用于标示HUD
text 文本型 提示信息,将在屏幕上以HUD形式显示
size 整数型 表示提示信息的字体大小
color 文本型 表示提示信息的字体颜色,格式为ARGB
bg 文本型 表示提示信息的背景颜色,可以是ARGB,也可以是图片文件名称
pos 整数型 表示提示信息的原点位置,0 - 左上角,1 - 居中,2 - 水平居中, 3 - 垂直居中
x,y 整数型 表示提示信息相对原点的坐标偏移值
width,height 整数型 表示提示信息显示的宽高

返回值:无

脚本实例:

  1. init("",1)
  2. id = createHUD() --创建一个HUD
  3. showHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容
  4. mSleep(2000)
  5. showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容
  6. mSleep(5000)
  7. hideHUD(id) --隐藏HUD
  8. mSleep(3000)

注意事项:

1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。

函数:hideHUD 隐藏HUD内容

函数功能:创建、显示、隐藏HUD内容
函数语法:
  hideHUD(id)

参数说明:

参数 类型 说明
id 整数型 用于标示HUD

返回值:无

脚本实例:

  1. init("",1)
  2. id = createHUD() --创建一个HUD
  3. showHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容
  4. mSleep(2000)
  5. showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容
  6. mSleep(5000)
  7. hideHUD(id) --隐藏HUD
  8. mSleep(3000)

注意事项:

1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。

函数:asyncExec 异步网络请求

函数功能:asyncExec 异步httpget、httppost请求
函数语法:
  asyncExec()

脚本实例:

  1. sysLog("test begin")
  2. -- 异步httpget请求
  3. asyncExec({
  4. type = "httpget", -- [string] 指定httpget类型
  5. immediate = false, -- [bool] 默认false, 设置true会独立开启线程执行任务
  6. url = "http://httpbin.org/get?x=1&y=2", -- [string] 请求的URL地址
  7. callback = function (result) -- [function] 请求回调函数
  8. -- 回调结果table
  9. assert(type(result) == "table")
  10. --[[
  11. 返回数据格式: { code = [int]错误码, data = [string]服务器返回数据 }
  12. code -1: 请求出错
  13. -2: 请求超时
  14. -3: 强制关闭
  15. 其他: http status code
  16. ]]--
  17. sysLog("httpget callback: code = " .. result.code .. " data = " .. result.data)
  18. -- 注意: 虽然请求会异步执行, 但回调函数依然在lua主线程执行, 不要在回调里执行其他阻塞操作
  19. end
  20. })
  21. -- 异步httppost请求
  22. asyncExec({
  23. type = "httppost", -- [string] 指定httppost类型
  24. immediate = true, -- [bool] 默认false, 设置true会独立开启线程执行任务
  25. url = "http:/httpbin.org/post", -- [string] 请求的URL地址
  26. content = "test content 2", -- [string] post请求的数据
  27. callback = function (result) -- [function] 请求回调函数
  28. -- 回调结果table
  29. assert(type(result) == "table")
  30. -- httpgethttppost返回数据格式一致
  31. sysLog("httppost callback: code = " .. result.code .. " data = " .. result.data)
  32. end
  33. })
  34. local t = 0
  35. while t < 10 do
  36. mSleep(1000)
  37. t = t + 1
  38. end
  39. sysLog("test end")

函数:setUIOrientation 设置UI方向和Hud方向

函数功能:设置UI方向和Hud方向,仅iOS可用
函数语法:
  setUIOrientation(mode)

参数说明:

参数 类型 说明
mode 整数型 用于设置UI及hud的全局方向类型,0表示跟随游戏;1表示home在右侧;2表示home在左侧

返回值:无

脚本实例:

  1. init("",1)
  2. setUIOrientation(0)

注意事项:

1.只适用于iOS系统,Andorid系统不可用

badboy开源工具库

Badboy是专为叉叉脚本引擎开发的工具类,代码全部以开源的方式提供,目前有以下的模块:

  1. 进入https://github.com/boyliang/lua_badboy,下载项目源码;
  2. 把项目当中内容,复制到src目录下;
  3. 在main.lua中加入你的脚本逻辑;
  4. 使用xsp打包工具即完成out.xsp

使用方法:
请在脚本开头插入 local bb = require("badboy") 即可调用扩展库中所有函数。

JSON模块

newArray 新建数组对象
newObject 新建对象
decode json字符串转成talbe对象
encode table对象转换成压缩的json字符
encode_pretty table对象转换成优雅的json字符

脚本实例:

  1. local bb = require("badboy")
  2. local json = bb.getJSON()
  3. local lua_value = json.decode('{"a": 1, "b":"boy", "c":{"d":1}}')
  4. local a_value = lua_value.a -- =1
  5. local b_balue = lua_value.b -- ="boy"
  6. local c_d_balue = lua_value.c.d -- =1
  7. local raw_json_text = json.encode(lua_value)
  8. local pretty_json_text = json.encode_pretty(lua_value)
  9. sysLog(raw_json_text)
  10. sysLog(pretty_json_text)

StringUtils模块

toCharTable 从字符串转字符数组
fromCharTable 从字符数组转字符串
toByteTable 从字符串转字节数组
fromByteTale 从字节数组转字符串
contains 是否包含子串
startWith 是否以某个子串开头
endsWith 是否以某个子中结束
...更多API请关注badboy项目源码文件\bblibs\StrUtilsAPI.lua

脚本实例:

  1. local bb = require("badboy")
  2. local strutils = bb.getStrUtils()
  3. local str = 'i am a badboy'
  4. --十六进制编码转换、SHA1计算、MD5计算
  5. local hex = str:tohex() -- 等同于 strutils.tohex(str)
  6. local sha1 = str:sha1() -- 等同于 strutils.sha1(str)
  7. local md5 = str:md5() -- 等同于 strutils.md5(str)
  8. sysLog('hex:' .. hex)
  9. sysLog('sha1:' .. sha1)
  10. sysLog('md5:' .. md5)

UI模块

RootView:create 构造UI根对象
RootView:addView 添加子view
RootView:removeView 删除子view
RootView:removeViewByID 删除子view
Page:create 构建Page控件
Page:addView 添加子view
Page:removeView 删除子view
Page:removeViewByID 删除子view
Image:create 构造Image控件
Edit:create 构造Edit控件
Label:create 构造Label控件
...(所有属性都可以直接通过对象访问)

  1. local bb = require("badboy")
  2. bb.loaduilib()
  3. local rootview = RootView:create({style = ViewStyle.CUSTOME})
  4. local page = Page:create("page")
  5. page.text = "Page1"
  6. local page2 = Page:create("page2")
  7. page2.text = "Page2"
  8. local label = Label:create("Label", {color = "255, 255, 0"})
  9. label.text = "I love XX"
  10. local image = Image:create("image")
  11. image.src = "bg.png"
  12. local edit = Edit:create("edit", {prompt = "提示"})
  13. edit.align = TextAlign.LEFT
  14. local radiogroup = RadioGroup:create("radiogroup")
  15. radiogroup:setList('男', '女', '嬲', '奻')
  16. radiogroup:setSelect(3)
  17. local checkboxgroup = CheckBoxGroup:create('checkboxgroup')
  18. checkboxgroup:setList('XX', 'OO', 'AA', 'BB')
  19. checkboxgroup:setSelects(2, 3)
  20. rootview:addView(page) --把page添加到rootview
  21. rootview:addView(page2)
  22. page:addView(label) --把label添加到page
  23. -- page:addView(label) --labelid重复,这里会报错
  24. page:addView(image) --把image添加到page
  25. page:addView(checkboxgroup)
  26. page:addView(radiogroup)
  27. page:removeView(label1) --从page中删除label
  28. uijson = json.encode(rootview)
  29. showUI(uijson)

POS模块

distanceBetween 计算距离
click 单击
touchMoveTo 精确滑动
angleBetween 计算角度
polarProjection 根据角度和距离找点
isColorClick 根据颜色进行点击

  1. local bb = require("badboy")
  2. local pos = bb.loadpos()
  3. p1 = pos:new(0, 0, 0x123456)
  4. p2 = pos:new(1, 2)
  5. sysLog(p1:distanceBetween(p2))
  6. sysLog(p1:angleBetween(p2))
  7. p2 = p1:polarProjection(4, 30)
  8. sysLogFmt('p2[%d, %d]', p2.x, p2.y)

utils模块

sysLogFmt 格式化字符串输出
sysLogLst 任意内容输出
tap 模拟一次点击
swip 模拟一次滑动
cmpColor 指定颜色对比

  1. -- utils test
  2. local bb = require("badboy")
  3. bb.loadutilslib()
  4. i = 3
  5. j = 6.9
  6. s = 'good boy'
  7. sysLogFmt('i=%d, j=%f, s=%s', i, j, s)
  8. sysLogLst(i, j, s)

LuaSocket模块

LuaSocket 是 Lua 的网络模块库,它可以很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。详细使用说明关注badboy项目源码文件main.lua,API参考见http://w3.impa.br/~diego/software/luasocket/reference.html

DNS

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local socket = bb.socket
  4. local dns = socket.dns
  5. sysLog('localhostIP: ' .. dns.toip('localhost'))
  6. sysLog('result: ' .. (dns.tohostname('59.37.96.63') or 'nil'))
  7. sysLog('hostname: ' .. dns.gethostname())
  8. sysLog('addinfo: ' .. tostring(dns.getaddrinfo('localhost')))

httpGet请求

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local http = bb.http
  4. local ltn12 = bb.ltn12
  5. res, code = http.request('http://www.baidu.com')
  6. -- 等价于
  7. -- local response_body = {}
  8. -- res, code = http.request({
  9. -- url = 'http://www.baidu.com',
  10. -- sink = ltn12.sink.table(response_body)
  11. -- })
  12. if code == 200 then
  13. sysLog(res)
  14. dialog(res, 0)
  15. end
  16. --获取外网ip地址
  17. local bb = require("badboy")
  18. bb.loadluasocket()
  19. local http = bb.http
  20. local res, code = http.request('http://www.ip.cn/');
  21. if code == 200 then
  22. local i,j = string.find(res, '%d+%.%d+%.%d+%.%d+')
  23. local ipaddr =string.sub(res,i,j)
  24. dialog(ipaddr, 0)
  25. end

1.返回的2个参数中,res 是 http body 的内容,也就是请求网页的内容,code 是 http 状态码,返回200的话就表示正常返回。
2.如果传入的是 table 的话,就需要用一个容器来接收 http body 的内容。

httpPost请求

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local http = bb.http
  4. local response_body = {}
  5. local post_data = 'asd';
  6. res, code = http.request{
  7. url = 'http://127.0.0.1/post.php',
  8. method = "POST",
  9. headers =
  10. {
  11. ['Content-Type'] = 'application/x-www-form-urlencoded',
  12. ['Content-Length'] = #post_data,
  13. },
  14. source = ltn12.source.string('data=' .. post_data),
  15. sink = ltn12.sink.table(response_body)
  16. }

1.这里注意记得 method 传入 POST, 因为默认是 GET。
2.headers 参数,由一个 table 组成,key 为 header,value 为 header 内容。
3.source 参数,这里是填入 POST 的参数,多个数据的情况用 & 隔开,例如 "data1=a&data2=b"。
4.此代码仅为举例说明,请勿直接复制使用。

挂载代理

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local http = bb.http
  4. http.PROXY = 'http://127.0.0.1:8888' --代理服务器地址
  5. local result, code = http.request('http://www.baidu.com')
  6. dialog(result or tostring(code), 0)

以socket的方式访问

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local http = bb.http
  4. local host = 'www.baidu.com'
  5. local file = "/"
  6. local sock = assert(socket.connect(host, 80)) --创建一个 TCP 连接,连接到 HTTP 连接的标准 80 端口上
  7. sock:send('GET ' .. file .. ' HTTP/1.0\r\n\r\n')
  8. repeat
  9. local chunk, status, partial = sock:receive(1024) --以 1K 的字节块接收数据
  10. until status ~= 'closed'
  11. sock:close() -- 关闭 TCP 连接

smtp方法发送email

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local smtp = bb.smtp
  4. from = '<youmail@126.com>' -- 发件人
  5. --发送列表
  6. rcpt = {
  7. '<youmail@126.com>',
  8. '<youmail@qq.com>',
  9. '<youmail@gmail.com>',
  10. }
  11. mesgt = {
  12. headers = {
  13. to = 'youmail@gmail.com', -- 收件人
  14. cc = '<youmail@gmail.com>', -- 抄送
  15. subject = "This is Mail Title"
  16. },
  17. body = "邮件内容"
  18. }
  19. r, e = smtp.send{
  20. server = "smtp.126.com", --smtp服务器地址
  21. user = "youmail@126.com",--smtp验证用户名
  22. password = "******", --smtp验证密码
  23. from = from,
  24. rcpt = rcpt,
  25. source = smtp.message(mesgt)
  26. }
  27. if not r then
  28. dialog(e, 0)
  29. else
  30. dialog('发送成功!', 0)
  31. end

实现获取网络时间

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local socket = bb.socket
  4. server_ip = {
  5. "132.163.4.101",
  6. "132.163.4.102",
  7. "132.163.4.103",
  8. "128.138.140.44",
  9. "192.43.244.18",
  10. "131.107.1.10",
  11. "66.243.43.21",
  12. "216.200.93.8",
  13. "208.184.49.9",
  14. "207.126.98.204",
  15. "207.200.81.113",
  16. "205.188.185.33"
  17. }
  18. local function nstol(str)
  19. assert(str and #str == 4)
  20. local t = {str:byte(1,-1)}
  21. local n = 0
  22. for k = 1, #t do
  23. n= n*256 + t[k]
  24. end
  25. return n
  26. end
  27. local function gettime(ip)
  28. local tcp = socket.tcp()
  29. tcp:settimeout(10)
  30. tcp:connect(ip, 37)
  31. success, time = pcall(nstol, tcp:receive(4))
  32. tcp:close()
  33. return success and time or nil
  34. end
  35. local function nettime()
  36. for _, ip in pairs(server_ip) do
  37. time = gettime(ip)
  38. if time then
  39. return time
  40. end
  41. end
  42. end
  43. dialog(nettime(),0)

统计毫秒精度时间

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. local socket = bb.socket
  4. local function sleep(sec)
  5. socket.select(nil,nil,sec);
  6. end
  7. local t0 = socket.gettime()
  8. sleep(0.4);
  9. local t1 = socket.gettime()
  10. dialog(t1 - t0, 0)

FTP 测试

  1. local bb = require("badboy")
  2. bb.loadluasocket()
  3. -- [ftp://][<user>[:<password>]@]<host>[:<port>][/<path>][type=a|i]
  4. -- The following constants in the namespace can be set to control the default behavior of the FTP module:
  5. -- PASSWORD: default anonymous password.
  6. -- PORT: default port used for the control connection;
  7. -- TIMEOUT: sets the timeout for all I/O operations;
  8. -- USER: default anonymous user;
  9. local ftp = bb.ftp
  10. -- Log as user "anonymous" on server "ftp.tecgraf.puc-rio.br",
  11. -- and get file "lua.tar.gz" from directory "pub/lua" as binary.
  12. f, e = ftp.get("ftp://ftp.tecgraf.puc-rio.br/pub/lua/lua.tar.gz;type=i")
  13. -- Log as user "fulano" on server "ftp.example.com",
  14. -- using password "silva", and store a file "README" with contents
  15. -- "wrong password, of course"
  16. f, e = ftp.put("ftp://fulano:silva@ftp.example.com/README", "wrong password, of course")
  17. -- Log as user "fulano" on server "ftp.example.com",
  18. -- using password "silva", and append to the remote file "LOG", sending the
  19. -- contents of the local file "LOCAL-LOG"
  20. f, e = ftp.put{
  21. host = "ftp.example.com",
  22. user = "fulano",
  23. password = "silva",
  24. command = "appe",
  25. argument = "LOG",
  26. source = ltn12.source.file(io.open("LOCAL-LOG", "r"))
  27. }

取色器使用说明

抓图说明:
截图:于设备截图,会出现精度条圆圈标志,等待时间过长或其他意外情况 点击叉或者按Esc结束.截图后显示图片,右键图片名显示菜单,可关闭图片
保存:保存当前图片
载入:载入图片,也可以拖入图片
左转:左边旋转90度
右转:右边旋转90度
放大:快捷键ctrl + 滚轮上, 放大当前图片
缩小:快捷键ctrl + 滚轮下, 缩小当前图片
1:1 :快捷键ctrl + o, 100%显示当前图片
截图旋转方向: 截图默认旋转的方向
Home键在下相当于init("0", 0)
Home键在右相当于init("0", 1)
Home键左相当于init("0", 2)

尺寸显示:旋转后改变方向
取色:快捷键 1,2,3,4,5,6,7,8,9,0 或鼠标右键菜单取色
取色微调:键盘上下左右方向键移动

放大镜功能说明:
选择范围: A,S快捷键或 按钮点击选择范围.会出现红色线,按Esc键取消选择.注意选取范围时可鼠标滚动滚轮
颜色数据反选:在复选框上按住鼠标左键往下或者往上拖动,移动范围内反选颜色数据
可全选全删

格式:自定义生成代码. 在IDE目录下data.lua可以编辑格式
在datacolorfg中自己添加格式为:

  1. {
  2. title = "",
  3. fScript = function(poslist,area, degree)
  4. end,
  5. sScript = function (poslist,area, degree)
  6. end,
  7. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注