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

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

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

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

screen1.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容