感谢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获取mfcDCmfcDC = win32ui.CreateDCFromHandle(hwndDC)# mfcDC创建可兼容的DCsaveDC = 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的强大,这里抄一段那里抄一段就可以完成自己所要的功能。技术交流,被封号别找我(手动戴墨镜)