首先看看Lua腳本在App應(yīng)用程序上的作用效果,如果感興趣再繼續(xù)往下流覽。


上面的功能是用Lua語言開發(fā)的一個腳本,然后再結(jié)合觸動精靈給予的腳本支持產(chǎn)生的效果。
Lua 是一種輕量小巧的腳本語言,用標(biāo)準(zhǔn)C語言編寫并以源代碼形式開放, 其設(shè)計目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。
Lua的應(yīng)用場景:
- 游戲開發(fā)
- 獨立應(yīng)用腳本
- Web 應(yīng)用腳本
- 擴(kuò)展和數(shù)據(jù)庫插件如:MySQL Proxy 和 MySQL
- WorkBench
- 安全系統(tǒng),如入侵檢測系統(tǒng)
觸動精靈的底層是 Lua 腳本語言,支持 Lua 5.2.3 版本的所有語法與基本函數(shù),并在其的基礎(chǔ)上添加了一些擴(kuò)展函數(shù),用于取色、找色、找圖、發(fā)送觸摸事件等高級功能的實現(xiàn)只要能夠在手機(jī)上完成的人為操作,觸動精靈都可以代替完成,不僅省力,而且高效。
觸動精靈的應(yīng)用場景:
- 編寫自己App的腳本完成自動化測試
- 開掛刷機(jī)
- 微信機(jī)器人(包括開發(fā)任意應(yīng)用的機(jī)器人)
因此我們可以輕易做出上面效果圖的功能,但是需要移動設(shè)備必須是以下其一:
- 完美越獄的iOS設(shè)備
- Root權(quán)限的Android設(shè)備
- 具有Root權(quán)限的Android模擬器
提醒:Android與iOS兼容大部分函數(shù)。
模擬器連接編輯器比較麻煩,具體操作請查看官方文檔。推薦使用天天模擬器,具有別的模擬器不具備的特性。
開發(fā)所需的必備工具:
- 具備windows環(huán)境開發(fā)
- 在移動設(shè)備上安裝觸動精靈App
- IDE 腳本編輯器TouchSprite Studio
- 取點抓色器TSColorPicker
工具使用教程請查閱官方文檔,下面進(jìn)入正題,解析上面效果圖功能代碼,項目結(jié)構(gòu)非常簡單如下圖:

一.main.lua
require("LXListenMessageList")
--確保微信已啟動
if runAppWithName(weChatPakeName) == true then
listenMessageList();--監(jiān)聽消息列表
end
新建工程時自動創(chuàng)建的腳本文件,需要注意的是lua功能沒有主函數(shù)可言,任何一個腳本都可以自己執(zhí)行,不用依賴main.lua,這里只做了一個功能,就是監(jiān)聽消息列表,需首先啟動App。
二.LXConstClass.lua
內(nèi)容略,這是一個常量文件,具體代碼可下載源碼查看。
三.LXHelpClass.lua
require("LXConstClass")
--點擊返回按鈕
function clickBackBtn()
tap(42, kStatusMaxHeight + (kNavBarMaxHeight-kStatusMaxHeight)/2.0);
mSleep(kClickBackBtnTime);
end
--首頁tab的四個標(biāo)簽對應(yīng)的點擊的點
function homeTabBtnsRegion(index)
return kTabBtnWidth*(index-0.5), (screenHeight - kHomeTabTextHeight);
end
--啟動相應(yīng)App
function runAppWithName(pakeName)
if (deviceIsLock() ~= 0) then
unlockDevice();
mSleep(kUnlockDeviceTime);
moveTo(200, screenHeight*0.75, 200, screenHeight*0.25, 30)
mSleep(kDeviceAwakenTime);
end
--isFrontApp方法不可靠,所以在else里必須再啟動(從pakeName名的app按了home鍵后此方法還認(rèn)為這個app是在前臺)
if (appIsRunning(pakeName) == 0) then
isRun = runApp(pakeName);
mSleep(10*1000);
if isRun ~= 0 then
cdLogError(pakeName.."App啟動失敗");
return false;
end
else
runApp(pakeName);
mSleep(kDeviceAwakenTime);
end
return true;
end
幫助類,這里只用到了三個方法。注意啟動App的方法,先需要獲取到App的包名,如微信的包名:com.tencent.mm,方法里先判斷設(shè)備鎖了會解鎖設(shè)備,然后再向上滑動解鎖,當(dāng)然不同的設(shè)備解鎖方式會不一樣。
四.LXListenMessageList.lua
require("LXWithFriendChat")
--監(jiān)聽消息列表
function listenMessageList ()
while (true) do
readWithoutMessage();
mSleep(timerSleepConst);
end
end
local recordScrollerMessageList = false;
--在消息列表查找未讀消息
function readWithoutMessage()
local needScroller = true;
for y = kNavBarMaxHeight+26, screenHeight-kTabBarHeght, kHomeCellHeight do
if (isColor( 133, y, 0xff4848, 85)) then
tap(133, y);
mSleep(kClickWillPushTime);
withFriendChat();
else
needScroller = false;
end
end
if needScroller then--needScroller
moveTo(200, screenHeight*0.85, 200, screenHeight*0.2, 30);
recordScrollerMessageList = true;
elseif recordScrollerMessageList then
tap(homeTabBtnsRegion(1));--如果次界面沒有了未讀消息,判斷如果滾動過消息列表,則須滾動到頂端。
recordScrollerMessageList = false;
end
end
在main.lua里調(diào)用listenMessageList方法后執(zhí)行了一個死循環(huán),會一直監(jiān)聽消息列表,通過方法readWithoutMessage去實現(xiàn)。這里通過查詢x坐標(biāo)為133的點是否為紅色0xff4848,去判斷這位好友是否發(fā)了新消息,若是,則點擊進(jìn)入,withFriendChat()方法去處理具體的聊天互動。后面判斷會滑動列表繼續(xù)查找有無新消息。
五.LXWithFriendChat.lua
require("LXHelpClass")
--與好友持續(xù)交流
function withFriendChat()
local waitingTime = 0;
while (waitingTime < kWaitingTimeOfS) do--在聊天界面有新消息時可等待好友十秒,無消息則返回消息列表
local flag = managerFrindNewMessages();
if flag then
waitingTime = 0;
end
waitingTime = waitingTime + 1;
mSleep(1000);
end
clickBackBtn();
end
--發(fā)送meaasge
function sendMessage(message)
tap(250, screenHeight-50); -- 點擊輸入框
switchTSInputMethod(true); -- 切換到觸動/幫你玩輸入法
inputText(message) -- 輸入
--switchTSInputMethod(false); -- 切換到之前的輸入法
tap(screenWidth-60, screenHeight-50);--點擊發(fā)送按鈕
mSleep(kSendMessageTime);
end
--打開紅包
function openRedPacket(y)
tap(kChatBubbleX1, y);--點擊紅包
mSleep(kOpenRedPacketTime);
tap((screenWidth/2.0), (screenHeight/2.0) + 150);--點擊“開”
mSleep(kOpenRedPacketTime);
clickBackBtn();
end
--在聊天界面,處理與好友的交流
function managerFrindNewMessages()
if judgeIsRedPacket() then
return true;
end
local receivedMessage = recognizeFriendMessage();
if (receivedMessage == "" or receivedMessage == nil) then
return false;
end
--數(shù)據(jù)請求
local urlPath = string.format(kTuLingURL, receivedMessage);
local ret = httpGet(urlPath);
--這里就不解析html數(shù)據(jù)
local startPosition,endPosition = ret:find("<html>");
if startPosition == 1 then
return false;
end
local tem = json.decode(ret)
local code = tostring(tem.code)
if (code == "100000" or code == "40002") then
message = tostring(tem.text);
sendMessage(message);
toast("收到:"..receivedMessage.."\n發(fā)送:"..message,2);
end
return true;
end
......
這里的代碼比較多,實現(xiàn)互動的具體思路是:先查找好友的最新消息的坐標(biāo)區(qū)域,然后再從此區(qū)域中識別文字,當(dāng)然識別會有誤差,在實際項目中并不可?。ê竺嫖視^續(xù)分享通過破解獲取微信數(shù)據(jù)庫的數(shù)據(jù)拿到準(zhǔn)確消息的文章),然后利用圖靈機(jī)器人的API,傳入剛才識別到的聊天內(nèi)容會返回相應(yīng)的回答,然后點擊輸入框(必須切換成觸動輸入法),再輸入返回的數(shù)據(jù),發(fā)送。變完成了自動與好友互動的功能。其中通過找色有識別紅包的功能。這里判斷好友最后一條消息是否是我未處理的思路是,找色識別到好友消息的y坐標(biāo),然后增加y坐標(biāo)找色,如果找到我發(fā)送消息的綠色背景0xebebeb值,則說明該條最后接受的消息我已經(jīng)處理過了,當(dāng)然這樣的判斷也不合理,只是練習(xí)使用嘛,哈哈。
結(jié)束語:
這只是一個練習(xí)Lua與觸動精靈的簡單demo,里面的代碼并不嚴(yán)謹(jǐn),未做容錯處理。看到了這樣的效果,作為iOS或者Android的你有沒有想自己嘗試一下寫寫一些自動化功能的腳本或插件,歡迎討論。
源碼請點擊github地址下載。