歡迎光臨
每天分享高質量文章

利用Python實現陰陽師自動抽卡

前言
現在版本官方已經有了自動御魂、覺醒和探索的指令碼了。既然是這樣那不如就搞一個抽卡的指令碼好了,這樣大佬(土豪,歐皇)們

幾百連抽就不用畫符,和點SSR點到手軟了XD。

(Ps:過年了,祝大家SSR抽到手軟~

作者:Meowcolm024

源自:

https://www.jianshu.com/p/b45416bed86f

不簡單的具體實現

1、透過adb截圖判斷是否在抽卡介面

2、在的話,使用matchTemplate()函式識別開始召喚的按鈕

3、點選,畫符

4、同樣使用matchTemplate()函式和模板對比識別SSR和SR並點選

5、若識別到“十連召喚”(即抽卡結束)點選傳回

開始抽卡的時候要識別的區域
出現SSR或SR要識別的區域
結束時要識別的區域

這裡主要透過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 #233 這個就是剛才那段程式碼
import numpy as np

好的我們先來個例子,就從識別開始抽卡的按鈕開始。。。

def start(sh):
    #一看就知道是匯入圖片orz
    imgSTART = cv2.imread(sh, 0)
    templateSTART = cv2.imread('res/START.png'0#我的模板儲存在了專案目錄的/res檔案夾裡
    #和模板對比
    resSTART = cv2.matchTemplate(imgSTART, templateSTART, cv2.TM_CCOEFF_NORMED)
    thresholdSTART = 0.85
    pos = []
    #如果result大於threshold才可以執行(不在介面你抽個啥)
    if (resSTART >= thresholdSTART).any():
        loc = np.where(resSTART >= thresholdSTART)
        for pt in zip(*loc[::-1]): #剛學Python沒多久,我只知道這個壓縮後切片QAQ
            pos.append(pt) #更新list
        return pos #傳回按鈕位置
    else:
        return 0

然後是抽到SSR的時候

(其實這個完全可以不寫,因為SSR根本不存在(手動滑稽)XD)

def ssr(sh):
    #這個不隨機點說不定有封號的可能。。。
    xSSR = random.randrange(8001200)
    ySSR = random.randrange(400800)
    #匯入影象和模板
    imgSSR = cv2.imread(sh, 0)
    templateSSR = cv2.imread('res/SR.png'0)
    #和模板對比
    resSSR = cv2.matchTemplate(imgSSR, templateSSR, cv2.TM_CCOEFF_NORMED)
    thresholdSSR = 0.30 #這裡啊QAQ可能是我的模板不是很好,大於0.3基本識別不出來
    #只要有SSR就行了,然後點一下
    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") #如果不在抽卡介面的話。。。
總結
Python學習交流群推薦

贊(0)

分享創造快樂