北斗卫星导航系统下载-天正建筑2013破解版

美女找茬辅助器下载
2023年4月3日发(作者:windows优化大师下载)

用Python实现QQ游戏大家来找茬辅助工具

这是一个用于QQ大家来找茬(美女找茬)的辅助外挂,开发的原因是看到老爸天天在玩这个游戏,分数是惨不忍

睹的负4000多。本来是想写个很简单的东西,但由于过程中老爸的多次嘲讽,逼得我不得不尽力完善,最后形成

了一个小小的产品。

好久没写技术相关的文章,这次写篇有意思的,关于一个有意思的游戏——QQ找茬,关于一种有意思的语言——Pyth

on,关于一个有意思的库——Qt。

这是一个用于QQ大家来找茬(美女找茬)的辅助外挂,开发的原因是看到老爸天天在玩这个游戏,分数是惨不忍睹

的负4000多。他玩游戏有他的乐趣,并不很在意输赢,我做这个也只是自我娱乐,顺便讨他个好,毕竟我们搞编程的

实在难有机会在父辈面前露露手。本来是想写个很简单的东西,但由于过程中老爸的多次嘲讽,逼得我不得不尽力完

善,最后形成了一个小小的产品。

接触Python是2010年,相见恨晚,去年拿它写了些小玩意,离职前给前公司留下了一个Python+wxPython的工作工

具,还挺受欢迎。换公司后努力学习C++&Qt,很后悔当初选择了wxPython而不是PyQt,没能一脉相承。使用Qt越久

,不得不越来越喜欢,写这个东西正好就用上了。

话不多说,进入正题。这不是一篇完整的代码讲解,只是过程中的一些技术做个分享,包括后来被放弃的一些技术点

。当初搜索这些东西也挺费力的,在这做个笔记,后来者也许能搜到收益。

先上个图:

话说这位是游戏中出镜最多的MM,和QQ什么关系啊?

辅助工具在游戏中增加了两个按钮,点击“对比”则自动找“茬”,用蓝色小框标识,点击“擦除”清除标识。

游戏窗口探查

这得用PyWin32库,它是对windows接口的Python封装,VC能做的它基本都行。

下载地址:/projects/pywin32/,但不能直接点Download图标,不然下下来是一个

,点“BrowseAllFiles”寻找需要的版本。

#coding=utf-8importwin32gui

QQ找茬是个对话框窗口,Class是“#32770”,这种窗口桌面上有很多,所以还配合了标题“大家来找茬”匹配,又因为

是中文,所以第一行指定了使用utf-8编码,否则要么找不到,要么运行出错。

游戏图片提取

提取图片采用了截屏的方式,找到窗口后将窗口提到最前,再作窗口截屏。截屏使用了大名鼎鼎的PythonImagingLi

brary(PIL)库。

上面用到的坐标都为为了演示代码简单填的,实际上使用了变量参数,而且要区分分辨率什么的。

PIL是一个强大的Python图形库(使用文档),待会的对比分析也须要用到。ImageGrab是PIL的一个模块,用于图像

的抓取。不带参数的()进行全屏截屏,返回一个Image对象,也可使用一个元组作为参数指定要截取

的范围(左上与右下两点的坐标),这两种截屏都是不带鼠标指针的,还有一个ipboard()可从系统

剪贴板采集图像。

得到Image图像后可用show()方法,使用系统默认的图像查看工具打开,方便调试,也可以用save(filename)保存成

文件,对应的可以(filename)打开获得。

grab得到了一个包含左右图片的Image对象后,用crop(box)方法可裁剪得到其中指定的区域,分别拿到左右两个游戏

图片。

对比获得两图内容不同的区域

很自然想到把两图裁剪成N个小图片分别对比,左右统一区域对应的小图片不相等则为“茬”区,唯一的问题是怎么判

断两个图片内容不一致?

一开始以为很会有些麻烦,直到发现了ram()函数,该函数用于得到图像的颜色直方图。我平常也爱好摄

影,知道直方图可以表示一张图片中各种亮度(或颜色)的数量,两张自然图片的直方图基本是不一样的,除非两图

对称、颜色一致但排列不一,但就算如此,将两图继续分割下去,其子图的直方图也会不一样。直方图就是一种图形

到数值的转换,对比两图的颜色数值就可知是否存在差异。

一张用RBG颜色格式的图像,histogram()函数将返回一个长度为768的数组,第0-255表示红色的0-255,第256-511

表色绿色的0-255,第512-767表色蓝色的0-255,数值表示该颜色像素的个数。因此,histogram()列表所有成员之和

等于改图像的像素值x3。

写了一个函数,用来获得两图比较的数值差:

game_hwnd=ndow("#32770","大家来找茬")printgame_hwnd

importImageGrabimportwin32con

ndow(game_hwnd,_RESTORE)#强行显示界面后才好截图

regroundWindow(game_hwnd)#将游戏窗口提到最前#裁剪得到全图game_rect=d

owRect(game_hwnd)

src_image=((game_rect[0]+9,game_rect[1]+190,game_rect[2]-9,game_

rect[1]+190+450))#src_()#分别裁剪左右内容图片left_box=(9,0,500,45

0)

right_box=(517,0,517+500,450)

image_left=src_(left_box)

image_right=src_(right_box)#image_()#image_()

efcompare(image_a,image_b):'''返回两图的差异值

返回两图红绿蓝差值万分比之和'''histogram_a=image_ram()

histogram_b=image_ram()iflen(histogram_a)!=768orlen(histogram_b)!=768

:returnNone

red_a=0red_b=0foriinxrange(0,256):

red_a+=histogram_a[i+0]*i

red_b+=histogram_b[i+0]*i

diff_red=0ifred_a+red_b>0:

diff_red=abs(red_a-red_b)*10000/max(red_a,red_b)

将函数返回的红绿蓝差值相加,如果超过了预定定的阀值2000,则表示该区域不同。这个计算方式有点“土”,但对这

次要解决的问题很有效,就没再继续改进。

大图是500x450,分隔成10x10的小块,定义一个50x45的二位数组存储结果,分别比较后将差值大于阀值的数组区域

标记为1.

在游戏上标记两边不同的区域

最初我用了PyWin32的一些函数,获得游戏窗口句柄后直接在上面绘制,但我不太熟悉Windows编程,不知道如何解

决游戏自身重绘后将我的标记擦除的问题,然后搬来了Qt。用Qt创建了一个和游戏大小一样透明的QWidget窗口,叠

加在游戏窗口上,用遮罩来绘制标记。标记数据已记录在result数组中,在指定的位置绘制一个方格则表示该区域左

右不同,要注意两个方格间的边界不要绘制,避免格子太多干扰了游戏。除标记外,还绘制了两个按钮来触发对比与

擦除。

green_a=0green_b=0foriinxrange(0,256):

green_a+=histogram_a[i+256]*i

green_b+=histogram_b[i+256]*i

diff_green=0ifgreen_a+green_b>0:

diff_green=abs(green_a-green_b)*10000/max(green_a,green_b)

blue_a=0blue_b=0foriinxrange(0,256):

blue_a+=histogram_a[i+512]*i

blue_b+=histogram_b[i+512]*i

diff_blue=0ifblue_a+blue_b>0:

diff_blue=abs(blue_a-blue_b)*10000/max(blue_a,blue_b)

returndiff_red,diff_green,diff_blue

将左右大图裁剪成多个小图分别进行对比result=[[0forainxrange(0,50)]forbinxrange(0,

45)]forcolinxrange(0,50):

forrowinxrange(0,45):

clip_box=(col*10,row*10,(col+1)*10,(row+1)*10)

clip_image_left=image_(clip_box)

clip_image_right=image_(clip_box)

clip_diff=e(clip_image_left,clip_image_right)

ifsum(clip_diff)>2000:

result[row][col]=1

efpaintEvent(self,event):#重置遮罩图像()

#创建绘制用的QPainter,笔画粗细为2像素#事先已经在Qt窗体上铺了一个蓝色的背景图片,因此投过遮

罩图案看下去标记线条是蓝色的p=QPainter()

(QPen(QBrush(QColor(0,0,0)),2))

forrowinxrange(len()):forcolinxrange(len([0])):

ult[row][col]!=0:#定一个基点,避免算数太难看base_l_x=_LEFT_X+_

WIDTH*col

base_r_x=_RIGHT_X+_WIDTH*col

base_y=_Y+_HEIGHT*row

ifrow==[row-1][col]==0:#如果是第一行,或者上面的格子为空,画一条上

边ne(base_l_x,base_y,base_l_x+_WIDTH,base_y)

ne(base_r_x,base_y,base_r_x+_WIDTH,base_y)ifrow==len(

)-[row+1][col]==0:#如果是最后一行,或者下面的格子为空,画

一条下边ne(base_l_x,base_y+_HEIGHT,base_l_x+_WIDTH,base

_y+_HEIGHT)

ne(base_r_x,base_y+_HEIGHT,base_r_x+_WIDTH,bas

e_y+_HEIGHT)ifcol==[row][col-1]==0:#如果是第一列,或

者左边的格子为空,画一条左边ne(base_l_x,base_y,base_l_x,base_y+_HEIG

HT)

ne(base_r_x,base_y,base_r_x,base_y+_HEIGHT)ifcol==len

([0])-[row][col+1]==0:#如果是第一列,或者右边的格子为空,

画一条右边ne(base_l_x+_WIDTH,base_y,base_l_x+_WIDTH,base

_y+_HEIGHT)

ne(base_r_x+_WIDTH,base_y,base_r_x+_WIDTH,base

_y+_HEIGHT)

#在遮罩上绘制按钮区域,避免按钮被遮罩挡住看不见ct(_ry(),QBr

ush(QColor(0,0,0)))

ct(_ry(),QBrush(QColor(0,0,0)))

#将遮罩图像作为遮罩k(QBitmap())

这里我没有替换变量,太麻烦了,能看清楚算法就行。

让PyQt程序在任务栏隐藏

为了让PyQt程序不出现在任务栏,构造QWidget设置了这些属性

让PyQt程序加入系统托盘、资源文件使用

PyQt添加托盘菜单非常容易,几行代码就可以

最初我是用的托盘图标是一个.ico文件,执行脚本可以正常显示,但打包成exe后执行在托盘上显示为一个空白图标,

用Python的idle工具编译运行也是空白。尝试多次后发现:PyQt的托盘图标不能使用.ico文件,否则会显示空白,换成

png格式素材就没问题!

PyQt资源文件打包

Qt使用一个.qrc格式的xml文件管理素材,代码用可用:的方式引用资源文件中的素材,这在PyQt中同样

支持。

这里我创建了一个文件

然后用

命令,将资源文件转成一个python模块,在代码中importresources,则可以用这样的方式使用图像素材

打包成可执行程序

这个工具是给别人用的,肯定不能以py脚本的形式发布,我使用了cx_Freeze来打包为可执行程序。

为此要写一个打包命令脚本

dowFlags(essWindowHint|StaysOnTopHint||

)

创建托盘=QIcon(":")

on=QSystemTrayIcon(self)n()

ToolTip(u"QQ找茬助手")()

#托盘气泡消息ssage(u"QQ找茬助手",u"QQ找茬助手已经待命,进入游戏即可激

活")

#托盘菜单=QAction(u"退出QQ找茬助手",self,triggered=)#触发点击

后调用()命令,即退出=QMenu(self)ion()self

.textMenu()

>

=QIcon(":")

#!Python#coding=utf-8#python转exe脚本##安装cx_Freeze#执行

uild#将自动生成build目录,其下所有文件都必须打包#importsysfromcx_Freezeimportsetup

最后执行一个命令

则会在当前路径下创建个build目录,打包的程序就在其中一个-amd64-2.7的目录中,运行exe即可执行,与Py

thon无二。可惜这个包太大了一些,整个目录达到了30M。

为了让exe程序也有一个好看的图标,在最后一行中的executables参数中指定了icon="",这个图标就最好使

用多页的.ico格式(16x16,32x32,48x48...),让程序在各种显示环境下(桌面、文件夹)都有原生的显示。

如果打包的时候必须使用独立的资源,可在buildOptions字典参数中增加一条include_files=['']配置,这样在

打包时会将python脚本目录中的文件拷贝到exe目录中,不写的话就得人工拷贝了。

小技巧:Python获得自己的绝对路径

Python中有个魔术变量可以得到脚本自身的名称,但转换成exe后该变量失效,这时得改用able获得可执行

程序的名称,可用hasattr(sys,"frozen")判断自己是否已被打包,下面是一个方便取绝对路径的函数:

importsysdefmodule_path():ifhasattr(sys,"frozen"):return

e(h(unicode(able,esystemencoding())))e(os

.h(unicode(__file__,esystemencoding())))

结束语

Python可能是程序员最好的玩具,什么都能粘起来,日常写点小工具再合适不过了。

文中的第三方模块都可以Google获得下载地址,有些库没有Win764位的原始版本(比如PIL),但可到

/~gohlke/pythonlibs/

下载别人编译好的,也很方便。

,Executable

base=rm=="win32":

base="Win32GUI"

buildOptions=dict(

compressed=True)

setup(

name="ZhaoChaAssistant",version="1.0",description="ZhaoChaAssistant",options

=dict(build_exe=buildOptions),executables=[Executable("",base

=base,icon="")])

d

更多推荐

美女找茬辅助器下载