发布时间:2025-12-10 19:23:52 浏览次数:4
QQ游戏 找茬脚本前言毕设干扰了前一段记录笔记的进度,闲暇时刻用找茬消遣,但有时发现五处不同仅仅找出两三处,这种呼之欲出却无法求得的感觉非常难受。于是制作了适用于QQ游戏大厅–>大家一起来找茬的辅助器,此篇博客的笔记由函数与打包组成。思路界面–>屏幕截取–>对比找出不同–>鼠标自动点击一、界面运用最近接触到的pyqt5,界面的设计要点:小巧。classwindow(QMain…_大家来找茬脚本
毕设干扰了前一段记录笔记的进度,闲暇时刻用找茬消遣,但有时发现五处不同仅仅找出两三处,这种呼之欲出却无法求得的感觉非常难受。于是制作了适用于QQ游戏大厅–>大家一起来找茬 的辅助器,此篇博客的笔记由函数与打包组成。
界面–>屏幕截取–>对比找出不同–>鼠标自动点击
运用最近接触到的pyqt5,界面的设计要点:小巧。
class window(QMainWindow):def __init__(self): super().__init__() self.resize(300,50) self.move(100,100) self.setWindowTitle('连连看作弊器') #text self.text = QTextEdit(self) self.text.resize(150,25) self.text.setText('处理信息') #button start self.button = QPushButton('开始',self) self.button.clicked.connect(self.grabphoto) self.button.resize(150,25) self.button.move(150,0) #button stop self.button1 = QPushButton('停止',self) self.button1.clicked.connect(self.stop) self.button1.resize(150,25) self.button1.move(150,25) self.button.setShortcut('CTRL+C') #QComboBox self.comboBox_1 = QComboBox(self) self.comboBox_1.resize(150,25) self.comboBox_1.move(0,25) self.comboBox_1.addItem("--请选择--") self.comboBox_1.addItem("仅供提示") self.comboBox_1.addItem("机器暴力模式") self.comboBox_1.currentText()希望我今天分享的这篇文章可以帮到您。
combox的读取 currentText和Index可以直接使用。
快捷键设置setShortcut,需要鼠标焦点于界面
虽然有通过句柄获取窗口信息的截图方法,但是考虑到后序辨别效果不佳的时候还需有人操作,所以无法采用后台挂机的方法。
Imagegrab截图时间间隔长,不建议使用。
采用速度较快的屏幕截取的方式:PIL库中pyautogui.screenshot。
img1 = pyautogui.screenshot(region=[541,468,380,285]) img2 = pyautogui.screenshot(region=[x,y,length,height])注:截下来的图需要转为数组才可提供处理。
这一项是关键,曾简单认为图片像素相减不就功到渠成?
但发现游戏提供的图片在亮度和色调上有细微的不同,相减后呈现很诡异的颜色。
直到我在一篇博客上找到:图片反色相合,差异会十分明显。
img3 =ImageChops.invert(img2)img4 = Image.blend(img1,img3,0.5)img5 = np.array(img4)(网络源码)
这幅图就是辅助器根本功能之一,代码、逻辑简单到我不敢相信,但肯定要补上自动点击功能才能算较为圆满。
canny边缘提取 –>闭运算–>findcontours–>符合要求?–>改变闭运算参数–>…直到符合要求或者超出限制。
img6 = cv2.Canny(img5,90,150) kernel = np.ones((20,20),np.uint8) closing = cv2.morphologyEx(img6,cv2.MORPH_CLOSE,kernel) self.h = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) a = 18 while len(self.h[0]) > 10 and a > 1 : kernel = np.ones((a, a), np.uint8) closing = cv2.morphologyEx(img6, cv2.MORPH_CLOSE, kernel) self.h = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) self.text.setText(f'第{18-a}次处理') a -= 1 counters = self.h[0] #五个轮廓 xall = yall = 0 if len(counters) < 15: for i1 in range(len(counters)): for i2 in range(len(counters[i1])): xall += counters[i1][i2][0][0] yall += counters[i1][i2][0][1] a = xall/len(counters[i1]) + 541 b = yall/len(counters[i1]) + 468 if self.comboBox_1.currentIndex() == 2: pyautogui.click(a,b,interval=0.5,clicks=1,button='left') xall = yall = 0 cv2.imshow('heibai',closing) cv2.imshow('caise', img5)findcontours 在opencv3中返回三个参数,其中首项轮廓点是我最为需要的。
counters = h[0] 第一个轮廓点集合counters[1] 第一个轮廓的第一个点的信息counters[1][0][0] 第一个轮廓的第一个点的横坐标pyautogui.click(a,b,interval=0.5,clicks=1,button='left')我还应该注意的是若识别轮廓过多,会丧失鼠标的控制权(预处理不合适),应该加以限制。
当不同十分靠近的时候,膨胀可能会相连,识别出的点会小于五个,只能通过肉眼+辅助图像完成挑战。
pip install pyinstaller命令行运行:
pyinstaller --version确认安装成功。
我犯下错误原因是:仅仅在pycharm中删除了3.6.6编译器,但却没有在工作路径path中删除,以致于每次打包寻找依赖库的时候错误寻址。
我的电脑–属性–左侧,高级系统设置–高级–环境变量–Path–上下移动改变路径优先级–加入编译器、编译器库路径。
打包操作(细致参数调配百度 pyinstaller 第一条):
cmd – 转到main.py路径 – pyinstaller -F -w main.py – dist 中exe需要与mian.py相同的工作环境(图片,音乐相对路径相同),往上移一层即可。
from PyQt5.Qt import *import cv2import pyautoguiimport sysimport numpy as npfrom PIL import ImageChops,Imageclass window(QMainWindow): def __init__(self): super().__init__() self.resize(300,50) self.move(100,100) self.setWindowTitle('连连看作弊器') #text self.text = QTextEdit(self) self.text.resize(150,25) self.text.setText('处理信息') #button start self.button = QPushButton('开始',self) self.button.clicked.connect(self.grabphoto) self.button.resize(150,25) self.button.move(150,0) #button stop self.button1 = QPushButton('停止',self) self.button1.clicked.connect(self.stop) self.button1.resize(150,25) self.button1.move(150,25) self.button.setShortcut('CTRL+C') #QComboBox self.comboBox_1 = QComboBox(self) self.comboBox_1.resize(150,25) self.comboBox_1.move(0,25) self.comboBox_1.addItem("--请选择--") self.comboBox_1.addItem("仅供提示") self.comboBox_1.addItem("机器暴力模式") self.comboBox_1.currentText()# LU(541,468)RU(921,468) LD(541,753)RD(921,753) LU(998,468) RU(1378,468) (998,753) (1378,753)# img1 = pyautogui.screenshot(region=[541,468,380,285])# img2 = pyautogui.screenshot(region=[998, 468, 380, 285])# img3 =ImageChops.invert(img2)# Image.blend(img1,img3,0.5).show() def grabphoto(self): self.text.setText('正在进行处理') # img1 = pyautogui.screenshot(region=[541,468,380,285]) # img2 = pyautogui.screenshot(region=[998,468,380,285]) img1 = Image.open('1.png') img2 = Image.open('2.png') img3 =ImageChops.invert(img2) img4 = Image.blend(img1,img3,0.5) img5 = np.array(img4) #膨胀腐蚀做法 ''' kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 定义一个核 dst = cv2.filter2D(img5, -1, kernel=kernel) dst = cv2.filter2D(dst, -1, kernel=kernel) cv2.imshow('1',dst) img3 =ImageChops.invert(img2) img4 = Image.blend(img1,img3,0.5) img5 = np.array(img4) kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 定义一个核 dst = cv2.filter2D(img5, -1, kernel=kernel) dst = cv2.filter2D(dst, -1, kernel=kernel) cv2.imshow('1',dst) gray = cv2.cvtColor(dst, cv2.COLOR_RGB2GRAY) # 把输入图像灰度化 cv2.imshow("binary2", gray) gray = np.array(gray) newgray = np.array(gray) allgray = gray.sum()/(380*285) for i in range(380): for j in range(285): if gray[j][i] < allgray+50: newgray[j][i] = 0 else: newgray[j][i] = 255 cv2.imshow("contours", newgray) kernel = np.ones((2,2),np.uint8) closing = cv2.morphologyEx(newgray,cv2.MORPH_CLOSE,kernel) kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel1) kernel = np.ones((15,15),np.uint8) closing = cv2.morphologyEx(opening,cv2.MORPH_CLOSE,kernel) h = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contours = h[0] i = 5 while len(contours) > 5 and i >0: kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel1) print(i) i-=1 xall = yall = 0 for i1 in range(len(contours)): for i2 in range(len(contours[i1])): xall += contours[i1][i2][0][0] yall += contours[i1][i2][0][1] a = xall/len(contours[i1]) + 541 b = yall/len(contours[i1]) + 468 if self.comboBox_1.currentIndex() == 2: pyautogui.click(a,b,interval=0.5,clicks=1,button='left') xall = yall = 0 ''' img6 = cv2.Canny(img5,90,150) kernel = np.ones((20,20),np.uint8) closing = cv2.morphologyEx(img6,cv2.MORPH_CLOSE,kernel) self.h = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) a = 18 while len(self.h[0]) > 10 and a > 1 : kernel = np.ones((a, a), np.uint8) closing = cv2.morphologyEx(img6, cv2.MORPH_CLOSE, kernel) self.h = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) self.text.setText(f'第{18-a}次处理') a -= 1 counters = self.h[0] #五个轮廓 xall = yall = 0 if len(counters) < 15: for i1 in range(len(counters)): for i2 in range(len(counters[i1])): xall += counters[i1][i2][0][0] yall += counters[i1][i2][0][1] a = xall/len(counters[i1]) + 541 b = yall/len(counters[i1]) + 468 if self.comboBox_1.currentIndex() == 2: pyautogui.click(a,b,interval=0.5,clicks=1,button='left') xall = yall = 0 cv2.imshow('heibai',closing) cv2.imshow('caise', img5) def stop(self): passif __name__ == '__main__': app = QApplication(sys.argv) a = window() a.show() sys.exit(app.exec_())