Lua腳本在微信上的應(yīng)用-自動(dòng)與好友聊天互動(dòng)和搶紅包

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

效果圖1.gif
效果圖2.gif

上面的功能是用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)單如下圖:

screen1.png

一.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地址下載蔽午。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末及老,一起剝皮案震驚了整個(gè)濱河市骄恶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虐呻,老刑警劉巖寞秃,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朗涩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谢床,警方通過查閱死者的電腦和手機(jī)萤悴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門覆履,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硝全,“玉大人,你說我怎么就攤上這事析藕≌穗剩” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)遮精。 經(jīng)常有香客問我本冲,道長(zhǎng),這世上最難降的妖魔是什么檬洞? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任疮胖,我火速辦了婚禮闷板,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘性昭。我一直安慰自己糜颠,他們只是感情好萧求,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布元旬。 她就那樣靜靜地躺著,像睡著了一般坑资。 火紅的嫁衣襯著肌膚如雪穆端。 梳的紋絲不亂的頭發(fā)上体啰,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天荒勇,我揣著相機(jī)與錄音,去河邊找鬼常柄。 笑死西潘,一個(gè)胖子當(dāng)著我的面吹牛喷市,可吹牛的內(nèi)容都是我干的威恼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼斤蔓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起友驮,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤卸留,失蹤者是張志新(化名)和其女友劉穎耻瑟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淤毛,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡低淡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蔗蹋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猪杭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皂吮。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡税手,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艺挪,到底是詐尸還是另有隱情兵扬,我是刑警寧澤麻裳,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站器钟,受9級(jí)特大地震影響津坑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俱箱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一国瓮、第九天 我趴在偏房一處隱蔽的房頂上張望灭必。 院中可真熱鬧狞谱,春花似錦、人聲如沸禁漓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽播歼。三九已至伶跷,卻和暖如春蹈集,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背郭怪。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工促绵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叙甸,地道東北人糖驴。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓感昼,卻偏偏與公主長(zhǎng)得像蜕琴,于是被迫代替她去往敵國(guó)和親恃逻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凸郑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫配紫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,119評(píng)論 4 61
  • 2016-07-08薯片 “西裝褲下死澳盐,做鬼也風(fēng)流旬蟋。” 歷經(jīng)無數(shù)個(gè)寂寞難耐的夜晚,期待已久的《老九門》終于開播了首尼。...
    我叫如歌閱讀 1,469評(píng)論 5 2
  • 一只兔子查排,喜歡上了一只狼叛买,一天,兔子對(duì)狼說娃圆,我喜歡你谦炬。 狼看了兔子一眼,問它,我該怎么相信你供炎? 兔子思考了一陣惨奕,回...
    M閑暇時(shí)光閱讀 30,380評(píng)論 2 3
  • 再差的牌也要心平氣和地盡力打下去卧波,再難的事也要不厭其煩地做下去。要加快腳步,保持堅(jiān)定。 今晚要去解決今天學(xué)習(xí)的內(nèi)容咪惠!
    cqmudhw閱讀 86評(píng)論 0 0