所用工具環(huán)境
- python3.6.5 和 支持自動鼠標(biāo)鍵盤點(diǎn)擊等編程的pyautogui功能包
- windows PC寸爆,安卓模擬器bluestacks,安裝王者榮耀
基本思路
王者榮耀有闖關(guān)任務(wù)模式可以獲得金幣盐欺,任務(wù)兩三分鐘一般就可以完成赁豆,支持自動模式,一次可獲取三四十金幣冗美,且可以重復(fù)刷取魔种。
利用腳本,模擬任務(wù)開啟點(diǎn)擊粉洼,進(jìn)入后自動執(zhí)行节预,中間對話跳過叶摄,最后任務(wù)完成檢測,再次啟動任務(wù)安拟。均是通過截屏信息獲取當(dāng)前在做什么蛤吓,然后應(yīng)該點(diǎn)擊什么,如此往復(fù)執(zhí)行去扣。
腳本所用關(guān)鍵功能說明
網(wǎng)上有關(guān)于pyautogui包的使用的一些參考柱衔,有一些是相對過期的,功能接口調(diào)用存在些差別愉棱,可以在安裝pyautogui包后唆铐,使用python doc 來查找相關(guān)API說明。
pyautogui.screenshot 用于截屏奔滑。
下面是py doc中函數(shù)原型艾岂,可傳入文件名,最終返回截屏圖片朋其,保存在本地
screenshot = _screenshot_win32(imageFilename=None)
pyautogui.locateOnScreen 用于查找局部圖片位置(像素點(diǎn)區(qū)域位置)王浴。輸入圖片文件名,最終返回圖片所在位置梅猿,如果當(dāng)前屏幕不存在該圖片氓辣,則返回None
locateOnScreen(image, grayscale=False, region=None)
事先截取好中間需要點(diǎn)擊的按鈕圖片,保存在本地袱蚓,然后截屏中去匹配查找按鈕圖片是否存在及其位置(該函數(shù)實(shí)際并不需要事先調(diào)用screenshot)
pyautogui.center 用于獲取某一像素區(qū)域的中心像素點(diǎn)位置钞啸。
center(coords)
源文件
pics中是事先截取的百度云盤可下載使用鏈接:
https://pan.baidu.com/s/1TspfdYdSwnAvlt0iC4BfxQ 密碼: 3q6v
實(shí)際運(yùn)行效果展示
最開始選用最后一個關(guān)卡任務(wù)(大師級)后面就自動執(zhí)行了
錄制過屏幕体斩,markdown下視頻無法上傳,想制作gif來這的颖低,視頻太大需要一定裁剪處理絮吵,暫時不會。忱屑。
源碼展示
很簡單蹬敲,重在功能,沒有注重什么規(guī)范
(業(yè)余python選手莺戒,工作之中也是python用于內(nèi)部工具開發(fā),代碼槽點(diǎn)可能較多)粱栖。
# -*- coding: utf-8 -*-
import pyautogui
import time
pyautogui.FAILSAFE = False
screenshot = pyautogui.screenshot
pngLocate = pyautogui.locateOnScreen
def click(x,y):
pyautogui.moveTo(x,y)
pyautogui.click()
def get_button_center_from_screen(button_png,png_path='pics'):
screen = screenshot("screen.png")
button_png = png_path + '\\' + button_png
start_pos = pngLocate(button_png)
if start_pos == None:
#找不到button
print("{} not exsit on current screen".format(button_png))
return 0,0
return pyautogui.center(start_pos)
def AutoMouse():
print("Start")
n = 1
while(n<60):
print("{now} 第{n}次\n".format(now=time.strftime("%m-%d %H:%M:%S"), n=n))
x, y = get_button_center_from_screen('開始闖關(guān).PNG')
click(x,y)
time.sleep(5)
loading = False
#是否正在加載中
while(1):
x,y = get_button_center_from_screen('加載中.PNG')
time.sleep(3)
if (x,y) != (0,0):
break
loading = False
print("加載中\(zhòng)n")
while(1):
x,y = get_button_center_from_screen('加載中.PNG')
if (x,y) == (0,0):
break
print("加載完成\n")
#檢查是否初始畫面需要跳過
x,y = get_button_center_from_screen('跳過.PNG')
if (x,y) == (0,0):
print("no need Jump over")
else:
print("need Jump over")
click(x,y)
#檢查是否已經(jīng)啟用自動
x,y = get_button_center_from_screen("未啟用自動.PNG")
if (x,y) != (0,0):
print("not auto run")
click(x,y)
else:
print("already auto run")
#運(yùn)行監(jiān)測,是否結(jié)束脏毯,以及中間存在需要跳過,結(jié)束則開啟下一次 每5s檢測一次
while(1):
time.sleep(3)
x,y = get_button_center_from_screen('跳過2.PNG')
if (x,y) == (0,0):
print("no need Jump over")
else:
print("need Jump over")
click(x,y)
x,y = get_button_center_from_screen("結(jié)束后繼續(xù).PNG")
if (x,y) == (0,0):
print("not over")
else:
print("all over.\n")
click(x,y)
time.sleep(5)
#start 闖關(guān)
print("Start again")
x, y = get_button_center_from_screen('再次挑戰(zhàn).PNG')
n = n+1
click(x,y)
time.sleep(10)
break
if __name__ == '__main__':
AutoMouse()
注意事項(xiàng)
- 腳本可能需要在管理員權(quán)限下執(zhí)行(cmd啟動時以管理員身份運(yùn)行)(click執(zhí)行沒有效果的時候幔崖,就是權(quán)限問題導(dǎo)致的)
- 由于電腦尺寸可能不是絕對一樣食店,所以事先截取的按鈕圖片可能都不一樣渣淤,自行截取個人PC上實(shí)際王者榮耀刷任務(wù)運(yùn)行時畫面,對應(yīng)替換
- 個人在使用過程中遇到過的問題:
- 有一次晚上掛機(jī)吉嫩,電腦死過機(jī)价认,應(yīng)該和這個沒關(guān)系。自娩。用踩。
- 安卓模擬器中的王者榮耀出現(xiàn)卡機(jī)(手動點(diǎn)擊也是沒有反應(yīng),最后只好重啟了模擬器)忙迁,不知有沒有關(guān)系
- 加載圖片 匹配不到脐彩,原因是王者榮耀有更新,任務(wù)開始后加載頁面的廣告有變化姊扔,建議截取關(guān)鍵按鈕時惠奸,盡量截取小部分,不要截取太多恰梢。
后續(xù)
可以做的更好佛南,日志記錄實(shí)際運(yùn)行情況,出問題時嵌言,方便回溯嗅回。利用圖片識別技術(shù)來識別圖片中的文字,來找到對應(yīng)按鈕的位置摧茴。健壯性考慮绵载,如果中間偶爾出現(xiàn)卡機(jī),點(diǎn)擊失效蓬蝶,如何檢測出來尘分,以及后續(xù)該怎么處理。當(dāng)然需要更高的技術(shù)要求丸氛。喜歡且有相關(guān)能力的可以搞一下培愁。
歡迎留言交流 _