操作指南

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