用Python實(shí)現(xiàn)陰陽師自動(dòng)抽卡

1. 想法

突然想搞一個(gè)FGO的腳本委乌,但還是決定先從陰陽師開始入手
畢竟現(xiàn)在版本官方已經(jīng)有了自動(dòng)御魂、覺醒和探索的腳本了荣回。
既然是這樣那不如就搞一個(gè)抽卡的腳本好了遭贸,這樣大佬(土豪,歐皇)們
幾百連抽就不用畫符心软,和點(diǎn)SSR點(diǎn)到手軟了XD壕吹。

2. 實(shí)現(xiàn)

參考了CSDN上兩篇關(guān)于陰陽師探索和自動(dòng)御靈的文章

簡(jiǎn)單講一下思路:
通過圖像識(shí)別(使用cv2這個(gè)庫(kù))來識(shí)別開始抽的藍(lán)票、出現(xiàn)SSR(或SR)和十連抽結(jié)束這幾個(gè)需要點(diǎn)按的場(chǎng)景删铃。然后自動(dòng)點(diǎn)按就可以了耳贬。

不簡(jiǎn)單的講一下具體實(shí)現(xiàn)
(orz簡(jiǎn)書的markdown不支持流程圖)

  1. 通過adb截圖判斷是否在抽卡界面
  2. 在的話,使用matchTemplate()函數(shù)識(shí)別開始召喚的按鈕
  3. 點(diǎn)擊猎唁,畫符
  4. 同樣使用matchTemplate()函數(shù)和模板對(duì)比識(shí)別SSR和SR并點(diǎn)擊
  5. 若識(shí)別到“十連召喚”(即抽卡結(jié)束)點(diǎn)擊返回
開始抽卡的時(shí)候要識(shí)別的區(qū)域
出現(xiàn)SSR或SR要識(shí)別的區(qū)域
結(jié)束時(shí)要識(shí)別的區(qū)域

這里主要通過adb來實(shí)現(xiàn)對(duì)手機(jī)的模擬點(diǎn)按和滑動(dòng)(手機(jī)
記得要開USB偵錯(cuò)啊QWQ)

import os
#模擬點(diǎn)按
def tap(x0, y0):
    cmdTap = 'adb shell input tap {x1} {y1}'.format(
        x1=x0,
        y1=y0
    )
    print(cmdTap)
    os.system(cmdTap)
#模擬滑動(dòng)(用來畫符的)
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"

上面這個(gè)基本上是對(duì)手機(jī)的所有操作OWO咒劲。
(我將這個(gè)單獨(dú)保存在了項(xiàng)目目錄的/lib/ats.py中,這樣主程序就可以直接調(diào)用啦XD)
然后來講一下這里最核心的操作:圖像識(shí)別orz

#我們要用的其實(shí)就只有這一個(gè)庫(kù)
import cv2
#不過我們還是要。腐魂。帐偎。
import time
import random
import lib.ats #233 這個(gè)就是剛才那段代碼
import numpy as np

好的我們先來個(gè)例子,就從識(shí)別開始抽卡的按鈕開始蛔屹。削樊。。

def start(sh):
    #一看就知道是導(dǎo)入圖片orz
    imgSTART = cv2.imread(sh, 0)
    templateSTART = cv2.imread('res/START.png', 0) #我的模板保存在了項(xiàng)目目錄的/res文件夾里
    #和模板對(duì)比
    resSTART = cv2.matchTemplate(imgSTART, templateSTART, cv2.TM_CCOEFF_NORMED)
    thresholdSTART = 0.85
    pos = []
    #如果result大于threshold才可以執(zhí)行(不在界面你抽個(gè)啥)
    if (resSTART >= thresholdSTART).any():
        loc = np.where(resSTART >= thresholdSTART)
        for pt in zip(*loc[::-1]): #剛學(xué)Python沒多久兔毒,我只知道這個(gè)壓縮后切片QAQ
            pos.append(pt) #更新list
        return pos #返回按鈕位置
    else:
        return 0

然后是抽到SSR的時(shí)候(其實(shí)這個(gè)完全可以不寫漫贞,因?yàn)镾SR根本不存在(手動(dòng)滑稽)XD)

def ssr(sh):
    #這個(gè)不隨機(jī)點(diǎn)說不定有封號(hào)的可能。育叁。迅脐。
    xSSR = random.randrange(800, 1200)
    ySSR = random.randrange(400, 800)
    #導(dǎo)入圖像和模板
    imgSSR = cv2.imread(sh, 0)
    templateSSR = cv2.imread('res/SR.png', 0)
    #和模板對(duì)比
    resSSR = cv2.matchTemplate(imgSSR, templateSSR, cv2.TM_CCOEFF_NORMED)
    thresholdSSR = 0.30 #這里啊QAQ可能是我的模板不是很好,大于0.3基本識(shí)別不出來
    #只要有SSR就行了擂红,然后點(diǎn)一下
    if (resSSR >= thresholdSSR).any():
        lib.ats.tap(xSSR, ySSR)

SR和這個(gè)代碼其實(shí)是一樣的仪际,無非就是模板不同orz.
但我的模板實(shí)在是太辣雞了所以我把threshold設(shè)成了0.3(也就是說只要30%匹配就行了orz)所以。昵骤。树碱。我的SSR和SR識(shí)別都混在了一起,也就是說無論出的是SR還是SSR都會(huì)按兩次QAQ(R的話想必也是這樣变秦,只是用了圖片測(cè)試成榜。。蹦玫。并沒有票給我測(cè)試QAQ
結(jié)束的識(shí)別和點(diǎn)擊其實(shí)也和這個(gè)也差不多赎婚。。樱溉。

好了基本上就只剩下主程序的代碼了OWO
主程序無非就是搞一個(gè)循環(huán)不斷地截圖挣输,判斷有沒有出SR或SSR還有是不是已經(jīng)抽完了而已

def main():
    #里面的delay gap x1 y1 x2 y2 dly 都隨機(jī)產(chǎn)生這里就懶得寫了XD
    #這里是截圖判斷是否在抽卡界面
    sh = lib.ats.screenshot()
    pos = start(sh)
    if pos != 0:
        lib.ats.tap(pos[0][0], pos[0][1]) #從剛才的代碼可以看到返回的是二維數(shù)組我們就選第一個(gè)好了
        lib.ats.swipe(x1, y1, x2, y2, dly)
        time.sleep(delay) #十連開始還有點(diǎn)動(dòng)畫的(感覺這個(gè)不加也行)
        while lib.ats.screenshot():  #不斷的截圖Zzz...
            gap = random.uniform(0.5, 1.5)
            time.sleep(gap)
            sh = lib.ats.screenshot()
            if end(sh) == 1: #抽卡沒結(jié)束(匹配率低于threshold)返回1,否則返回0
                ssr(sh)
                sr(sh)
            elif end(sh) == 0: #結(jié)束的時(shí)候隨機(jī)按一下
                xEND = random.randrange(800, 1200)
                yEND = random.randrange(400, 800)
                lib.ats.tap(xEND, yEND)
                print("Finished")
                break
    else:
        print("Error") #如果不在抽卡界面的話福贞。撩嚼。。

OWO基本上整個(gè)程序的嗎都打上來了挖帘。完丽。。
整個(gè)完整的項(xiàng)目已經(jīng)放到了Github上面拇舀,想看完整的就自己去看看咯QWQ

3. 總結(jié)

我覺得其實(shí)沒什么好總結(jié)的orz
其實(shí)感覺抽卡的腳本真的沒什么用逻族。。骄崩。


好好學(xué)Python吧

如果有Bug和更好的想法記得告訴我哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末聘鳞,一起剝皮案震驚了整個(gè)濱河市薄辅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搁痛,老刑警劉巖长搀,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸡典,居然都是意外死亡源请,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門彻况,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谁尸,“玉大人,你說我怎么就攤上這事纽甘×悸” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵悍赢,是天一觀的道長(zhǎng)决瞳。 經(jīng)常有香客問我,道長(zhǎng)左权,這世上最難降的妖魔是什么皮胡? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮赏迟,結(jié)果婚禮上屡贺,老公的妹妹穿的比我還像新娘。我一直安慰自己锌杀,他們只是感情好甩栈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著糕再,像睡著了一般量没。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上突想,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天殴蹄,我揣著相機(jī)與錄音,去河邊找鬼蒿柳。 笑死饶套,一個(gè)胖子當(dāng)著我的面吹牛漩蟆,可吹牛的內(nèi)容都是我干的垒探。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼怠李,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼圾叼!你這毒婦竟也來了蛤克?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤夷蚊,失蹤者是張志新(化名)和其女友劉穎构挤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惕鼓,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筋现,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箱歧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矾飞。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呀邢,靈堂內(nèi)的尸體忽然破棺而出洒沦,到底是詐尸還是另有隱情,我是刑警寧澤价淌,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布申眼,位于F島的核電站,受9級(jí)特大地震影響蝉衣,放射性物質(zhì)發(fā)生泄漏括尸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一买乃、第九天 我趴在偏房一處隱蔽的房頂上張望姻氨。 院中可真熱鬧,春花似錦剪验、人聲如沸肴焊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娶眷。三九已至,卻和暖如春啸臀,著一層夾襖步出監(jiān)牢的瞬間届宠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工乘粒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豌注,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓灯萍,卻偏偏與公主長(zhǎng)得像轧铁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旦棉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容