感谢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的强大,这里抄一段那里抄一段就可以完成自己所要的功能。技术交流,被封号别找我(手动戴墨镜)