利用Python实现阴阳师自动抽卡

640?wx_fmt=gif

640?wx_fmt=jpeg

Linux编程 点击右侧关注,免费入门到精通! 640?wx_fmt=jpeg


作者丨Meowcolm024

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


640?wx_fmt=gif

前言


现在版本官方已经有了自动御魂、觉醒和探索的脚本了。


既然是这样那不如就搞一个抽卡的脚本好了,这样大佬(土豪,欧皇)们

几百连抽就不用画符,和点SSR点到手软了XD。


(Ps:过年了,祝大家SSR抽到手软~)


640?wx_fmt=gif不简单的具体实现


1、通过adb截图判断是否在抽卡界面


2、在的话,使用matchTemplate()函数识别开始召唤的按钮


3、点击,画符


4、同样使用matchTemplate()函数和模板对比识别SSR和SR并点击


5、若识别到“十连召唤”(即抽卡结束)点击返回


640?wx_fmt=gif开始抽卡的时候要识别的区域


640?wx_fmt=other


640?wx_fmt=gif出现SSR或SR要识别的区域


640?wx_fmt=other


640?wx_fmt=gif结束时要识别的区域


640?wx_fmt=other


这里主要通过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") #如果不在抽卡界面的话。。。


640?wx_fmt=gif总结


640?wx_fmt=other


 推荐↓↓↓ 

640?wx_fmt=png

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

640?wx_fmt=png万水千山总是情,点个 “ 好看” 行不行
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值