实现原理:
对各个按钮等需要点击的地方进行截图,然后对整个屏幕截屏,通过模板匹配得到截图在截屏中的坐标位置,进行点击
实现方法:
对整个屏幕进行截图,并保存
####截图方法1####import win32guiimport win32uiimport win32conimport win32apidef Printscreen():# 获取桌面hdesktop = win32gui.GetDesktopWindow()# 分辨率适应width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)# width=1920 # 因为用win32api.GetSystemMetrics获取的分辨率不对,于是我直接手输入进去的# height=1080# 创建设备描述表desktop_dc = win32gui.GetWindowDC(hdesktop)img_dc = win32ui.CreateDCFromHandle(desktop_dc)# 创建一个内存设备描述表mem_dc = img_dc.CreateCompatibleDC()# 创建位图对象screenshot = win32ui.CreateBitmap()screenshot.CreateCompatibleBitmap(img_dc, width, height)mem_dc.SelectObject(screenshot)# 截图至内存设备描述表mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY)# 将截图保存到文件中screenshot.SaveBitmapFile(mem_dc, 'yuan.png')# 内存释放mem_dc.DeleteDC()win32gui.DeleteObject(screenshot.GetHandle())# 测试Printscreen()
####截图方法2####from PIL import Imagefrom PIL import ImageGrabdef Printscreen():# 截图坐标 左上角 ,右下角size = (0, 0,1920,1080)img = ImageGrab.grab(size)# 保存截图img.save("yuan.png")print('截图进行了一次刷新')# 打开截图# img.show()# 测试Printscreen()
通过模板匹配得到截图的坐标位置
注:模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。所以打开阴阳师后不要进行放大或缩小。
import cv2import numpy as npfrom matplotlib import pyplot as pltimport math###图像匹配###def Image_Discern(imgone,imgtwo):# 1.模板匹配# 大图img = cv2.imread(imgone)img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 小图template = cv2.imread(imgtwo, 0)h, w = template.shape[:2] # rows->h, cols->wimg2 = img.copy()# 对比图像res = cv2.matchTemplate(img_gray, template, cv2.TM_SQDIFF_NORMED)# 返回坐标min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)top_left = min_locbottom_right = (top_left[0] + w, top_left[1] + h)# 计算中心坐标a1, a2 = top_leftb1, b2 = bottom_rightc1 = (a1 + w/2)*0.8 # 0.8匹配屏幕分辨率(因为分辨率原因这里乘0.8用于适应平复分辨率坐标位置)c2 = (a2 + h/2)*0.8e1 = math.ceil(c1)e2 = math.ceil(c2)d1 = (e1, e2)# print('中心坐标为:' , d1)###测试图像匹配,弹出图像显示匹配位置#### 在匹配点画小圆心# cv2.circle(res, top_left, 10, 0, 2)# cv2.imshow("res", res)# # 画矩形# cv2.rectangle(img2, top_left, bottom_right, (0, 255, 0), 2)# cv2.imshow("img2",img2)# cv2.waitKey(0)# 两张图片是否匹配# print('各个参数为:',min_val, max_val, min_loc, max_loc)###进行图像筛选###if min_val <= 0.03:# print('图片匹配')return(d1)else:# print('图片不匹配')return(0)# 测试# Image_Discern('e1.png','a2.png') # (大图,小图)匹配图像
通过坐标位置进行点击import win32apiimport win32conimport win32guiimport timeimport randomdef xunzhao():wdname = u'阴阳师-网易游戏'# 取得窗口句柄hwnd = win32gui.FindWindow(0, wdname)if not hwnd:print("窗口找不到,请确认窗口句柄名称:【%s】" % wdname )exit()# 窗口显示最前面win32gui.SetForegroundWindow(hwnd)def move_click(x, y, t=0): # 移动鼠标并点击左键suiji1 = random.randint(0,10)suiji2 = random.randint(0,10)# print('鼠标抖动随机数为:+',suiji2,' +',suiji1)win32api.SetCursorPos((x+suiji1, y+suiji2)) # 设置鼠标位置(x, y),设置随机数,以防被封time.sleep(0.1)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) # 点击鼠标左键# print('模拟点击')return 0# 测试# while True :# suiji = random.randint(0,5) #获得随机数# xunzhao() #游戏顶置,获得句柄# time.sleep(suiji) #间隔时间# move_click(1280, 685) #坐标点击
一个简陋的实例有基本的方法后,然后就可以写代码进行挂机了。
贴一个自己刷探索的代码,其中click模块为鼠标模拟点击,printscreen模块为截屏,image_discern模块为模板匹配
import clickimport printscreenimport image_discernimport time###进行图标点击###def Identify_Click(little):a = 0.1click.xunzhao()time.sleep(a) # 间隔秒数printscreen.Printscreen() # 截图time.sleep(a)b1 = image_discern.Image_Discern('yuan.png', little) #图像对比for i in range(1,10):if b1 == 0:print('准备再次寻找第',i,'次')time.sleep(a)click.xunzhao()time.sleep(a)printscreen.Printscreen()time.sleep(a)b1 = image_discern.Image_Discern('yuan.png', little)else:time.sleep(a)printscreen.Printscreen() # 截图b1 = image_discern.Image_Discern('yuan.png', little) #图像对比a1, a2 = b1 #地址赋值click.move_click(a1, a2) #模拟点击time.sleep(a)break###寻找场景内是否有相应图标###def Identify_Click_Seek(little):a = 0.1click.xunzhao()time.sleep(a) # 间隔秒数printscreen.Printscreen() # 截图time.sleep(a)b1 = image_discern.Image_Discern('yuan.png', little) #图像对比if b1 == 0:# print('没有相应图标')return(False)else:# print('找到相应图标')return(True)
上面那代码块为identify_click模块
import timeimport identify_clickimport randomdef Tansuo():b=0while True:a = ('-----------------')##判断体力是否足够##if identify_click.Identify_Click_Seek('./png/tansuo/tansuo13.png'):print(a)print('体力不足')break #结束循环###组队结束战斗###if identify_click.Identify_Click_Seek('./png/tansuo/tansuo17.png'):print(a)print('战斗结束,回到组队页面')break #结束循环##判断是否结束##elif identify_click.Identify_Click_Seek('./png/tansuo/tansuo12.png'):print(a)print('探索结束!!')break##判断战斗结束##elif identify_click.Identify_Click_Seek('./png/tansuo/tansuo04.png'):identify_click.Identify_Click('./png/tansuo/tansuo04.png')print(a)print('战斗结束')continue #跳出本次循环##判断准备按钮##elif identify_click.Identify_Click_Seek('./png/tansuo/tansuo08.png'):identify_click.Identify_Click('./png/tansuo/tansuo08.png')print(a)print('战斗开始')while True:if identify_click.Identify_Click_Seek('./png/tansuo/tansuo15.png'):identify_click.Identify_Click('./png/tansuo/tansuo15.png')breakelif identify_click.Identify_Click_Seek('./png/tansuo/tansuo04.png'):identify_click.Identify_Click('./png/tansuo/tansuo04.png')breakelif identify_click.Identify_Click_Seek('./png/tansuo/tansuo16.png'):identify_click.Identify_Click('./png/tansuo/tansuo16.png')else:time.sleep(0.1)if identify_click.Identify_Click_Seek('./png/tansuo/tansuo15.png'):print('!!!!!!!!!!!')print('!战斗失败,中止脚本!')print('!!!!!!!!!!!')breakcontinue #跳出本次循环##BOSS##elif identify_click.Identify_Click_Seek('./png/tansuo/tansuo07.png'):print(a)print('发现BOSS')identify_click.Identify_Click('./png/tansuo/tansuo07.png')continue##小怪##elif identify_click.Identify_Click_Seek('./png/tansuo/tansuo03.png'):print(a)print('发现小怪')identify_click.Identify_Click('./png/tansuo/tansuo03.png')continue##奖励宝箱##elif identify_click.Identify_Click_Seek('./png/tansuo/tansuo09.png'):identify_click.Identify_Click('./png/tansuo/tansuo09.png')time.sleep(random.randint(1,2))while True:if identify_click.Identify_Click_Seek('./png/tansuo/tansuo10.png'):identify_click.Identify_Click('./png/tansuo/tansuo11.png')breakelse:time.sleep(2)print(a)print('领取奖励宝箱')continue##进行走动##elif identify_click.Identify_Click_Seek('./png/tansuo/tansuo05.png'):print(a)print('进行走动')b = b+1if b < 5:identify_click.Identify_Click('./png/tansuo/tansuo05.png')print('向右')time.sleep(random.randint(3,4)) #间隔3~4秒continueelse:identify_click.Identify_Click('./png/tansuo/tansuo06.png')print('向左')time.sleep(random.randint(3,4)) #间隔3~4秒continuetime.sleep(0.5) #间隔3~4秒return(True)# 测试Tansuo()
当中的图片

这些是最近东拼西凑的代码,简单的代替了下无聊的手点鼠标环节。
还有一个简单实现的方法,运用pyautogui库,进行鼠标点击、截屏等操作
源地址;https://www.cnblogs.com/ananing/p/python.html
推荐阅读
点小花花,让他们知道你“在看”我

文章转载自波哥的IT人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




