日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

手游自动挂机脚本开发历程

發(fā)布時(shí)間:2023/12/14 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手游自动挂机脚本开发历程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

事件起因

國(guó)慶節(jié)期間,因?yàn)楣ぷ飨鄬?duì)閑暇,自己鬼使神差地下載了一個(gè)夢(mèng)幻西游手游玩了幾天,結(jié)果一周就這么過(guò)去了,一玩起游戲來(lái),那就是白駒過(guò)隙啊。節(jié)日過(guò)后,游戲自然是沒(méi)時(shí)間再玩了,畢竟有一大堆開(kāi)發(fā)任務(wù)正一個(gè)個(gè)排著隊(duì)等著去搞。時(shí)間一晃就到了兩周前,大概是11月底的時(shí)候,一個(gè)朋友跟我說(shuō)他玩碧藍(lán)航線,每個(gè)月都要花20多塊錢(qián)買(mǎi)腳本。當(dāng)時(shí)聽(tīng)到腳本居然還要花錢(qián)去買(mǎi)時(shí),作為一個(gè)程序員,不知道哪里來(lái)的正義感,決定自己給他寫(xiě)個(gè)免費(fèi)的腳本,能讓朋友省去一個(gè)月20塊的腳本錢(qián)去叫外賣(mài)也算是用腳本掙錢(qián)了。當(dāng)然如果能有別人也來(lái)用自己寫(xiě)的腳本,那當(dāng)然更好,能幫到更多的人,由此小弟便踏上了一條游戲腳本不歸路。。。

初識(shí)按鍵精靈

初次寫(xiě)腳本,小弟我也是一臉懵逼,以前完全沒(méi)寫(xiě)過(guò)游戲腳本,當(dāng)時(shí)牛皮吹的爽,現(xiàn)在不知咋搞心理有點(diǎn)慌。無(wú)奈只能調(diào)研下現(xiàn)在市面上寫(xiě)腳本的工具了,當(dāng)時(shí)了解按鍵精靈,觸動(dòng)精靈等現(xiàn)在用得比較廣泛的腳本工具。按鍵精靈應(yīng)該是用的最多了,所以小弟就選擇了按鍵精靈來(lái)寫(xiě)腳本。按鍵精靈分為PC版和手機(jī)版,小弟寫(xiě)的手游掛機(jī)腳本,當(dāng)然是選擇手機(jī)版了,然后按照教程,在android模擬器上安裝了按鍵精靈APP并且在PC上安裝了按鍵精靈手機(jī)助手,腳本編寫(xiě)之路,就這么正式開(kāi)始了,加油!!

按鍵精靈學(xué)習(xí)

初次上手按鍵精靈,還是有點(diǎn)蒙圈。不得不說(shuō),按鍵精靈是寫(xiě)程序小白們使用的,所以函數(shù)的使用都封裝得很簡(jiǎn)單,而且變量可以定義中文,較復(fù)雜的代碼可以自動(dòng)生成,所以小弟我花了一天的時(shí)間基本上就把按鍵精靈的各個(gè)部分都熟悉了(這里沒(méi)有給按鍵精靈打廣告的意思,大家不要誤會(huì)。。。)按鍵精靈雖然說(shuō)是腳本編寫(xiě),但是用的最多就恐怕就是用來(lái)寫(xiě)游戲腳本了吧。雖然按鍵精靈確實(shí)寫(xiě)腳本比較方便,但是還是有一些不足之處的。讓小弟最想吐槽的就是按鍵精靈的OCR功能,簡(jiǎn)直是形同虛設(shè),根本不能用,文字識(shí)別總是失敗(大概率失敗,一旦失敗,就又得重新找點(diǎn),重新讓這個(gè)精靈識(shí)別,然后又是大概率失敗,過(guò)程之痛苦,我覺(jué)得程序員不應(yīng)該忍受這種痛苦),即使識(shí)別成功了,實(shí)際用的時(shí)候也不一定能識(shí)別出來(lái),令人不得不吐槽一下。所以下面小弟我就稍微總結(jié)一下按鍵精靈讓我感受到的優(yōu)勢(shì)和缺點(diǎn)吧。

按鍵精靈的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)缺點(diǎn)
語(yǔ)法簡(jiǎn)單 并且配有代碼示例部分顏色函數(shù)使用效果不好
配有實(shí)時(shí)抓取手機(jī)屏幕工具 方便邏輯編寫(xiě)OCR模塊效果很差 使用麻煩
調(diào)試方便 有基本的調(diào)試工具

上面說(shuō)到的OCR模塊效果很差,可以說(shuō)是一個(gè)比較重要的問(wèn)題,因?yàn)樵谟螒蚰_本編寫(xiě)中,經(jīng)常需要用到文字識(shí)別,只有識(shí)別到文字了,才能據(jù)此進(jìn)行下面的操作。比如在《夢(mèng)幻西游》手游中,找到了”師門(mén)任務(wù)“四個(gè)字,才能決定是否要開(kāi)始師門(mén)任務(wù),或者是返回任務(wù)已經(jīng)被完成。個(gè)人認(rèn)為,一個(gè)好用的OCR,才是游戲腳本的靈魂所在,其他的邏輯只是輔助而已。當(dāng)然,我們還可以退而求其次,用判斷像素點(diǎn)顏色的方法來(lái)判斷是否有任務(wù)存在,小弟我在按鍵精靈OCR嘗試未果的情況下就是用了這種方式,對(duì)于PC版的掛機(jī)腳本,可以使用”大漠插件“來(lái)作文字識(shí)別,就小弟了解,這個(gè)插件效果還是不錯(cuò)的,解決了文字識(shí)別的問(wèn)題,讓很多PC上的掛機(jī)腳本穩(wěn)定了很多。但是安卓系統(tǒng)下無(wú)法使用,所以這跟小弟無(wú)關(guān),也就沒(méi)深入了解。另外順便再提一句,現(xiàn)在都9102年了,github上開(kāi)源的中文OCR引擎咱整一個(gè)不香嗎,話題扯偏了,小弟我目前也沒(méi)用到AI的程度,后面會(huì)加入進(jìn)來(lái)。。。


上面的截圖是按鍵精靈版的師門(mén)任務(wù)部分截圖,從圖中可以看出,按鍵精靈支持變量中文,并且沒(méi)有復(fù)雜語(yǔ)法,上手很容易,歷經(jīng)了兩天的開(kāi)發(fā),小弟最終把師門(mén)掛機(jī)腳本,主線任務(wù)掛機(jī)腳本,抓鬼腳本寫(xiě)完了,師門(mén)腳本和抓鬼腳本穩(wěn)定都還可以,除了按鍵精靈運(yùn)行一段時(shí)間自動(dòng)崩潰以外,這個(gè)問(wèn)題讓小弟束手無(wú)策,難道要再寫(xiě)一個(gè)腳本在腳本崩潰以后再把腳本啟動(dòng)起來(lái)?

和按鍵精靈分手

本來(lái)小弟滿(mǎn)懷期待地打算把寫(xiě)好的腳本打包發(fā)送給同學(xué),讓他試試,但是一道晴天霹靂讓小弟我?guī)捉罎?#xff0c;打包居然要收費(fèi)!!!,就19年下半年剛開(kāi)始收費(fèi)的,按月收費(fèi),最低30元(好像是),最高一百多。繳費(fèi)越高,寫(xiě)的腳本就能給越多的人使用,最低的30元腳本,只能給幾十個(gè)人使用??墒切〉芪揖妥约河冒∥?#xff0c;我又不拿去賣(mài)錢(qián),這也要收費(fèi)。關(guān)于收費(fèi),小弟這里就不提了,畢竟這是人家自己的東西,咱也不好多說(shuō)什么,沒(méi)辦法,只能和按鍵精靈說(shuō)拜拜了,不是因?yàn)檫@區(qū)區(qū)30塊錢(qián),而是小弟覺(jué)得這里不應(yīng)該花這個(gè)錢(qián),一來(lái)自己是程序員,本來(lái)就應(yīng)該以更”程序員“的方式做這件事,二來(lái)是小弟是給別人無(wú)償幫忙寫(xiě)腳本,這個(gè)錢(qián)不應(yīng)該掏。

另一條路

放棄了按鍵精靈,就意味著放棄了那一套方便快捷的工具,放棄那兩天幸苦產(chǎn)出的代碼。小弟沒(méi)辦法,所有東西都要自己想辦法來(lái)解決了,通過(guò)使用按鍵精靈,小弟我發(fā)現(xiàn),寫(xiě)游戲腳本最重要的是解決兩個(gè)問(wèn)題:

  • 像素顏色查找問(wèn)題,即捕獲屏幕上某個(gè)坐標(biāo)點(diǎn)的顏色(核心問(wèn)題,用于判斷當(dāng)前屏幕是什么內(nèi)容)
  • android交互功能(點(diǎn)擊,滑動(dòng) 等基本模擬操作)
  • 只要解決了上面這兩個(gè)問(wèn)題,做一個(gè)基本的手游掛機(jī)腳本就足夠了,所以小弟我針對(duì)這兩個(gè)問(wèn)題,開(kāi)始網(wǎng)上新一輪的調(diào)研,在此期間也走過(guò)一些彎路,但是功夫不負(fù)有心人,最終還是摸索出了一條可行的路,下面就講述下小弟我的學(xué)習(xí)路程。

    艱難的摸索

    因?yàn)槭鞘钟文_本,游戲本身是運(yùn)行在安卓模擬器上的,那么掛機(jī)腳本在小弟認(rèn)為可以分為兩種,一種是直接運(yùn)行在android模擬器下的,另一種是運(yùn)行在PC上,通過(guò)發(fā)送遠(yuǎn)程命令操作模擬器。小弟當(dāng)時(shí)調(diào)研時(shí)理解還不夠深,所以選擇了第二種方式,通過(guò)adb(android debug bridge)將PC與模擬器連接起來(lái)的方式操作模擬器。實(shí)際上用第二種方式,將腳本打包在模擬器環(huán)境下直接運(yùn)行效果才是最好的,當(dāng)然,難度也會(huì)大不少。

    Appium的學(xué)習(xí)

    為了模擬用戶(hù)操作android,也就是解決第二個(gè)問(wèn)題,小弟我首先了解到的是使用Appium,Appium是一個(gè)用于android系統(tǒng)的自動(dòng)化測(cè)試工具,里面提供了很多模擬用戶(hù)操作的功能,包括點(diǎn)擊,滑動(dòng),截屏等等。當(dāng)然他最強(qiáng)的之處并不在此,Appium能夠解析出當(dāng)前App的前端控件,相比起之前按鍵精靈的點(diǎn)擊某個(gè)坐標(biāo)的模擬操作方式,Appium能夠根據(jù)控件的id等屬性定位到某個(gè)具體的控件,定位之后做后續(xù)操作。這種方式的好處就在于,通過(guò)控件屬性定位坐標(biāo),跟屏幕分辨率無(wú)關(guān)。如果單單寫(xiě)死一個(gè)坐標(biāo)位置去點(diǎn)擊,手機(jī)換個(gè)分辨率就失效了,也是為什么手游腳本都固定一個(gè)分辨率的原因所在。

    上圖是Appium連接成功后的配置截圖,其實(shí)核心參數(shù)就是deviceName,指定本地的模擬器地址就可以。在搭建Appium環(huán)境時(shí),小弟我也是花了兩天的時(shí)間到處查閱資料和學(xué)習(xí)相關(guān)的用法,一開(kāi)始使用的雷電模擬器,但是始終連接不上,最后換了個(gè)模擬器,用夜神模擬器后就成功了,所以如果連接不上模擬器,不妨換個(gè)模擬器試試,當(dāng)然首先還是看看日志,有沒(méi)有打印什么錯(cuò)誤。

    初代腳本形成

    小弟我使用python編寫(xiě)此腳本,核心流程如下:
    腳本啟動(dòng) -> 啟動(dòng)Appium -> 調(diào)用Appium截屏 -> 判斷當(dāng)前頁(yè)面狀態(tài) -> 調(diào)用Appium模擬操作 -> 任務(wù)結(jié)束 退出腳本
    連接的代碼如下:

    #python desired_caps = {'platformName': 'Android','udid':'127.0.0.1:62001','deviceName': 'deviceName','platformVersion':'5.1.1',#'appPackage': 'com.tencent.mm',#'appActivity':'com.tencent.mm.plugin.account.ui.WelcomeActivity','unicodekeyboard':True }# 連接android 客戶(hù)端 driver = app_web.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

    突然醒悟 二代腳本形成

    Appium上面也說(shuō)過(guò)了,能解析頁(yè)面,類(lèi)似于解析html的BeautifulSoup 一樣,但是游戲頁(yè)面哪有”前端“這種說(shuō)法呢,哪有樹(shù)狀的控件能讓我解析呢,我用Appium捕獲到的頁(yè)面永遠(yuǎn)都是一個(gè)大的Frame,然后里面什么也沒(méi)有,更別提解析了。。。
    但是Appium底層也是調(diào)用的adb,那為何我不直接使用adb來(lái)完成所有這一切操作呢,既然Appium的優(yōu)勢(shì)不復(fù)存在,使用他反而成為了累贅。所以小弟我把Appium去掉,重新更新了一版腳本,用python調(diào)用adb命令完成截圖,模擬操作等命令
    腳本核心思路如下:
    腳本啟動(dòng) -> 截圖到本地 -> 比對(duì)坐標(biāo)點(diǎn)顏色 -> 判斷出于什么頁(yè)面 -> 執(zhí)行具體操作 -> 刪除本地圖片 -> 重新截圖新一輪判斷
    下面把核心代碼貼出來(lái),完整代碼小弟我在文章后面會(huì)給出git倉(cāng)庫(kù)地址,感興趣的同學(xué)可以clone一下看看

    首先是用到的adb基本命令如下:
    SCREENSHOT = "adb exec-out screencap -p > " # 末尾需加上截屏地址 TAP = "adb shell input tap " # 點(diǎn)擊屏幕 x y SWIPE = "adb shell input swipe " # 滑動(dòng)屏幕

    以上分別是截屏保存到PC本地,點(diǎn)擊模擬器坐標(biāo)x y 以及滑動(dòng)模擬器屏幕,當(dāng)然后面還有一些參數(shù),參數(shù)根據(jù)需要加在命令后就行了,這里就省略掉參數(shù)吧

    PC命令行中執(zhí)行 adb 截屏命令
    def get_screen_shot(self, path):cmd = Constants.SCREENSHOT + pathos.popen(cmd)
    核心函數(shù) 圖片像素顏色采集和比對(duì)
    # 對(duì)比圖片像素顏色值def comparePixelColor(self, srcImg, color, position, simThreshold):# 計(jì)算歐式空間距離# 首先獲取 x 和 y 坐標(biāo)的顏色值targetColor = self.getPixelColor(srcImg, position)# 再分別獲取 R G B 值red = targetColor[0]green = targetColor[1]blue = targetColor[2]diff_red = red - color[0]diff_green = green - color[1]diff_blue = blue - color[2]similarity = (1 - math.sqrt(diff_red*diff_red + diff_blue*diff_blue + diff_green*diff_green) / math.sqrt(255*255 + 255*255 + 255*255))if similarity > simThreshold:return Trueelse:return False# 獲取圖片坐標(biāo)點(diǎn)顏色值def getPixelColor(self, srcImg, positon):srcImg = srcImg.convert('RGBA')str_strlist = srcImg.load()RGBA = str_strlist[positon[0], positon[1]]return RGBA

    以上兩個(gè)函數(shù)分別是獲取圖片中某個(gè)坐標(biāo)點(diǎn)的顏色以及比對(duì)圖片中某個(gè)坐標(biāo)點(diǎn)顏色的函數(shù),對(duì)于比對(duì)顏色函數(shù),計(jì)算歐式空間距離,然后按照比例算出相似度,在腳本中,小弟認(rèn)為相似度大于 0.9以上才認(rèn)為是相似的

    還有一些就是邏輯部分的代碼了,這部分代碼并非核心代碼,小弟這里就不貼出來(lái)了,有興趣的同學(xué)可以github上看

    一段路程的結(jié)束 若有所思

    至此,游戲掛機(jī)腳本就到一段落了,游戲腳本小弟自己使用沒(méi)有什么問(wèn)題,但是離給別人使用還有很長(zhǎng)一段距離,主要是adb截屏到本地耗時(shí)實(shí)在是太久了,截屏一次2s,這個(gè)是硬傷。
    如果要優(yōu)化這個(gè)問(wèn)題,就必須讓腳本執(zhí)行在android系統(tǒng)中,通過(guò)讀取android系統(tǒng)下的設(shè)備文件實(shí)時(shí)獲取屏幕數(shù)據(jù)(需要root),我想這也是為什么按鍵精靈能做到顏色比對(duì)如此之快的原因,因?yàn)榍懊嬉蔡岬搅?#xff0c;按鍵精靈手機(jī)版由兩個(gè)部分組成,一個(gè)是”按鍵精靈手機(jī)助手“,這是安裝在PC上的;另一個(gè)是”按鍵精靈手機(jī)版“,這是安裝在手機(jī)上的APP
    在調(diào)試開(kāi)始前,按鍵精靈會(huì)要求兩者連接。我想,按鍵精靈是在PC上完成腳本的編寫(xiě)(手機(jī)助手編寫(xiě)腳本),然后連通手機(jī)上的APP,把寫(xiě)好的腳本傳到APP中去運(yùn)行,由于是運(yùn)行在手機(jī)測(cè),和我的腳本就不同,它可以直接讀取設(shè)備文件。這也解釋了為什么按鍵精靈要root權(quán)限,因?yàn)闆](méi)有root權(quán)限就無(wú)法讀取文件獲取屏幕像素信息。另外,按鍵精靈的”抓抓“里有一個(gè)截屏功能,如下圖:

    通過(guò)這個(gè)按鈕的截屏?xí)r間也差不多2s左右,我想按鍵精靈這個(gè)2s應(yīng)該跟我上面的使用adb傳文件到本地耗時(shí)2s原理是一樣的,因?yàn)槎际菑哪M器上截圖到本地,應(yīng)該都是走的adb,所以都是2s耗時(shí)

    接下來(lái)的優(yōu)化

    上文提到了最好的方式是讀取設(shè)備文件獲取屏幕像素信息,而非截圖,我自然是打算把優(yōu)化方向放在腳本的執(zhí)行環(huán)境上了,接下來(lái)可能會(huì)改用java編寫(xiě),讓腳本運(yùn)行在android系統(tǒng)下,關(guān)于讀取android屏幕數(shù)據(jù)(FrameBuffer),這里有一篇寫(xiě)得比較好的文章大家可以學(xué)習(xí)一下,牽涉到android底層代碼,讀取FrameBuffer獲取屏幕數(shù)據(jù),路雖難,但只要肯琢磨,一定能理解
    以上就是兩周以來(lái)對(duì)腳本的研究近況,因?yàn)楣P者水平有限,文中難免有表述不準(zhǔn)確的地方,還請(qǐng)大家指出,共同學(xué)習(xí)進(jìn)步~

    項(xiàng)目github地址:https://github.com/dz-ssk/GameScript

    總結(jié)

    以上是生活随笔為你收集整理的手游自动挂机脚本开发历程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。