社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

python • 6 年前 • 413 次点击  

前言

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

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

几百连抽就不用画符,和点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学习交流群推荐

点一下好看再走吧


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/e4g2JFMVju
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28717
 
413 次点击