1、通过adb截图判断是否在抽卡界面
2、在的话,使用matchTemplate()函数识别开始召唤的按钮
3、点击,画符
4、同样使用matchTemplate()函数和模板对比识别SSR和SR并点击
5、若识别到“十连召唤”(即抽卡结束)点击返回
这里主要通过adb来实现对手机的模拟点按和滑动
(手机记得要开USB侦错啊QWQ)
import os
def tap(x0, y0):
cmdTap = 'adb shell input tap {x1} {y1}'.format(
x1=x0,
y1=y0
)
print(cmdTap)
os.system(cmdTap)
def swipe(x0, y0, x1, y1, delay0):
cmdSwipe = 'adb shell input swipe {x2} {y2} {x3} {y3} {delay1}'.format(
x2=x0,
y2=y0,
x3=x1,
y3=y1,
delay1=delay0
)
print(cmdSwipe)
os.system(cmdSwipe)
def screenshot():
os.system('adb shell screencap -p /sdcard/sh.png')
os.system('adb pull /sdcard/sh.png .')
return "sh.png"
上面这个基本上是对手机的所有操作OWO。
(我将这个单独保存在了项目目录的/lib/ats.py中,这样主程序就可以直接调用啦XD)
然后来讲一下这里最核心的操作:图像识别orz
import cv2
import time
import random
import lib.ats
import numpy as np
好的我们先来个例子,就从识别开始抽卡的按钮开始。。。
def start(sh):
imgSTART = cv2.imread(sh, 0)
templateSTART = cv2.imread('res/START.png', 0)
resSTART = cv2.matchTemplate(imgSTART, templateSTART, cv2.TM_CCOEFF_NORMED)
thresholdSTART = 0.85
pos = []
if (resSTART >= thresholdSTART).any():
loc = np.where(resSTART >= thresholdSTART)
for pt in zip(*loc[::-1]):
pos.append(pt)
return pos
else:
return 0
然后是抽到SSR的时候
(其实这个完全可以不写,因为SSR根本不存在(手动滑稽)XD)
def ssr(sh):
xSSR = random.randrange(800, 1200)
ySSR = random.randrange(400, 800)
imgSSR = cv2.imread(sh, 0)
templateSSR = cv2.imread('res/SR.png', 0)
resSSR = cv2.matchTemplate(imgSSR, templateSSR, cv2.TM_CCOEFF_NORMED)
thresholdSSR = 0.30
if (resSSR >= thresholdSSR).any():
lib.ats.tap(xSSR, ySSR)
主程序无非就是搞一个循环不断地截图,判断有没有出SR或SSR还有是不是已经抽完了而已
def main():
#里面的delay gap x1 y1 x2 y2 dly 都随机产生这里就懒得写了XD
#这里是截图判断是否在抽卡界面
sh = lib.ats.screenshot()
pos = start(sh)
if pos != 0:
lib.ats.tap(pos[0][0], pos[0][1]) #从刚才的代码可以看到返回的是二维数组我们就选第一个好了
lib.ats.swipe(x1, y1, x2, y2, dly)
time.sleep(delay) #十连开始还有点动画的(感觉这个不加也行)
while lib.ats.screenshot(): #不断的截图Zzz...
gap = random.uniform(0.5, 1.5)
time.sleep(gap)
sh = lib.ats.screenshot()
if end(sh) == 1: #抽卡没结束(匹配率低于threshold)返回1,否则返回0
ssr(sh)
sr(sh)
elif end(sh) == 0: #结束的时候随机按一下
xEND = random.randrange(800, 1200)
yEND = random.randrange(400, 800)
lib.ats.tap(xEND, yEND)
print("Finished")
break
else:
print("Error") #如果不在抽卡界面的话。。。