首先看看Lua腳本在App應(yīng)用程序上的作用效果穿铆,如果感興趣再繼續(xù)往下流覽您单。
上面的功能是用Lua語言開發(fā)的一個(gè)腳本,然后再結(jié)合觸動(dòng)精靈給予的腳本支持產(chǎn)生的效果荞雏。
Lua 是一種輕量小巧的腳本語言虐秦,用標(biāo)準(zhǔn)C語言編寫并以源代碼形式開放, 其設(shè)計(jì)目的是為了嵌入應(yīng)用程序中凤优,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能悦陋。
Lua的應(yīng)用場(chǎng)景:
- 游戲開發(fā)
- 獨(dú)立應(yīng)用腳本
- Web 應(yīng)用腳本
- 擴(kuò)展和數(shù)據(jù)庫插件如:MySQL Proxy 和 MySQL
- WorkBench
- 安全系統(tǒng),如入侵檢測(cè)系統(tǒng)
觸動(dòng)精靈的底層是 Lua 腳本語言筑辨,支持 Lua 5.2.3 版本的所有語法與基本函數(shù)俺驶,并在其的基礎(chǔ)上添加了一些擴(kuò)展函數(shù),用于取色棍辕、找色暮现、找圖、發(fā)送觸摸事件等高級(jí)功能的實(shí)現(xiàn)只要能夠在手機(jī)上完成的人為操作,觸動(dòng)精靈都可以代替完成楚昭,不僅省力栖袋,而且高效。
觸動(dòng)精靈的應(yīng)用場(chǎng)景:
- 編寫自己App的腳本完成自動(dòng)化測(cè)試
- 開掛刷機(jī)
- 微信機(jī)器人(包括開發(fā)任意應(yīng)用的機(jī)器人)
因此我們可以輕易做出上面效果圖的功能抚太,但是需要移動(dòng)設(shè)備必須是以下其一:
- 完美越獄的iOS設(shè)備
- Root權(quán)限的Android設(shè)備
- 具有Root權(quán)限的Android模擬器
提醒:Android與iOS兼容大部分函數(shù)。
模擬器連接編輯器比較麻煩尿贫,具體操作請(qǐng)查看官方文檔电媳。推薦使用天天模擬器匆背,具有別的模擬器不具備的特性。
開發(fā)所需的必備工具:
- 具備windows環(huán)境開發(fā)
- 在移動(dòng)設(shè)備上安裝觸動(dòng)精靈App
- IDE 腳本編輯器TouchSprite Studio
- 取點(diǎn)抓色器TSColorPicker
工具使用教程請(qǐng)查閱官方文檔钝尸,下面進(jìn)入正題括享,解析上面效果圖功能代碼珍促,項(xiàng)目結(jié)構(gòu)非常簡(jiǎn)單如下圖:
一.main.lua
require("LXListenMessageList")
--確保微信已啟動(dòng)
if runAppWithName(weChatPakeName) == true then
listenMessageList();--監(jiān)聽消息列表
end
新建工程時(shí)自動(dòng)創(chuàng)建的腳本文件铃辖,需要注意的是lua功能沒有主函數(shù)可言,任何一個(gè)腳本都可以自己執(zhí)行猪叙,不用依賴main.lua娇斩,這里只做了一個(gè)功能,就是監(jiān)聽消息列表穴翩,需首先啟動(dòng)App犬第。
二.LXConstClass.lua
內(nèi)容略,這是一個(gè)常量文件芒帕,具體代碼可下載源碼查看歉嗓。
三.LXHelpClass.lua
require("LXConstClass")
--點(diǎn)擊返回按鈕
function clickBackBtn()
tap(42, kStatusMaxHeight + (kNavBarMaxHeight-kStatusMaxHeight)/2.0);
mSleep(kClickBackBtnTime);
end
--首頁tab的四個(gè)標(biāo)簽對(duì)應(yīng)的點(diǎn)擊的點(diǎn)
function homeTabBtnsRegion(index)
return kTabBtnWidth*(index-0.5), (screenHeight - kHomeTabTextHeight);
end
--啟動(dòng)相應(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里必須再啟動(dòng)(從pakeName名的app按了home鍵后此方法還認(rèn)為這個(gè)app是在前臺(tái))
if (appIsRunning(pakeName) == 0) then
isRun = runApp(pakeName);
mSleep(10*1000);
if isRun ~= 0 then
cdLogError(pakeName.."App啟動(dòng)失敗");
return false;
end
else
runApp(pakeName);
mSleep(kDeviceAwakenTime);
end
return true;
end
幫助類背蟆,這里只用到了三個(gè)方法鉴分。注意啟動(dòng)App的方法,先需要獲取到App的包名带膀,如微信的包名:com.tencent.mm志珍,方法里先判斷設(shè)備鎖了會(huì)解鎖設(shè)備,然后再向上滑動(dòng)解鎖垛叨,當(dāng)然不同的設(shè)備解鎖方式會(huì)不一樣伦糯。
四.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));--如果次界面沒有了未讀消息,判斷如果滾動(dòng)過消息列表嗽元,則須滾動(dòng)到頂端舔株。
recordScrollerMessageList = false;
end
end
在main.lua里調(diào)用listenMessageList方法后執(zhí)行了一個(gè)死循環(huán),會(huì)一直監(jiān)聽消息列表还棱,通過方法readWithoutMessage去實(shí)現(xiàn)载慈。這里通過查詢x坐標(biāo)為133的點(diǎn)是否為紅色0xff4848,去判斷這位好友是否發(fā)了新消息珍手,若是办铡,則點(diǎn)擊進(jìn)入,withFriendChat()方法去處理具體的聊天互動(dòng)琳要。后面判斷會(huì)滑動(dòng)列表繼續(xù)查找有無新消息寡具。
五.LXWithFriendChat.lua
require("LXHelpClass")
--與好友持續(xù)交流
function withFriendChat()
local waitingTime = 0;
while (waitingTime < kWaitingTimeOfS) do--在聊天界面有新消息時(shí)可等待好友十秒,無消息則返回消息列表
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); -- 點(diǎn)擊輸入框
switchTSInputMethod(true); -- 切換到觸動(dòng)/幫你玩輸入法
inputText(message) -- 輸入
--switchTSInputMethod(false); -- 切換到之前的輸入法
tap(screenWidth-60, screenHeight-50);--點(diǎn)擊發(fā)送按鈕
mSleep(kSendMessageTime);
end
--打開紅包
function openRedPacket(y)
tap(kChatBubbleX1, y);--點(diǎn)擊紅包
mSleep(kOpenRedPacketTime);
tap((screenWidth/2.0), (screenHeight/2.0) + 150);--點(diǎn)擊“開”
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ù)請(qǐng)求
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
......
這里的代碼比較多童叠,實(shí)現(xiàn)互動(dòng)的具體思路是:先查找好友的最新消息的坐標(biāo)區(qū)域,然后再?gòu)拇藚^(qū)域中識(shí)別文字,當(dāng)然識(shí)別會(huì)有誤差厦坛,在實(shí)際項(xiàng)目中并不可任蹇濉(后面我會(huì)繼續(xù)分享通過破解獲取微信數(shù)據(jù)庫的數(shù)據(jù)拿到準(zhǔn)確消息的文章),然后利用圖靈機(jī)器人的API杜秸,傳入剛才識(shí)別到的聊天內(nèi)容會(huì)返回相應(yīng)的回答撬碟,然后點(diǎn)擊輸入框(必須切換成觸動(dòng)輸入法),再輸入返回的數(shù)據(jù)惶傻,發(fā)送其障。變完成了自動(dòng)與好友互動(dòng)的功能。其中通過找色有識(shí)別紅包的功能粮揉。這里判斷好友最后一條消息是否是我未處理的思路是抚笔,找色識(shí)別到好友消息的y坐標(biāo)殊橙,然后增加y坐標(biāo)找色狱从,如果找到我發(fā)送消息的綠色背景0xebebeb值季研,則說明該條最后接受的消息我已經(jīng)處理過了,當(dāng)然這樣的判斷也不合理与涡,只是練習(xí)使用嘛驼卖,哈哈。
結(jié)束語:
這只是一個(gè)練習(xí)Lua與觸動(dòng)精靈的簡(jiǎn)單demo怎囚,里面的代碼并不嚴(yán)謹(jǐn)恳守,未做容錯(cuò)處理【看到了這樣的效果,作為iOS或者Android的你有沒有想自己嘗試一下寫寫一些自動(dòng)化功能的腳本或插件喳钟,歡迎討論奔则。
源碼請(qǐng)點(diǎn)擊github地址下載蔽午。