操作指南

1. 概述
2. 用法
3. 脚本

1. 概述

AutoTouch用来录制和回放您在移动设备上的各种触摸和点击操作(不是屏幕录像),它支持运行Lua脚本并提供一系列可以模拟人的触摸和按键操作的扩展函数,结合这些扩展函数您可以编写功能复杂多样的脚本来用AutoTouch自动化执行。比如您可以用它自动玩游戏打怪赚取金币、批量编辑照片、进行程序自动化测试或者自动登陆等等。

现在AutoTouch已经具备了录制和回放大多数人类操作的能力,比如触摸,点击Home实体键,点击音量实体键,点击声音开关实体键、锁屏实体键等等。并且达到了精确和顺滑的效果。它还提供了诸如截屏、区域截屏、颜色查找、颜色匹配、图片匹配等一些列扩展函数,具备了更大可挖掘的潜力。结合这些奇异的能力,能限制您的只有想象力了。

2. 用法

2.1. 怎样安装?

  1. 确保您已经添加了BigBoss源到Cydia中(Cydia默认自带BigBoss源);
  2. 在Cydia中搜索“AutoTouch”,找到并安装;
  3. 如果之前未安装过“Activator”插件,则安装AutoTouch时会自动安装此插件,该插件用于手势控制。请勿卸载它,否则AutoTouch会被一并卸载。同时AppList插件也会被一同安装,它用来获取已安装应用的列表和标识,请勿卸载。

2.2. 怎样录制?

  1. 在任何您想开始录制的界面,长按音量减键(或您设置的其它Activator控制动作),来弹出控制面板,控制面板上包含一个录制按钮和一个脚本列表;
  2. 点击控制面板上的“录制”按钮,它将震动提示并开始录制;
  3. 接下来就请做您想做的触摸或其它操作了,比如打怪等;
  4. 当您想要停止录制时,长按音量减键(或前述的其它控制动作),直到弹出提示框显示“录制结束”,它会震动提示并停止;
  5. 接下来您就可以到AutoTouch中查看、管理或者播放刚才录制的脚本了。脚本默认用创建时间作为名称,你可修改为更友好的名称.

2.3. 怎样播放?

  1. 在您希望开始播放的界面,长按音量减键(或您设置的其它控制动作)来调出控制面板;
  2. 在控制面板上点击选择您想播放的脚本;
  3. 通常接下来(除非您曾将此脚本设置为直接播放)会弹出播放设置对话框以询问循环播放次数、间隔和速度;
  4. 点击“立即运行”后它将依据您刚才的设置立即进行播放,此时会有震动提示开始。播放完成后会自动停止并弹出对话框提示结束(您可在设置中关闭对话框提示)。您还可通过长按音量件键(或前述其它动作)来中断播放;
  5. 如果您点击了“稍后运行”,它将进入“准备运行”的状态,在此状态中,可通过点击(不是长按,不可修改)音量减键来重复多次地启动或中断播放,且不会有任何询问对话框再来打断您。再次长按(或前述其它动作)来退出“准备播放”状态;
  6. 您可在“播放设置”界面将脚本设为“直接播放”并为其设置默认的播放设置,这样当选择此脚本时将直接据此设置进行播放,不会再弹出播放设置对话框进行询问.

2.4. 怎样写一个脚本?

  1. 点击工具栏中间的“Action”按钮,选择“新建文件”即可打开脚本新建窗口;
  2. 在脚本编辑界面编写代码;
  3. 然后点击“保存”按钮并输入名称进行保存.

2.5. 使用在编辑脚本时使用“函数助手”便捷插入函数?

  1. 在脚本编辑界面的键盘区域上部,有两个按钮:“扩展函数”和“常用语法”,可以通过它们便捷地插入扩展函数和Lua语言常用语法。
  2. 点击“扩展函数”按钮,会弹出函数选择列表,点击列表中的函数,将直接插入扩展函数到脚本中,供您做进一步编辑。
  3. 在前述的“扩展函数”列表中,部分函数的邮编有个“帮助”按钮,这里用来打开一些便捷的参数获取工具。这些“帮助”工具主要有这几类:屏幕坐标获取、颜色拾取、应用标识(Identifier)获取,实体按键选择。在屏幕坐标获取工具中,打开一张已保存在相册的屏幕截图,手指放大图片到能看到像素点的程度,点击像素点,就可以获取该像素点在屏幕中的坐标,被点击的像素点会变成红色来标识已被选择。同理在“颜色拾取”工具中,打开图片放大到能看到像素点,点击像素点能获取像素颜色值。“应用标识选择”可以在appRun/appKill/appState/appIsActive时方便地选择目标应用。“实体按键”用在keyDown/keyUp时选择目标按键。
  4. 点击“常用语法”可以快速地插入Lua语言常用语法。

2.6. 怎样加密脚本?

  1. 在AutoTouch点击脚本,选择“加密”;
  2. 输入加密密码,无需密码留空即可;
  3. 点击确定即可完成加密,并生成一个同名但.lua.e结尾的加密文件.
  4. 可以选择加密脚本进行播放,设有密码的根据提示输入密码即可.

2.7. 怎样在电脑上管理脚本?

  1. 您可以在设置界面开启Web Server,然后通过电脑上的浏览器访问提示的URL,然后即可在其中编辑脚本;
  2. 您也可以在设置界面开启WebDAV Server,然后在电脑上通过WebDAV客户端软件连接提示的地址,然后即可在其中编辑脚本;

2.8. 怎样购买授权?

  1. 点击“设置”界面的“授权”按钮来打开授权信息界面;
  2. 当打开授权信息界面时会进行授权验证;
  3. 如果授权验证失败,会显示支付按钮;
  4. 点击支付按钮会跳转到浏览器窗口并打开支付页面,请在那里完成支付。用支付宝支付的用户请务必在支付页面的“付款说明”中粘贴设备序列号;
  5. 当支付完成后,请在“设置”界面点击“授权”来验证;
  6. 当授权被验证后,您将获得无限播放时间和全部功能.

2.9. 怎样从商店中下载和购买脚本?

  1. 您可以直接从商店中下载所有的脚本;
  2. 有些脚本是经过密码加密的,你需要跟作者联系来购买密码;
  3. 脚本下载后会存放在你的脚本列表中,您可以像使用其它脚本一样直接使用.

2.10. 怎样将您的脚本发布在商店中?

  1. 您可以将脚本发布在商店中,以分享或销售给其他人;
  2. 如果只想分享脚本,可以直接上传.lua文件,如果不希望他人看到内容,可以进行无密码加密;
  3. 如果想在商店中出售脚本,可以将脚本进行加密,并设置密码。这样需要的人会联系您购买密码.

3. 脚本

3.1. 基础

您可以从这里学习Lua语言的使用:Lua Official Reference Manual.


3.2. 扩展函数

扩展函数用于扩展Lua语言,使具备模拟人类操作手机的一些能力。还提供截屏、颜色查找、颜色匹配、图片匹配等能力。


touchDown(id, x, y)

在屏幕的(x, y)坐标按下.

touchDown(0, 100, 200); -- 在坐标(100, 200)处按下.

touchMove(id, x, y)

移动手指到(x, y)坐标.

touchDown(0, 100, 200); -- 在坐标(100, 200)处按下.
touchMove(0, 200, 200); -- 移动手指到坐标(200, 200)处.

touchUp(id, x, y)

从(x, y)坐标抬起按下的手指.

touchDown(0, 100, 200); -- 在坐标(100, 200)处按下.
touchMove(0, 200, 200); -- 移动手指到坐标(200, 200)处.
touchUp(0, 200, 200); -- 在坐标(200, 200)处抬起按下的手指.

tap(x, y)

点击坐标点(x, y).

tap(100, 200); -- 点击坐标点(100, 200).

keyDown(keyType)

模拟实体键按下动作。

keyDown(KEY_TYPE.HOME_BUTTON);
-- 模拟Home键按下的动作
          
-- 怎样模拟一次按键动作
function keyPress(keyType)
    keyDown(keyType);
    usleep(10000);
    keyDown(keyUp);
end

keyPress(KEY_TYPE.HOME_BUTTON);
      

keyUp(keyType)

模拟实体键抬起动作。

keyUp(KEY_TYPE.HOME_BUTTON);
          -- 模拟Home键抬起的动作。

getColor(x, y)

在当前屏幕获取指定坐标位置的颜色值.

local rgb = getColor(100, 200);
          alert("rgb:" .. rgb);
          -- rgb:16777215

findColor(color, count, region)

在当前屏幕获取所有匹配指定颜色的坐标点. 注意: 您应当这样使用find(0x0000ff, 5), 而非这样:find(rgb=0x0000ff, count=5), 这与findImage函数不同, 因为findImage的参数整体是一个table.

-- 示例 1:
local result = findColor(0x0000ff, 2, nil);
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

-- 示例 2:
local result = findColor(0x00ddff, 0, {100, 50, 200, 200});
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

-- 示例 3:
local region = {100, 50, 200, 200};
local result = findColor(0x00ddff, 0, region);
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

findColors(colors, count, region)

查找所有匹配指定颜色和它们的相对位置的矩形区域,返回找到的矩形区域的中心坐标。该函数具有比findImage高得多的查找效率和可用度,比如查找一个按钮,不用像findImage一样去匹配整个按钮图片,只用匹配按钮中的几个锚点的颜色和它们的相对位置即可。可以使用count参数限定希望查找结果的个数,0标识查找所有,1标识查找第1个,2表示查找前两个。region参数可以用来限定查找的区域,为{x, y, width, height}的table类型,不限定时传入nil。

这个函数可以使用脚本编辑界面“扩展函数”中的“帮助”工具,快速地从屏幕截图中选择几个锚点颜色,并自动获取它们的相对位置来插入到函数参数位置。

-- 示例 1:
local result = findColors({{0x00ddff,0,0}, {0x00eeff,10,10}, {0x0000ff,0,20}}, 2, nil);
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

-- 示例 2:
local colors = {{0x00ddff,0,0}, {0x00eeff,10,10}, {0x0000ff,0,20}};
local result = findColors(colors, 0, nil);
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

-- 示例 3:
local colors = {{0x00ddff,0,0}, {0x00eeff,10,10}, {0x0000ff,0,20}};
local region = {100, 50, 200, 200};
local result = findColors(colors, 0, region);
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

findImage(imagePath, count, fuzzy, ignoreColors, region)

在当前屏幕查找匹配指定图片的区域,以table形式返回找到的所有区域的左上角坐标.

-- 示例 1:
local result = findImage("images/spirit.png", 5, 1, nil, nil);
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

-- 示例 2:
local result = findImage("images/spirit.png", 0, 0.6, nil, nil};
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

-- 示例 3:
local result = findImage("images/spirit.png", 0, {0xffffff, 0x2b2b2b}, nil};
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

-- 示例 4:
local region = {100, 50, 200, 200};
local ignoreColors = {0xffffff, 0x2b2b2b};
local result = findImage("images/spirit.png", 1, 0.9, ignoreColors, region};
for i, v in pairs(result) do
    log("x:" .. v[1] .. ", y:" .. v[2]);
end

findColorTap(color, count, region)

该函数与findColor基本相同,区别在于findColorTap找到那些点并依次间隔0.016秒进行点击,并且不返回任何值.

-- 示例 1:
findColorTap(0x0000ff, 2, nil); -- 找到颜色为0x0000ff的前两个坐标点并依次间隔0.016秒点击它们.
          
-- 示例 2:
local region = {100, 50, 200, 200};
findColorTap(0x0000ff, 0, region); -- 指定区域内查找并点击它们。

findColorsTap(colors, count, region)

像findColors那样查找,然后在结果位置依次进行一次点击。

findColors({{0x00ddff,0,0}, {0x00eeff,10,10}, {0x0000ff,0,20}}, 2, nil); -- 找到前两个匹配的区域,然后依次点击它们.

local region = {100, 50, 200, 200};
findColors({{0x00ddff,0,0}, {0x00eeff,10,10}, {0x0000ff,0,20}}, 0, region); -- 在指定区域查找匹配,然后依次点击它们。
      

findImageTap(imagePath, count, fuzzy, ignoreColors, region)

像findImage那样查找区域,并在结果处依次间隔0.016秒进行点击。

local region = {100, 50, 200, 200};
local ignoreColors = {0xffffff, 0x2b2b2b};
findImageTap("images/spirit.png", 1, 0.9, ignoreColors, region};
      

screenshot(filePath, {x, y, width, height})

对全屏,或指定区域进行屏幕截图,并保存在指定地址。

screenshot ("images/screenshot1.png", nil);
-- 全屏截图并保存在指定位置。
          
screenshot ("images/screenshot1.png", {100, 100, 200, 200});
-- 对指定区域截图并保存。

appRun(appIdentifier)

用appIdentifier启动指定应用.

appRun("com.apple.mobilesafari");
-- 运行safari
      

appKill(appIdentifier)

用appIdentifier关闭指定应用.

appKill("com.apple.mobilesafari");
-- 关闭运行着的safari
      

appState(appIdentifier)

获取指定应用的运行状态

b = appState("com.apple.mobilesafari");
-- 获得Safari的状态.
      

appIsActive(appIdentifier)

检查指定应用是否处于活跃和打开的状态.

b = appIsActive("com.apple.mobilesafari");
-- 检查App打开状态
      

rootDir()

获得脚本存放的默认地址.

local dirPath = rootDir();
-- dirPath = "/var/mobile/Library/AutoTouch/Scripts/"

usleep(microseconds)

停顿若干个微秒,即1/1000000秒.

usleep(1000000);
-- 停顿1秒

log(logContent)

记录日志,可在日志界面查看。

log("play here...");

alert(message)

弹出对话框显示指定内容.

alert("Hello world!");

vibrate()

震动一次.

vibrate(); -- 震动一次.

playAudio(audioFile, times)

Play the specified audio file, times means how may time you want to play, default is 0, means infinitely.

playAudio("/var/audio.mp3", 0); -- play infinitely.

pauseAudio()

Pause the playing started before.

pauseAudio();

resumeAudio()

Resume the paused playing before.

resumeAudio();

stopAudio()

Stop the playing started before.

stopAudio();

getScreenResolution()

获取屏幕分辨率.

local w, h = getScreenResolution();
-- 分辨率宽度是1136, 分辨率高度是640.

getScreenSize()

获取屏幕大小,这里是苹果坐标系的大小。视网膜屏就是分辨率除以二的值.

local width, height = getScreenSize();
-- iPhone 5:宽是320, 高是568

getScreenScale()

Get the retina scale of the screen.

local scale = getScreenScale();
-- 2.0 for iPhone 5, 3.0 for iPhone 6 Plus.

getScreenBitDepth()

Get the bit depth of the screen.

local bitDepth = getScreenScale();

getSN()

获取当前设备的序列号。

b = getSN();
          -- b: C15NFK32TWD2
      

getVersion()

获取AutoTouch当前版本号。

b = getVersion();
          -- b: 3.0.1
      

intToRgb(intColor)

将整形颜色值转换为r, g, b单独的值.

local r, g, b = intToRgb(0x2b2b2b);

rgbToInt(r, g, b)

将r, g, b色值转换为整形颜色值.

local intColor = rgbToInt(200, 255, 100);

copyText(text)

将指定文本复制到剪贴板.

copyText("This is a copied text!");

clipText()

Get the text on the clipboard.

local text = clipText();

inputText(text)

Input the specified text to the focused text field.

inputText("Let's input some text automatically without tapping the keyboard!");
inputText("\b\b\b"); -- delete backward for 3 characters 

fakeLocation(appIdentifier, latitude, longitude)

Fake geographic position for the specified apps, it remains in effect until you call clearFakeLocation, or clear the faking in the settings view.

fakeLocation("com.apple.Maps", 36, 50);  -- fake location for Apple Map. 

clearFakeLocation(appIdentifier)

Clear the location faking for one specified app.

clearFakeLocation("com.apple.Maps");  -- clear the location faking for Apple Map.

dialog(controls, enableRemember)

Show a dialog accepts user input.

local label = {type=CONTROLLER_TYPE.LABEL, text="Would you mind to provide some personal informations?"}
local nameInput = {type=CONTROLLER_TYPE.INPUT, title="Name:", key="Name", value="Kevin"}
local positionPicker = {type=CONTROLLER_TYPE.PICKER, title="Position:", key="Position", value="CEO", options={"CEO", "CTO", "CFO", "CXO"}}
local developerSwitch = {type=CONTROLLER_TYPE.SWITCH, title="A Developer:", key="ADeveloper", value=1}

local controls = {label, nameInput, positionPicker, developerSwitch}
local enableRemember = true;

dialog(controls, enableRemember);

alert(string.format("name:%s, birthday:%s, gender:%d", nameInput.value, positionPicker.value, developerSwitch.value))
      

getOrientation()

Get the screen orientation.

local o = getOrientation();
      

3.3. Key Types
3.4. Dialog Control Types
3.5. Screen Orientation Types