用Python实现阴阳师自动抽卡

1. 想法

突然想搞一个FGO的脚本,但还是决定先从阴阳师开始入手
毕竟现在版本官方已经有了自动御魂、觉醒和探索的脚本了。
既然是这样那不如就搞一个抽卡的脚本好了,这样大佬(土豪,欧皇)们
几百连抽就不用画符,和点SSR点到手软了XD。

2. 实现

参考了CSDN上两篇关于阴阳师探索和自动御灵的文章

简单讲一下思路:
通过图像识别(使用cv2这个库)来识别开始抽的蓝票、出现SSR(或SR)和十连抽结束这几个需要点按的场景。然后自动点按就可以了。

不简单的讲一下具体实现
(orz简书的markdown不支持流程图)

  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(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 #这里啊QAQ可能是我的模板不是很好,大于0.3基本识别不出来
    #只要有SSR就行了,然后点一下
    if (resSSR >= thresholdSSR).any():
        lib.ats.tap(xSSR, ySSR)

SR和这个代码其实是一样的,无非就是模板不同orz.
但我的模板实在是太辣鸡了所以我把threshold设成了0.3(也就是说只要30%匹配就行了orz)所以。。。我的SSR和SR识别都混在了一起,也就是说无论出的是SR还是SSR都会按两次QAQ(R的话想必也是这样,只是用了图片测试。。。并没有票给我测试QAQ
结束的识别和点击其实也和这个也差不多。。。

好了基本上就只剩下主程序的代码了OWO
主程序无非就是搞一个循环不断地截图,判断有没有出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") #如果不在抽卡界面的话。。。

OWO基本上整个程序的吗都打上来了。。。
整个完整的项目已经放到了Github上面,想看完整的就自己去看看咯QWQ

3. 总结

我觉得其实没什么好总结的orz
其实感觉抽卡的脚本真的没什么用。。。


好好学Python吧

如果有Bug和更好的想法记得告诉我哦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容