接着上篇的博文,今天我們講如何實現自動組隊刷道
引入:
自動組隊刷道的流程是先點擊刷道按鈕、再點擊前往按鈕、再點擊便捷組隊······
這些操作上篇博文已經告訴我們怎么做了,利用picpick丈量坐標,再用autopy模擬鼠標點擊
但是點擊過便捷組隊后如何實現自動創建隊伍並匹配隊友呢?
這里要用到文字識別
玩過問道的都知道,沒有隊友或者隊友數量沒到4的時候,隊伍會存在守護,如下
並且守護的位置是固定的,守護的優先級是從左到右,例如,匹配到一個隊友,斗闕長老就會消失(不會參戰);再匹配一個隊友,白骨長老就會消失(不會參戰)
我的思路是,隔一段時間對夜神模擬器截圖,再對這張截圖文字識別,判斷“斗闕長老”和“白骨長老”是否存在於識別出的字符串中。當然,也可以判斷長老數量是否小於等於2
因為玩過回合制的知道,隊伍達到三個人就可以發車了,做任務的過程中系統會自動匹配隊友,直到匹配滿為止
前期准備:
利用PIL的ImageGrab截圖
安裝PIL
pip install pillow
(pillow包里包含了pil,pil目前已經停止維護了)
我這里是用PyCharm直接安裝的依賴包
復制代碼,直接運行
#coding=utf-8 import time import win32api import win32con from PIL import ImageGrab time.sleep(3) # 參數說明 # 第一個參數 開始截圖的x坐標 # 第二個參數 開始截圖的y坐標 # 第三個參數 結束截圖的x坐標 # 第四個參數 結束截圖的y坐標 bbox = (391, 156, 1582, 853) im = ImageGrab.grab(bbox) # 參數 保存截圖文件的路徑 im.save('as.png')
直接運行,會發現在當前目錄下有一個as.png的截圖文件
官方文檔對grab方法給出的解釋
這里bbox = (x1,y1,x2,y2),意思是從屏幕坐標(x1,y1)到(x2,y2)的一段區域
ImageGrab.grab(bbox) ⇒ image (New in 1.1.3) Take a snapshot of the screen, and return an “RGB” image. The bounding box argument can be used to copy only a part of the screen.
利用baidu-aip進行文字識別
我嘗試過pytesseract和pytesser的文字識別,經常會出現識別失敗,對中文的支持也不夠友好
所以我這里選用baidu-aip進行文字識別
PyCharm打開File->Settings->加號
搜索baidu-aip,再點擊左下角Install Package
我們需要APPP_ID、API_KEY、SECRET_KEY,我們去百度雲申請
登錄百度雲,百度雲盤和百度貼吧賬號可以直接使用,沒有的話申請一個百度賬號
找到文字識別
點擊創建應用
完成創建,個人用戶一天可以免費識別600次
需要識別文字的圖片用下圖
復制代碼,運行
#coding=utf-8 from aip import AipOcr import re #百度文字識別 APPP_ID = 'APP_ID' API_KEY = 'APP_KEY' SECRET_KEY = 'SECRET_KEY' client = AipOcr(APPP_ID,API_KEY,SECRET_KEY) i = open(r'E:\python_project\test\imageIdentification\helpedName1.png','rb') img = i.read() message = client.basicGeneral(img);for i in message.get('words_result'): print(i.get('words'))
可以看到結果
開始制作外掛:
和上篇博客一樣,先丈量坐標,坐標根據分辨率不同而不同,我這里是1920*1080
刷道按鈕的坐標是(809,222)
前往按鈕的坐標是(1101,646)
便捷組隊的坐標是(1449,730)
創建隊伍按鈕(998,799)
開始匹配(1232,794)
丈量坐標完畢后,調用文字識別,判斷“斗闕長老”和“白骨長老”是否存在於識別的字符串中
如果兩位長老都不存在,說明隊伍里已經有三人。此時關閉刷道窗口,點擊陸壓真人,對話,開始刷道
設置十輪刷道時間,十輪刷道任務結束后開始新的一輪刷道
詳細代碼如下:
imageGrabUtil.py(截圖工具)
#coding=utf-8 from PIL import ImageGrab # 參數說明 # 第一個參數 開始截圖的x坐標 # 第二個參數 開始截圖的y坐標 # 第三個參數 結束截圖的x坐標 # 第四個參數 結束截圖的y坐標 def screenshot(x1,y1,x2,y2,filename): bbox = (x1, y1, x2, y2) im = ImageGrab.grab(bbox) # 參數 保存截圖文件的路徑 im.save('E:\\python_project\\Asktao_Automation\\resource\\'+filename+'.png')
baiduAipUtil.py(文字識別工具)
我這里百度雲的APPP_ID、API_KEY、SECRET_KEY保存在config.ini
#coding=utf-8 from aip import AipOcr import re #百度文字識別 # !/usr/bin/env python # -*- coding:utf-8 -*- import ConfigParser import os os.chdir("E:\python_project\Asktao_Automation\util") cf = ConfigParser.ConfigParser() cf.read("config.ini") secs = cf.sections() APPP_ID = cf.get("baiduAip","APPP_ID") API_KEY = cf.get("baiduAip","API_KEY") SECRET_KEY = cf.get("baiduAip","SECRET_KEY") client = AipOcr(APPP_ID,API_KEY,SECRET_KEY) def characterRecognition(filePath): i = open(filePath,'rb') img = i.read() message = client.basicGeneral(img); #print(message.get('words_result')) string = ''; for i in message.get('words_result'): print(i.get('words')) string += i.get('words') return string
config.ini
[baiduAip] APPP_ID = APPP_ID
API_KEY = API_KEY
SECRET_KEY = SECRET_KEY
shuaDao.py
#coding=utf-8 import autopy import time import win32api import win32con from imageGrabUtil import screenshot from baiduAipUtil import characterRecognition import sys defaultencoding = 'utf-8' if sys.getdefaultencoding() != defaultencoding: reload(sys) sys.setdefaultencoding(defaultencoding) #刷道(隊長模式) #time.sleep(5) win32api.keybd_event(18,0,0,0) #alt鍵位碼是18 win32api.keybd_event(9,0,0,0) #tab鍵位碼是9 time.sleep(0.5) win32api.keybd_event(13,0,0,0) #enter鍵位碼是13 win32api.keybd_event(18,0,win32con.KEYEVENTF_KEYUP,0) #釋放按鍵 win32api.keybd_event(9,0,win32con.KEYEVENTF_KEYUP,0) win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0) time.sleep(2) def mousemove_click(x,y): autopy.mouse.smooth_move(x, y) autopy.mouse.click() mousemove_click(809,222)#移動到刷道按鈕 mousemove_click(1101,646)#點擊前往 time.sleep(10)#從其他地圖走到軒轅廟陸壓真人處花費10s mousemove_click(1449,730)#點擊便捷組隊 mousemove_click(998,799)#點擊創建隊伍 mousemove_click(1121,781)#點擊開始匹配 for i in range(1,10,1): teamFileName = 'judgeTeamCount' time.sleep(3) screenshot(391, 156, 1582, 853,teamFileName)#截圖 judgeTeamStr = characterRecognition('E:\\python_project\\Asktao_Automation\\resource\\'+teamFileName+'.png')#文字識別 #每個人守護順序不一樣,按需修改 if '斗闕長老' not in judgeTeamStr and '白骨長老' not in judgeTeamStr: #這兩個守護不在,說明隊伍已有三人,開始刷道 mousemove_click(1524,234) #點擊關閉按鈕 mousemove_click(809, 222) # 移動到刷道按鈕 mousemove_click(1101, 646) # 點擊前往 mousemove_click(1446, 661)#點擊【伏魔】我這就去 break time.sleep(600)#休息十分鍾后再次查看是否組到人 #刷道十輪之后的操作 for j in range(1,10,1): time.sleep(780)#平民伏魔一般780s之內,土豪伏魔有300s的,按需修改 taskFileName = 'judgeTaskAccomplish' time.sleep(3) screenshot(500, 164, 1701, 866,taskFileName) judgeTaskStr = characterRecognition('E:\\python_project\\Asktao_Automation\\resource\\'+taskFileName+'.png') if '【伏魔】我這就去' in judgeTaskStr: mousemove_click(1446, 661) # 點擊【伏魔】我這就去 else: time.sleep(60) #防止780s內還沒有完成伏魔操作,再等60s,以防萬一 mousemove_click(1446, 661) # 點擊【伏魔】我這就去
效果如下:
鑒於博客園只能上傳10MB以下的GIF,所以我沒有上傳完整的效果圖
親測可用,大概十分鍾左右可以匹配到三個人,就開始刷道
10輪刷道為一組,組數可以自己將循環數設大一點,我這里設的是10
有的時候匹配不到人,比如像白天就比較難匹配到人。可以把截圖判斷長老是否存在的那部分,多循環幾次
再次強調,我的代碼不一定在你的電腦上可以運行,我的電腦分辨率是1920*1080,模擬器的位置是默認的放在中央,模擬器移動的話丈量的坐標都不一樣
制作外掛最重要的是思想方法