用 Lua 實(shí)現(xiàn)微信跳一跳輔助

開發(fā)環(huán)境

電腦:Windows 或 Mac
軟件:Lua 編輯器、抓色器(可以在官網(wǎng)下載)
手機(jī):觸動(dòng)精靈(iOS 或者安卓都可以)

工作原理

抓色器遠(yuǎn)程連接手機(jī)截圖,找到坐標(biāo)點(diǎn)和顏色值,作業(yè)部落上有使用教程。(https://www.zybuluo.com/miniknife/note/629913)。
通過 Lua 實(shí)現(xiàn)模擬點(diǎn)擊

網(wǎng)上分享的帖子不管是 python 還是其他語言基本都是安卓平臺(tái)的,其實(shí) iOS 也可以用 Lua 模擬點(diǎn)擊實(shí)現(xiàn)跳一跳自動(dòng)輔助。
前提是你的 iPhone 越獄了。

步驟:

  • 安裝抓色器(用來截圖取點(diǎn))
  • 越獄手機(jī)添加源:apt.touchsprite.com,安裝觸動(dòng)精靈
  • 在手機(jī)上截取跳一跳界面,也可以用抓色器遠(yuǎn)程截圖:打開觸動(dòng)更多界面的局域網(wǎng)廣播開關(guān),手機(jī)和電腦在同一局域網(wǎng)就可以
  • 在抓色器上打開截圖,鼠標(biāo)放到小人的底部中心點(diǎn),同時(shí)按下 CTRL 和鼠標(biāo),在周圍也取兩個(gè)點(diǎn)
    抓色器
  • 生成代碼,插入到下面的代碼中(可以用觸動(dòng)精靈的編輯器,遠(yuǎn)程調(diào)試比較方便)
  • 編輯器設(shè)備標(biāo)簽頁搜索連接設(shè)備(也要在同一個(gè)局域網(wǎng)),打開腳本點(diǎn)擊遠(yuǎn)程運(yùn)行(需要提前進(jìn)入游戲界面)


    編輯器

代碼:

local screenWidth, screenHeight= getScreenSize();--獲取屏幕分辨率
local distanceTimeRate = 1.15--按壓時(shí)間與距離的系數(shù),數(shù)字越大表示蓄力時(shí)間越長,當(dāng)前為 6P 的系數(shù)local
local targetPositionOffset = screenHeight * 0.012--表示方塊最上方的點(diǎn),距離中心點(diǎn)的偏移

function Touch(x, y, millsSecond)
    touchDown(x, y)
    mSleep(millsSecond)
    touchUp(x, y)
end

function main()
--  dialog("請?jiān)?秒內(nèi)打開游戲,并點(diǎn)擊開始按鈕", 0);
    mSleep(1000)
    DoLoop()
end

function DoLoop()
    while true do 
        keepScreen(true);  
        if DoJump() == false then
            keepScreen(false); 
            break
        end
        keepScreen(false); 
        mSleep(2000)
    end
end

function DoJump() 
    local x, y = GetCalcSelfPosition()
    if x == -1 or x == 0 then
        return false
    end
    local endX = screenWidth-3  -- 1080 1920
    local endY = screenHeight * 0.7
    local startX = 0
    local startY = screenHeight * 0.2

    if x < screenWidth / 2 then
        startX =  screenWidth / 2
    else
        endX = screenWidth / 2
    end
    
    local targetX, targetY = GetTargetPosition(startX, startY, endX, endY)
    local distance = math.sqrt( (x - targetX) * (x - targetX) + (y - targetY) * (y - targetY) )
    local pressTime = CalcHoldTime(distance)
    Touch(100,100, pressTime)
    return true
end

function GetCalcSelfPosition()
    x,y = findMultiColorInRegionFuzzy( 0x373860, "-2|-214|0x34353d,-42|-2|0x2b2b49,40|-4|0x393550", 98, 0, 0, screenWidth, screenHeight) -- 6p
--  x,y = findMultiColorInRegionFuzzy( 0x38365e, "-16|-6|0x35335a,13|-5|0x39375f", 98, 0, 0, screenWidth, screenHeight)
    return x, y
end

function GetTargetPosition(startX, startY, endX, endY)
    local step = 3
    local r, g, b, rr, gg, bb 
    for y = startY , endY, step do
        r, g, b = getColorRGB(1, y)
        for x = startX, endX , step do
            rr, gg, bb  = getColorRGB(x, y)
            if isColor(r, g, b, rr, gg, bb, 98)  then
                r = rr
                g = gg
                b = bb
            else
                return x, y + targetPositionOffset
            end
        end
    end
    return -1, -1
end

function isColor(rr, gg, bb, r, g, b ,s) 
    local fl,abs = math.floor,math.abs
    s = fl(0xff*(100-s)*0.01)
    if abs(r-rr)<s and abs(g-gg)<s and abs(b-bb)<s then
        return true
    end
    return false
end

function CalcHoldTime(distance)
    return distance * distanceTimeRate
end

main()

如果腳本跑的并不準(zhǔn)確,可以修改參數(shù)
distanceTimeRate:數(shù)字越大表示蓄力時(shí)間越長
targetPositionOffset:表示方塊最上方的點(diǎn),距離中心點(diǎn)的偏移
如果還是不行的話,那就算了吧...

思路

  1. 確定自己的當(dāng)前位置
    直接查找像素就可以了
  2. 確定目標(biāo)點(diǎn)位置
    可以通過自己當(dāng)前的位置判斷一個(gè)大致的范圍。
    然后通過從左上,到右下角,依次遍歷像素。找到方塊最上方的像素點(diǎn)。
    然后把y + 上一個(gè)大概的值來確定。
  3. 距離與時(shí)間轉(zhuǎn)換
    游戲的公式是線性的,直接乘以系數(shù)就可以了

需要優(yōu)化的點(diǎn)

  1. 并沒有去精確的識(shí)別位置
  2. sleep 函數(shù)并不精確,需要一個(gè)更加精確的方式來控制
  3. 不同分辨率的屏幕,并沒有做完美的適配,需要各自截圖取小人底部的坐標(biāo)
  4. 距離時(shí)間的比率,不應(yīng)該粗暴的用一個(gè)值去控制,應(yīng)該用兩個(gè)值去分別乘以x,y的距離,然后再算距離(這得看游戲畫面本身的屏幕適配是如何做的)
  5. 性能差的機(jī)型,跑得并不穩(wěn)定(我用紅米2,跑了大概10次,最高跑到2000多分,最低只跑了幾百分),這有一部分是因?yàn)椤皟?yōu)化點(diǎn) 1”導(dǎo)致的。

本文源碼和原理參考自知乎 xtutu

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,554評論 0 17
  • 摘要 家庭一般都是撥號上網(wǎng),只有一個(gè)人能用網(wǎng)絡(luò)資源,家里的其他成員就不能用網(wǎng)絡(luò)資源,為了讓每個(gè)成員都能用網(wǎng)絡(luò)資源,...
    smallBear閱讀 4,948評論 1 4
  • 我們可以把因特網(wǎng)看成由許多主干網(wǎng)絡(luò)組成,而這些主干網(wǎng)絡(luò)由一些國際的、國家的和地區(qū)的ISP來運(yùn)營。主干網(wǎng)通過一些連接...
    Zhang21閱讀 3,338評論 0 6
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,556評論 25 708
  • 我參加了草莓的品叔戰(zhàn)隊(duì),每周要寫一篇拆書筆記(RIA)。 我大部分時(shí)候是提前寫好,在規(guī)定期限發(fā)上,但有幾次,因?yàn)檫z...
    花兒的書房閱讀 111評論 0 0