Python简单实现阴阳师挂机脚本
Posted 榕霖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python简单实现阴阳师挂机脚本相关的知识,希望对你有一定的参考价值。
参考大佬们的博客,凑出了阴阳师的简单挂机脚本,对各个博主进行感谢,鞠躬.jpg
实现原理:
对各个按钮等需要点击的地方进行截图,然后对整个屏幕截屏,通过模板匹配得到截图在截屏中的坐标位置,进行点击
实现方法:
对整个屏幕进行截图,并保存
1 ####截图方法1#### 2 import win32gui 3 import win32ui 4 import win32con 5 import win32api 6 def Printscreen(): 7 # 获取桌面 8 hdesktop = win32gui.GetDesktopWindow() 9 10 # 分辨率适应 11 width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN) 12 height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN) 13 left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN) 14 top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN) 15 # width=1920 # 因为用win32api.GetSystemMetrics获取的分辨率不对,于是我直接手输入进去的 16 # height=1080 17 18 # 创建设备描述表 19 desktop_dc = win32gui.GetWindowDC(hdesktop) 20 img_dc = win32ui.CreateDCFromHandle(desktop_dc) 21 22 # 创建一个内存设备描述表 23 mem_dc = img_dc.CreateCompatibleDC() 24 25 # 创建位图对象 26 screenshot = win32ui.CreateBitmap() 27 screenshot.CreateCompatibleBitmap(img_dc, width, height) 28 mem_dc.SelectObject(screenshot) 29 30 # 截图至内存设备描述表 31 mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY) 32 33 # 将截图保存到文件中 34 screenshot.SaveBitmapFile(mem_dc, \'yuan.png\') 35 36 # 内存释放 37 mem_dc.DeleteDC() 38 win32gui.DeleteObject(screenshot.GetHandle()) 39 40 # 测试 41 Printscreen()
1 ####截图方法2#### 2 from PIL import Image 3 from PIL import ImageGrab 4 5 def Printscreen(): 6 # 截图坐标 左上角 ,右下角 7 size = (0, 0,1920,1080) 8 img = ImageGrab.grab(size) 9 # 保存截图 10 img.save("yuan.png") 11 print(\'截图进行了一次刷新\') 12 # 打开截图 13 # img.show() 14 15 # 测试 16 Printscreen()
通过模板匹配得到截图的坐标位置
模板匹配参考博客
图像筛选参考博客
注:模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。所以打开阴阳师后不要进行放大或缩小。
1 import cv2 2 import numpy as np 3 from matplotlib import pyplot as plt 4 import math 5 6 ###图像匹配### 7 def Image_Discern(imgone,imgtwo): 8 # 1.模板匹配 9 # 大图 10 img = cv2.imread(imgone) 11 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 12 13 # 小图 14 template = cv2.imread(imgtwo, 0) 15 h, w = template.shape[:2] # rows->h, cols->w 16 img2 = img.copy() 17 18 # 对比图像 19 res = cv2.matchTemplate(img_gray, template, cv2.TM_SQDIFF_NORMED) 20 21 # 返回坐标 22 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) 23 top_left = min_loc 24 bottom_right = (top_left[0] + w, top_left[1] + h) 25 26 # 计算中心坐标 27 a1, a2 = top_left 28 b1, b2 = bottom_right 29 c1 = (a1 + w/2)*0.8 # 0.8匹配屏幕分辨率(因为分辨率原因这里乘0.8用于适应平复分辨率坐标位置) 30 c2 = (a2 + h/2)*0.8 31 e1 = math.ceil(c1) 32 e2 = math.ceil(c2) 33 d1 = (e1, e2) 34 # print(\'中心坐标为:\' , d1) 35 36 ###测试图像匹配,弹出图像显示匹配位置### 37 # 在匹配点画小圆心 38 # cv2.circle(res, top_left, 10, 0, 2) 39 # cv2.imshow("res", res) 40 41 # # 画矩形 42 # cv2.rectangle(img2, top_left, bottom_right, (0, 255, 0), 2) 43 # cv2.imshow("img2",img2) 44 # cv2.waitKey(0) 45 46 # 两张图片是否匹配 47 # print(\'各个参数为:\',min_val, max_val, min_loc, max_loc) 48 49 ###进行图像筛选### 50 if min_val <= 0.03: 51 # print(\'图片匹配\') 52 return(d1) 53 else: 54 # print(\'图片不匹配\') 55 return(0) 56 57 58 # 测试 59 # Image_Discern(\'e1.png\',\'a2.png\') # (大图,小图)匹配图像
通过坐标位置进行点击
鼠标点击参考博客
1 import win32api 2 import win32con 3 import win32gui 4 import time 5 import random 6 7 def xunzhao(): 8 9 wdname = u\'阴阳师-网易游戏\' 10 # 取得窗口句柄 11 hwnd = win32gui.FindWindow(0, wdname) 12 if not hwnd: 13 print("窗口找不到,请确认窗口句柄名称:【%s】" % wdname ) 14 exit() 15 # 窗口显示最前面 16 win32gui.SetForegroundWindow(hwnd) 17 18 def move_click(x, y, t=0): # 移动鼠标并点击左键 19 suiji1 = random.randint(0,10) 20 suiji2 = random.randint(0,10) 21 22 # print(\'鼠标抖动随机数为:+\',suiji2,\' +\',suiji1) 23 win32api.SetCursorPos((x+suiji1, y+suiji2)) # 设置鼠标位置(x, y),设置随机数,以防被封 24 time.sleep(0.1) 25 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) 26 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) # 点击鼠标左键 27 # print(\'模拟点击\') 28 return 0 29 30 # 测试 31 # while True : 32 # suiji = random.randint(0,5) #获得随机数 33 # xunzhao() #游戏顶置,获得句柄 34 # time.sleep(suiji) #间隔时间 35 # move_click(1280, 685) #坐标点击
一个简陋的实例
有基本的方法后,然后就可以写代码进行挂机了。
贴一个自己刷探索的代码,其中click模块为鼠标模拟点击,printscreen模块为截屏,image_discern模块为模板匹配
1 import click 2 import printscreen 3 import image_discern 4 import time 5 6 ###进行图标点击### 7 def Identify_Click(little): 8 a = 0.1 9 click.xunzhao() 10 time.sleep(a) # 间隔秒数 11 printscreen.Printscreen() # 截图 12 time.sleep(a) 13 b1 = image_discern.Image_Discern(\'yuan.png\', little) #图像对比 14 for i in range(1,10): 15 if b1 == 0: 16 print(\'准备再次寻找第\',i,\'次\') 17 time.sleep(a) 18 click.xunzhao() 19 time.sleep(a) 20 printscreen.Printscreen() 21 time.sleep(a) 22 b1 = image_discern.Image_Discern(\'yuan.png\', little) 23 else: 24 time.sleep(a) 25 printscreen.Printscreen() # 截图 26 b1 = image_discern.Image_Discern(\'yuan.png\', little) #图像对比 27 a1, a2 = b1 #地址赋值 28 click.move_click(a1, a2) #模拟点击 29 time.sleep(a) 30 break 31 32 ###寻找场景内是否有相应图标### 33 def Identify_Click_Seek(little): 34 a = 0.1 35 click.xunzhao() 36 time.sleep(a) # 间隔秒数 37 printscreen.Printscreen() # 截图 38 time.sleep(a) 39 b1 = image_discern.Image_Discern(\'yuan.png\', little) #图像对比 40 if b1 == 0: 41 # print(\'没有相应图标\') 42 return(False) 43 else: 44 # print(\'找到相应图标\') 45 return(True)
上面那代码块为identify_click模块
1 import time 2 import identify_click 3 import random 4 5 def Tansuo(): 6 7 b=0 8 while True: 9 a = (\'-----------------\') 10 ##判断体力是否足够## 11 if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo13.png\'): 12 print(a) 13 print(\'体力不足\') 14 break #结束循环 15 ###组队结束战斗### 16 if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo17.png\'): 17 print(a) 18 print(\'战斗结束,回到组队页面\') 19 break #结束循环 20 ##判断是否结束## 21 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo12.png\'): 22 print(a) 23 print(\'探索结束!!\') 24 break 25 ##判断战斗结束## 26 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo04.png\'): 27 identify_click.Identify_Click(\'./png/tansuo/tansuo04.png\') 28 print(a) 29 print(\'战斗结束\') 30 continue #跳出本次循环 31 ##判断准备按钮## 32 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo08.png\'): 33 identify_click.Identify_Click(\'./png/tansuo/tansuo08.png\') 34 print(a) 35 print(\'战斗开始\') 36 while True: 37 if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo15.png\'): 38 identify_click.Identify_Click(\'./png/tansuo/tansuo15.png\') 39 break 40 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo04.png\'): 41 identify_click.Identify_Click(\'./png/tansuo/tansuo04.png\') 42 break 43 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo16.png\'): 44 identify_click.Identify_Click(\'./png/tansuo/tansuo16.png\') 45 else: 46 time.sleep(0.1) 47 if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo15.png\'): 48 print(\'!!!!!!!!!!!\') 49 print(\'!战斗失败,中止脚本!\') 50 print(\'!!!!!!!!!!!\') 51 break 52 continue #跳出本次循环 53 ##BOSS## 54 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo07.png\'): 55 print(a) 56 print(\'发现BOSS\') 57 identify_click.Identify_Click(\'./png/tansuo/tansuo07.png\') 58 continue 59 ##小怪## 60 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo03.png\'): 61 print(a) 62 print(\'发现小怪\') 63 identify_click.Identify_Click(\'./png/tansuo/tansuo03.png\') 64 continue 65 ##奖励宝箱## 66 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo09.png\'): 67 identify_click.Identify_Click(\'./png/tansuo/tansuo09.png\') 68 time.sleep(random.randint(1,2)) 69 while True: 70 if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo10.png\'): 71 identify_click.Identify_Click(\'./png/tansuo/tansuo11.png\') 72 break 73 else: 74 time.sleep(2) 75 print(a) 76 print(\'领取奖励宝箱\') 77 continue 78 ##进行走动## 79 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo05.png\'): 80 print(a) 81 print(\'进行走动\') 82 b = b+1 83 if b < 5: 84 identify_click.Identify_Click(\'./png/tansuo/tansuo05.png\') 85 print(\'向右\') 86 time.sleep(random.randint(3,4)) #间隔3~4秒 87 continue 88 else: 89 identify_click.Identify_Click(\'./png/tansuo/tansuo06.png\') 90 print(\'向左\') 91 time.sleep(random.randint(3,4)) #间隔3~4秒 92 continue 93 94 time.sleep(0.5) #间隔3~4秒 95 return(True) 96 97 # 测试 98 Tansuo()
当中的图片
这些是最近东拼西凑的代码,简单的代替了下无聊的手点鼠标环节。
还有一个简单实现的方法,运用pyautogui库,进行鼠标点击、截屏等操作,pyautogui库使用方法参考博客
最后再次感谢各位大佬的博客
以上是关于Python简单实现阴阳师挂机脚本的主要内容,如果未能解决你的问题,请参考以下文章