我們?cè)谕媸钟蔚臅r(shí)候,會(huì)發(fā)現(xiàn)手游中有些步驟總是需要重復(fù)玩索赏,每天都要重復(fù)盼玄,比如重復(fù)做日常任務(wù)啥的,一直肝個(gè)不停参滴,但是其實(shí)很多東西都是固定玩法了强岸,但是就是需要你機(jī)械的重復(fù)锻弓,我就沒(méi)見(jiàn)過(guò)什么手游是不肝的砾赔,就算自詡?cè)鞒套詣?dòng)化的手游,總還是有些東西需要重復(fù)做的青灼。
那么怎么讓程序幫我們自動(dòng)玩手游呢暴心?接下來(lái)介紹怎么做
想想我們是怎么玩手游的,我們玩手游杂拨,是眼睛識(shí)別手游畫(huà)面专普,然后大腦根據(jù)游戲畫(huà)面指揮手指做出相應(yīng)觸摸,觸控操作弹沽。
因此自動(dòng)化玩手游的技術(shù)要點(diǎn)在于如下兩點(diǎn):
- 可以向手機(jī)發(fā)送觸摸檀夹,點(diǎn)擊等事件
- 能夠識(shí)別手游的具體物體對(duì)象
其中第一點(diǎn)可以向手機(jī)發(fā)送觸摸,點(diǎn)擊事件策橘,保證了讓程序可以代替人類手指操作手游畫(huà)面炸渡,第二點(diǎn)則是類似人類眼睛識(shí)別游戲畫(huà)面了。
首先解決第一個(gè)技術(shù)要點(diǎn)丽已,編程向手機(jī)發(fā)送觸摸蚌堵,點(diǎn)擊等事件。
打開(kāi)github項(xiàng)目 https://github.com/openatx/uiautomator2
uiautomator2 這個(gè)項(xiàng)目可以使用python在電腦端控制連接到電腦的手機(jī)
安裝uiautomator2
pip install --upgrade --pre uiautomator2
如果下載很慢沛婴,請(qǐng)使用國(guó)內(nèi)的pip鏡像站吼畏,這是由于大家都知道的原因。。。
pip install --upgrade --pre uiautomator2 -i https://pypi.tuna.tsinghua.edu.cn/simple
安裝完成之后轧抗,連接手機(jī)或者打開(kāi)電腦端的模擬器試試這個(gè)庫(kù)怎么用的究西。
這里我用網(wǎng)易MuMu模擬器做測(cè)試,如果使用真機(jī)測(cè)試的話克伊,請(qǐng)打開(kāi)真機(jī)的usb調(diào)試模式
使用adb devices命令查看電腦連接的設(shè)備钙蒙,執(zhí)行命令后苹威,顯示已經(jīng)有一個(gè)設(shè)備
adb devices
List of devices attached
emulator-5554 device
接下來(lái)打開(kāi)python終端
>>> import uiautomator2 as u2
>>> u2.connect("emulator-5554")
[W 210131 22:27:11 __init__:203] atx-agent has something wrong, auto recovering
[D 210131 22:27:11 __init__:287] device emulator-5554 is online
[I 210131 22:27:11 init:155] uiautomator2 version: 2.12.2
<uiautomator2.Device object at 0x7fba2815ac10>
>>> d = u2.connect("emulator-5554")
>>> print(d.info)
[D 210131 22:27:52 __init__:600] kill process(ps): uiautomator
[D 210131 22:27:53 __init__:619] uiautomator-v2 is starting ... left: 40.0s
[D 210131 22:27:54 __init__:619] uiautomator-v2 is starting ... left: 39.0s
[I 210131 22:27:54 __init__:583] uiautomator back to normal
{'currentPackageName': 'com.mumu.launcher', 'displayHeight': 936, 'displayRotation': 0, 'displaySizeDpX': 853, 'displaySizeDpY': 480, 'displayWidth': 1664, 'productName': 'cancro', 'screenOn': True, 'sdkInt': 23, 'naturalOrientation': True}
可以看到已經(jīng)正常通過(guò)代碼連接到設(shè)備了
執(zhí)行一下點(diǎn)擊事件毅贮,這里的click方法的參數(shù)是點(diǎn)的坐標(biāo)办悟,x和y
>>> d.click(0, 0)
這樣子,我們有了可以往設(shè)備發(fā)送點(diǎn)擊事件的能力了滩褥,觸摸和雙擊病蛉,滑動(dòng)這些都是可以支持的,具體可以看uiautomator2 項(xiàng)目的主頁(yè)
接下來(lái)是解決如何識(shí)別手游物體的功能和技術(shù)要點(diǎn)瑰煎,這一點(diǎn)uiautomator2也幫我們實(shí)現(xiàn)了铺然。
也就是圖像匹配,在使用這個(gè)功能之前需要先把依賴安裝上
pip install -U "uiautomator2[image]" -i https://pypi.doubanio.com/simple
目前開(kāi)放兩個(gè)接口
imdata = "target.png" # 也可以是URL, PIL.Image或OpenCV打開(kāi)的圖像
d.image.match(imdata)
# 匹配待查找的圖片酒甸,立刻返回一個(gè)結(jié)果
# 返回一個(gè)dict, eg: {"similarity": 0.9, "point": [200, 300]}
d.image.click(imdata, timeout=20.0)
# 在20s的時(shí)間內(nèi)調(diào)用match輪詢查找圖片魄健,當(dāng)similarity>0.9時(shí),執(zhí)行點(diǎn)擊操作
注意相關(guān)的圖片需要手機(jī)的原圖裁剪后的圖才可以插勤,也就是使用里面的screenshot功能截圖裁剪出來(lái)的相關(guān)圖片才可以沽瘦。
所以我們借助uiautomator2可以編程實(shí)現(xiàn)自動(dòng)化玩手游