阴阳师自动刷御魂python实现

感谢https://www.cnblogs.com/eatPython/p/5958850.html这位大佬提供的接口函数

感谢http://www.360doc.com/content/18/0121/22/1513309_723986820.shtml这位大佬提供的截图

其实只要理顺原理,自己并没有多少自己的代码,基本都是摘抄别人的,拼凑而成

1、首先导入需要用到的库文件

import time
import win32gui, win32ui, win32con, win32api
from ctypes import *
import cv2
import numpy as np
import random

2、其次是定义鼠标的一些动作,代码出自本文提到的第一个大佬

def clickLeftCur():#单击
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN|win32con.MOUSEEVENTF_LEFTUP, 0, 0)

def moveCurPos(x,y):#移动鼠标
    windll.user32.SetCursorPos(x, y)

def getCurPos():#获得鼠标位置信息,这个再实际代码没用上,调试用得上
    return win32gui.GetCursorPos()

3,、截图代码出自第二位大佬

def window_capture(filename):
    hwnd = 0  # 窗口的编号,0号表示当前活跃窗口
    # 根据窗口句柄获取窗口的设备上下文DC(Divice Context)
    hwndDC = win32gui.GetWindowDC(hwnd)
    # 根据窗口的DC获取mfcDC
    mfcDC = win32ui.CreateDCFromHandle(hwndDC)
    # mfcDC创建可兼容的DC
    saveDC = mfcDC.CreateCompatibleDC()
    # 创建bigmap准备保存图片
    saveBitMap = win32ui.CreateBitmap()
    # 获取监控器信息
    MoniterDev = win32api.EnumDisplayMonitors(None, None)
    w = MoniterDev[0][2][2]
    h = MoniterDev[0][2][3]
    # print w,h   #图片大小
    # 为bitmap开辟空间
    saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
    # 高度saveDC,将截图保存到saveBitmap中
    saveDC.SelectObject(saveBitMap)
    # 截取从左上角(0,0)长宽为(w,h)的图片
    saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY)
    saveBitMap.SaveBitmapFile(saveDC, filename)

4、运行代码

filename = "blackground.jpg"#储存的文件名
while True:
    time.sleep(2)#设置隔2秒运行一次
    #截图
    window_capture(filename)#对整个屏幕截图,并保存截图为filename
    #原图
    srcImg = cv2.imread(filename)#读取filename的截图文件,这里应该是可以对截图函数进行修改,不用产生中间的文件,截图直接与ndarray形式存在
    begin = cv2.imread('begin.png')#读取点击开始战斗的 标准图像
    end1 = cv2.imread('end1.png')#结束之后点击屏幕任意位置,开宝箱
    end2 = cv2.imread('end2.png')#开完宝箱后,点击任意结束本轮
    #用了一个最简答的图像相见的方式来完成以下动作,具体图示往下翻
    begin_meanValue = np.mean(srcImg[729:786,1275:1447,:] - begin)#检测截图是否包含开始战斗
    end1_meanValue = np.mean(srcImg[228:350,774:940,:] - end1)#检测战斗是否结束
    end2_meanValue = np.mean(srcImg[570:786,847:1083,:] - end2)#检测最后的界面
    #print(begin)
    if begin_meanValue < 50:#界面运行到由战斗开始就点击战斗开始
        move_x = random.randint(1290,1430)#设计随机点击坐标点,防止被检测,虽然不知道有没效果,初衷设置如此
        move_y = random.randint(745,770)
        moveCurPos(move_x,move_y)
        clickLeftCur()

    if end1_meanValue < 50 or end2_meanValue < 50:#检测开宝箱和结束
        move_x = random.randint(1195,11563)
        move_y = random.randint(651,832)
        moveCurPos(move_x,move_y)
        clickLeftCur()

5、如图两图,首先从大图截出开始战斗区域当做标准图像,并记录图像位置的坐标,运行代码后,每个2秒截图,并取出这个位置的内容,跟标准凸图像做减法,若是在有战斗开始界面,,则他们的差值会很小,对这块区域求均值,设定一个小的阈值进行判断所含的内容是否合适。另外两个也是一样的原理

6、这种方式需要预先制作标准图像,换了电脑需要重新制。其实可以截图开始战斗区域,然后用opencv的函数进行图像匹配寻找该点击的区域,另外可以增加刷副本肝狗粮,御灵,觉醒之类。最好制作个图形界面。如果一部电脑刷开,只要增加两个窗口的点击位置就好啦

7、真的感慨python的强大,这里抄一段那里抄一段就可以完成自己所要的功能。技术交流,被封号别找我(手动戴墨镜)

你可能感兴趣的:(opencv)