寻找软件破解高手游戏辅助软件,求高手指点

<专注网络游戏工作室赚钱项目攻略!
当前位置: &#62;&#62;
&#62;&#62; 正文
日 17:12:25&&分类: 游戏工作室建立
关注NBE好长一段时间了。看到前一段时间,有一个游戏辅助作者同行发的连载系列文章《》,真得是深有感触,所谓外行看热闹,内行看门道,看看评论,有人说他是在吹牛逼,有人说他是靠自己想象力天马行空乱写,我也只能是“微微一笑”呵呵!因为我也算是个外行!今天,我也来分享一下写的点滴历程,是微微一笑,还是呵呵,都无怕所谓了。对于游戏辅助行业而言,我属于“外行”。我本身算得上比较“老”的一代程序员了,赶上了2000年互联网泡沫的尾声。在学校的时候就喜欢搞一点黑客、破解什么的,但仅仅是出于兴趣爱好。毕业之后,一直从事软件开发相关的工作,做过网络游戏,开过互联网公司,眨眼间,在软件行业里面混了十几年了。兴趣原因,经常混迹于当时的看雪学院、小榕软件、绿盟论坛等,膜拜各路大神的时候,也在默默的积累技术。最早准备写辅助是当时玩完美的游戏,完美世界、诛仙之类的网游。现在的游戏辅助基本框架也都是在那个时候积累下来的。因为搞传统软件研发养成的习惯,辅助框架写的质量还算可以,并且文档什么的也比较规范,算是给现在的工作打下了比较好的基础,很多东西都可以重用。当时有一个本地的游戏工作室想让我给他们专职做辅助,但是考虑到种种因素,没有答应,后来辅助的开发进度也一拖再拖,最后也逐渐不好意思和他们联系了。再后来,工作越来越忙,也就把这个事情放下了。再后来,朋友的朋友找到我,希望给他开发辅助,当时有一搭没一搭的聊,因为自身收入还不错,所以也就没有很上心。再后来,碍于朋友的面子,加上对方一催再催,只好答应对方。对方是一个不算大的网络游戏工作室,大约有60台E3+32G电脑主机,在当时算是不错的配置了。游戏工作室老板A是一个非常聪明能干的小伙子。A从辅助代理商人那里买的游戏辅助,但是因为游戏工作室不大,所以价格、服务等方面都不能让A满意。因为很久不碰辅助的东西了,并且当时要做的游戏J3我也没有玩过,所以我让A给我了一份他正在用的辅助。经过分析之后,感觉能做,于是开始动工。当时的J3是有宏接口的,并且出金思路主要围绕试炼副本和帮会钓鱼,所以核心功能很容易就完成了,先让A跑起来。在当时,J3已经是被很多游戏工作室称为夕阳游戏了,开服时间太长了,但是A认为,J3是点卡游戏,生命周期本身就会相对较长,并且,如果出金思路正确,可以在做上至少1年。现在看,当时A的思路是非常正确的,因为,现在已经过去了一年半多了,他们依然还在围绕J3做。核心跑起来之后,游戏工作室需要大量的人工去看机器,并且,因为J3自身的优化的问题,单机的多开受到了极大的限制。围绕人工问题,我又制作了控制台,可以同时监控本机各个窗口的角色、等级、状态、红蓝、地图/位置、背包、金钱、体、精、帮贡等一系列信息,这样,游戏工作室员工只需要看一眼控制台,就可以了解本机的所有窗口的挂机情况。围绕效率问题,我彻底修改了挂机方式,通过降低渲染帧数的方式,把帧数降低到了30秒一帧,基本上算是解决了CPU占用过高的问题。基本上前面提到的E3机器可以开48开没有什么压力。这次的修改大约陆陆续续用了我半年的时间。至此,辅助的整体框架已经和最初的设计天差地别了。最初仅仅是要制作一个简单的插件,通过修改游戏客户端的资源包加载到客户端就可以了。但是现在,已经变成了一个主控台,通过主控台自动批量启动、自动登录,支持卡位报警、能够运行自定义脚本、能够定时运行命令、能够定时关闭客户端(每周1周4停服维护),然后针对客户端能够进行锁屏,能够进行游戏内自定义脚本调试、录制等等等等……一切看上去那么美好,我都深深的为自己的伟大创举而内牛满面……然而,2014年暑假期间,相信做J3的朋友都不会忘记,J3开始大面积封停。那段时间,基本上起一批封一批,起了就封、再起再封。A和他朋友的游戏工作室损失惨重。那段时间也恰巧碰上我的工作也很忙,只能晚上熬夜调试,找问题、找方案。基本上那段时间每天只能睡三四个小时,其余的时间,要么做公司的事情,要么在调试辅助。整整2个月的时间,处于崩溃的边缘。因为严重睡眠不足,上下班路上开车,半个月三次事故,其中有两次发生在4天内,也就是刚从4S店把车提出来的第二天,就又来了一次事故。所幸都是刮擦和追尾事故,也没有碰上对方是豪车,前后两个保险杠都换过了,喷漆也免不了。期间,不止一次想要放弃,毕竟自己的工作收入也不错,加上这么多年的打拼,也算是衣食无忧了,真没有必要这么拼命了。然而,A和他朋友的游戏工作室已经都切换到了我的辅助,我有退路,他们却没有退路。思量再三,只能坚持。终于,通过分析客户端和网络封包,找到了J3上报的检测数据,找到了规则,就很简单了,APIHook,把异常部分跳过去就OK了,对于无法跳过的规则,简单粗暴的重启客户端重登录即可,毕竟无法处理的几率比较低,好几天才能碰到一次。终于,经过几次调整之后,总算是稳定了。美美的睡了两三个周之后,问题又来了,J3又开始进行无节操的封停了。检查之后发现,客户端的检测规则没有变化,那么问题只能是出在服务器端了。因为在座APIHook的时候,我已经对本机硬件序列号、MAC地址、局域网IP等信息都做了处理,那么服务器端能够检测的只能是公网IP了,应该是通过类似于对网吧IP段做白名单,个人的同一个IP如果同时登录的客户端过多的话,就会进入封停判定。我让A去尝试同IP登录上限,同时开始考虑应对方案。因为A的机器前边是48开或者多的挂到50开,而Windows自身又没有机制能够对多个网卡进行可定制的分流,所以这个多IP的方案又让我犯了难……考虑再三,我让A直接使用市面上的IP代理软件先跑起来。跑了大概有2个周的时候,A告诉我,还会有封停。初步考虑IP代理可能会一个IP卖给多个游戏工作室,从而导致封停问题。至此,没有退路和借口的我又开始了漫漫的熬夜的日子。其实解决方案倒也简单,我自制了个路由器的ROM,让路由器充当代理服务器,然后在本地使用LSP劫持了通讯的函数,通过自己写的代理客户端完成通讯,通讯时按照配置选取通过那个代理服务器通讯。虽然各种不完美,但总算是能够稳定的跑起来了。测试没有问题之后,A和他的朋友们开始批量采购定制的路由,批量拉网线。据说光A自己就新增了近600条网线。A的游戏工作室规模越来越大,管理也越来越复杂。在完成了定制路由之后,休息了没几天的我又被A要求想办法降低人工。没办法,顾客就是上帝……于是,我又制作了网络控制台,可以监控多台机器上的角色,同时能够进行一些简单的维护工作,像重启客户端、发送命令什么的都可以在网络控制台上。又是一个多月的熬夜,终于算是稳定运行了。至此,A的160多台机器,只需要3个员工就可以轻松维护,时不时还能休个假、聚个餐什么的。而我,因为长时间的熬夜,身体被严重透支,头晕、耳鸣、神经衰弱,腰椎和颈椎也都出现了问题。严重的一次,左手拿了一杯水,硬生生的给抖的洒了一地,死活没法送到嘴里。当时正好快年底了,从公司请了年假,带着老婆孩子省内逛了一圈,玩了大概半个月,身体才逐渐好了一点。休整回来后,陆陆续续完善了一些功能。像11月份更新后出售需要确认、4月份版本更新后神行的过图问题等等,都是一些小的调整。比较大的改动是做了自动合成萤石的功能,后来合成萤石不需要跑洗炼台了,辛辛苦苦做的半仙罗盘、试炼台寻路什么的也就都没有什么用处了。运行到今年,刚过春节,A又找到我,说出金效率随着金价的降低,需要调整了,否则游戏工作室开始没有利润了。于是乎,又一次开启熬夜模式,比较凑巧的是,公司也恰好在这时开始一个重要项目的合作,前期的准备工作交给我来完成。熬夜,熬夜再熬夜……经过把试炼和钓鱼功能完全推翻重写,终于能够做到5000分装备的号平均4分30秒左右试炼通过,全部用来打试炼的话,每天大概能打330封到350封信,配合每晚的钓鱼活动,只需要极少量的副本就能把精力完全消耗光。就在前几天,新版本更新后五行石合成界面变了,不能合成五行石了,又进行了简单的调整。林林总总,也算是在游戏辅助这个圈子里做了几年了。这是一个严重透支体力精力的工作。在这几年里,身体每况愈下,到现在已经算得上是浑身是病了。如果按照投入产出比来说的话,也没有大家想象的那么划算。我现在的工作,每年能拿个小20万,加上年底分红,也能有个10几20万吧,并且基本上每年都能够上一个台阶。而写游戏辅助,付出的要比工作更多,虽然看上去一年也能有个几十万的收入,但是真的是太累太累了。我有的时候就在想,如果我拿写游戏辅助的这些精力放在工作上,或者再重新创业,应该不会比现在做辅助收益少。但是无奈,上了这条船,游戏工作室一帮人还在指望着我,只能再坚持一段时间了。大约2个月前,我也和A也进行了一次长聊,虽然没有直接说不想开新项目了,但我告诉他,应该考虑一下双项目并行,不要把宝全押在J3上面了,我真的累了。我估计J3再做1年应该没有大问题,但是,J3结束之后,我不想再继续写辅助了。毕竟也老大不小了,体力和精力都跟不上了,游戏辅助这个行业还是年轻人的天下。对于想入行的,在NBE徘徊的年轻人,我想说,这个行业其实没有那么难,同时也没有那么美好。技术层面如果要开发精品的话,还是得靠C/C++来支撑。如果是需要赶暴利期的话,那就随意了,什么开发快用什么,像什么E语言什么的,虽然我没有学过,但是可以肯定它学起来很容易。入门很简单,网上有大批的教程。,还是需要有比较全面的知识的。比如常见的系统API什么的,肯定是要熟悉的,而如果是注入式的内挂的话,各种注入方式、各种Hook技术也是必须要会的。比如,我的这个辅助,算不上完美、也算不上强大,里面用到的技术我简单的把想到的罗列一下:一套自己的网络框架,能够处理客户端和控制台之间的各种消息通讯,同时也用在了单机控制台和网络控制台之间的通讯上;一套自己的Hook引擎,用于在关键点挂接,比如帧数优化、反和谐等。这里面采用的方式有Jmp跳转方式的inline-hook、调试中断(包括int3中断和硬件中断),其他的还有内存访问中断等;为了配合上下文信息的获取,还有调用堆栈的处理等;一套自己的DLL加载器,通过DLL加载器,彻底隐藏注入的DLL,避免被扫描到;一套自己的资源打包、解包管理,将一些文本、脚本等文件进行打包处理,提高破解门槛;一套自己的特征码扫描引擎,能够根据特征码自动扫描出exe和dll里面的基址、偏移等信息,减少游戏新版本更新后的基址查找工作量。通过它,我基本上能够做到开服前更新基址;一套自己实现的socket代理客户端,能够改变制定进程的网络访问路径;一套基于lua语言的脚本引擎,能够解析并执行自定义命令及其参数,带有分支、循环等特性,同时能够自定义变量、自定义函数等;暂时就想到这些,有的内容写的时间也比较久远了,很多东西都需要翻文档或者代码才能想起来了。如果有别的出路的话,先考虑去工作吧,这个行业的艰辛超过你的想象。虽然我走的算是一路顺风顺水,但是这些和A的支持、天时地利都分不开。不要小看一个简单的辅助软件。要知道辅助对于Bug的容忍度要远远低于普通的项目软件。要知道,一旦游戏辅助商业化之后,同时运行的数量和持续时间,都远远大于普通的商业软件。正是因为长时间、大批量的运行,程序的任何缺陷都会被放大。比如试炼中的推石头关卡,有百分之一的几率会失败,那么,在A的游戏工作室里面160台机器同时运行,就相当于同时运行7000多个窗口,每个窗口每天大约通关320次,其中推石头关卡出现的几率是4/9,也就是所有的机器里面推石头关卡会出现近100万次,失败大约1万次,如果每次失败增加通关时间2.5分钟的话,相当于为整个游戏工作室浪费了25000分钟,这相当于单号打试炼通关5500次,游戏工作室的利润,就这么被浪费了。可能会有童鞋质疑,比如J3能不能做,能做的话利润太低什么的,做过童鞋的可以帮我回应一下,我没有做过游戏工作室,没有概念。我只能给出几个基本的数据:钓鱼进行了加速,基本上鱼儿上钩那个消息一到,就开始了下一次甩杆动作了,省掉了收杆动作,具体的钓鱼次数我没有统计;试炼之地只打第一层,4500分装备大约4分40秒,5000分装备大约4分30秒,6000分装备大约4分20秒,这都是比较保守的数字;每条网线跑8个窗口,A那边的网费比较便宜,每条线每个月30左右;游戏工作室需要员工3人,加上A自己出货交易;基本上能够做到平价炼号,不赚不亏(脚本+满级号组队带,有工具配合);声明:我不卖辅助,不带队,不收徒弟,我只是一个外行游戏辅助外挂作者,今天与各位写辅助的同行分享一下自己的经历而已。身心俱疲,前言不搭后语,见谅。就说这些吧,诸君见仁见智,有意见使劲拍砖。相关阅读:
此文&&原创,转载请注明地址:
标签:&&&&&&
昵称(必填)
记住我,下次回复时不用重新输入个人信息
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
Post: 14:49:08
服了,都所到这份上了,一年才赚几十万。。。。
Post: 11:39:29
这个不是说不是谁的学生然后就全灯灭咯吗
Post: 9:16:44
Post: 1:15:42
本人急找一位会开发网页游戏辅助的大神
有意者请联系QQ
Post: 17:51:21
落后的技术了,现在这些bug都被游戏公司处理了,不实用了,不赚钱了,我现在搞LOL感觉还可以,就是睡眠少,每天睡三-四个小时,已经连续两年了,除了发现头晕,开车出过两次事故,其他的都还行,关键是要吃得好,我每天熬夜都吃牛排补充能量。学学我吧。
Post: 12:28:33
我现在在学游戏开发,这东西真的难,你学那么精,真的佩服,不过既然不收徒,也就罢手好了,留个QQ:,希望能够交流吧。
Post: 11:42:36
C+++技术指导 qq
Post: 18:18:00
唉,作者的确好累人,感觉新东西怎么学都不够,问题怎么处理都有,。。。
Post: 1:27:56
Post: 1:27:29
我想做徒弟,因为命运
Post: 11:09:11
作者还在吗 在的话联系我下 QQ 可以让你赚更多的钱
Post: 19:49:13
我是个苦逼的人,有一份低薪的工作,有几台机器挂点游戏补贴家用,每天承担着家庭的运行,希望大神带我飞。QQ
Post: 0:21:19
我也是做剑网3的 希望能用上你的辅助软件 现在外面的封号都太厉害了 QQ
Post: 19:52:10
可以加QQ,帮做个网游辅助吗?
Post: 11:48:40
作者能和我联系下吗?我的QQ,我可以让你干得更少,但赚得比以前更多更多
Post: 2:15:34
哎!你这样搞不累死才怪。现在我认识的搞游戏辅助的,很多都很少去搞端游了。基本页游。而且BUG好找。甚至很变态!
Post: 7:27:22
做这行的确很累.我也是一个团队里的,负责游戏内容的收集,数据记录和LUA的编写测试.几百个任务 几百个NPC ,记录的人都傻了.有空加个Q聊聊天吹吹牛
Post: 0:17:28
能教教小弟不
Post: 15:28:55
的确是这样, 那些代理, 感觉WG作者是神,
满面都是泪啊!
但是感觉你分成要的不高啊,
下面是对于
其他人说想学外挂的人说的,
比这个更废时间 WG
但是要学的东西
比正规编程 要学的东西多很多
Post: 17:51:34
如果这一行有一天会被定为非法,那必定是有你在添砖加瓦。在游戏公司眼里已经是非法的了。
Post: 13:53:23
我算是接触比较晚的,13年开始接触按键,后来学e,后来c++,现在c#,好吧,我都感觉自己有点不务正业了,然而到现在什么都没学精 (哭丧脸
Post: 17:23:17
你学这么多语言,何必?精一门就够赚钱了。我计算机专业毕业,去年下半年开始接触辅助,一直写易语言,感觉还可以。现在开发半内存辅助。至于C++,过两年再说吧。
Post: 16:18:13
亲,你开发的是哪些游戏的辅助啊,我也想投入辅助开发,求QQ交流学习
Post: 1:02:55
求拜师,嘿嘿。
Post: 1:03:09
Post: 16:33:53
大兄弟,我也用C#写 加个QQ 以后交流下
Post: 13:50:52
我靠这还叫外行.......你让更多的弱b情何以堪..不过作者的框架这个说法值得我学习,我也得弄一个便于自己开发其他游戏辅助
Post: 12:04:35
现在正在搞jx3,发现用到的技术70%的相似,但是我不会优化,这是软肋,羡慕大神
Post: 20:57:25
这才是真大神
Post: 20:28:14
难得一见的好文章,不做作,说的都是实话,羡慕技术帝!
Post: 20:03:22
这么牛逼的作者,还是外行,你让那些按键精灵的作者们情何以堪?
【相关文章】 18:0:40 12:9:7 17:8:8 19:43:45 17:5:31 17:25:58 10:35:19 18:6:40 10:21:33 17:50:0
站内搜索_游戏工作室项目
网游工作室_猜你喜欢
网游工作室_最热文章
备案号: 辽ICP备号-1
【NBE游戏工作室】我们一直被采集,但从未被超越!和NBE一起做吧。痛,并快乐着!!!亲朋棋牌辅助工具
《亲朋棋牌》拥有有麻将血战、血流成河、扯旋、斗地主、六人血战麻将、马股等具有浓厚四川地方文化特色的棋牌游戏,也有升级、四国军旗、中国象棋、围棋、五子棋、台球等国有特色的传统游戏,更有德州扑克等风靡世界的扑克游戏。《亲朋棋牌》以网络为情感纽带,棋牌为媒,益智会友,营造平等、和谐的网上快乐家园。
小编推荐专区:
最新专区推荐:
安全认证:金山通过瑞星通过卡巴通过江民通过
主要功能:自动区分左右座位自动识别蓝鲨,金鲨,魔鬼鱼,灯笼鱼可以选择范围和更改射速!重要提示:在使用亲朋棋牌辅助工具之前请认真阅读亲朋棋牌脚本使用说明。
安全认证:金山通过瑞星通过卡巴通过江民通过
主要功能:亲朋新马骨自动挤房、找位、分牌、踢出积分少的人。重要提示:在使用亲朋棋牌辅助工具之前请认真阅读亲朋棋牌脚本使用说明。
安全认证:金山通过瑞星通过卡巴通过江民通过
主要功能:亲朋牛牛自动挤房、找位、抢庄、压注、分牌。重要提示:在使用亲朋棋牌辅助工具之前请认真阅读亲朋棋牌脚本使用说明。
安全认证:金山通过瑞星通过卡巴通过江民通过
主要功能:亲朋棋牌台球游戏自动瞄准工具,一键启动、自动瞄准。重要提示:在使用亲朋棋牌辅助工具之前请认真阅读亲朋棋牌脚本使用说明。
安全认证:金山通过瑞星通过卡巴通过江民通过
自动区分左右座位!自动识别金鲨,蓝鲨,魔鬼鱼,灯笼鱼,海龟!可自定义设置低于多少子弹,自动购买子弹/结算!可自定义选择攻击范围和发炮速度!此软件操作方便快捷稳定,本人不保证能赚或者赔,只保证此软件有自动捕鱼功能,超时未发子弹自动打一炮,以防游戏自动能出,全天自动完美挂机。
安全认证:金山通过瑞星通过卡巴通过江民通过
亲朋棋牌牛牛自动点击开始,自动抢庄,自动下注,自动分牌。
安全认证:金山通过瑞星通过卡巴通过江民通过
1:自动分牌2:自动抢庄3:自动分牌4:自动踢人5:输赢一定分数自动换桌如果试用中有什么问题或建议请及时联系作者QQ
安全认证:金山通过瑞星通过卡巴通过江民通过
精心制做、强势推荐★亲朋棋牌辅助〓捕鱼〓牛牛〓详细的数据显示赚不赚一目了然〓可后台最小化〓包赚不赔〓更多功能持续增加
安全认证:金山通过瑞星通过卡巴通过江民通过
亲朋棋牌深海捕鱼,后台全自动捕鱼,不影响你聊天,看电影。自动选择倍数,自动购买子弹。自动识别潮水,节省子弹,节约子弹就是节省金币呀。
安全认证:金山通过瑞星通过卡巴通过江民通过
有什么不懂直接联系我QQ就好了
安全认证:金山通过瑞星通过卡巴通过江民通过
【亲朋棋牌连连看】【自动消除】【大玉儿】
安全认证:金山通过瑞星通过卡巴通过江民通过
还有什么好说的呢,试用一下呗。就是自动捕鱼了,还有自动把牛牛的牌分了,速度还是很快的。
安全认证:金山通过瑞星通过卡巴通过江民通过
设置抢庄或者不抢,设置随机下注,只压大,或者只压小。出牌后,自动分牌,不用你再计算分牌了。
安全认证:金山通过瑞星通过卡巴通过江民通过
本辅助支持,牛牛,新马股,十点半,十点半抢庄版,的抢位置。其它游戏功能,如有需要,请联系QQ
安全认证:金山通过瑞星通过卡巴通过江民通过
自动找座位自动分牌自动按照设置压分自动按照条件踢人自动换座位赢或者输一定数量退出游戏....不断优化中....
安全认证:金山通过瑞星通过卡巴通过江民通过
自动区分自己的位置自动识别金鲨、蓝鲨、魔鬼鱼、灯笼鱼、乌龟设置识别范围和攻击速度时间间隔自动购买子弹、自动结算子弹自动判断金钱于相应操作自动判断60秒未操作选择先打高分鱼或者先打低分鱼后续不算优化中....
安全认证:金山通过瑞星通过卡巴通过江民通过
可以随意开关游戏!掉线重连。自动找房间坐庄,T人,自动算牌,分牌。押注!
安全认证:金山通过瑞星通过卡巴通过江民通过
不懂的直接联系QQ博客访问: 1355688
博文数量: 288
博客积分: 2907
博客等级: 中校
技术积分: 1437
注册时间:
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Python/Ruby
好久没写技术相关的博文,这次写篇有意思的,关于一个有意思的游戏——QQ找茬,关于一种有意思的语音——Python,关于一个有意思的库——Qt。
这是一个用于QQ大家来找茬(美女找茬)的辅助外挂,开发的原因是看到老爸天天在玩这个游戏,分数是惨不忍睹的负4000多。他玩游戏有他的乐趣,并不很在意输赢,我做这个也只是自我娱乐,顺便讨他个好,毕竟我们搞编程的实在难有机会在父辈面前露露手。本来是想写个很简单的东西,但由于过程中老爸的多次嘲讽,逼得我不得不尽力完善,最后形成了一个小小的产品。
接触Python是2010年,相见恨晚,去年拿它写了些小玩意,离职前给前公司留下了一个Python+wxPython的工作工具,还挺受欢迎。换公司后努力学习C++&Qt,很后悔当初选择了wxPython而不是PyQt,没能一脉相承。使用Qt越久,不得不越来越喜欢,写这个东西正好就用上了。
话不多说,进入正题。这不是一篇完整的代码讲解,只是过程中的一些技术做个分享,包括后来被放弃的一些技术点。当初搜索这些东西也挺费力的,在这做个笔记,后来者也许能搜到收益。
先上个图:
话说这位是游戏中出镜最多的MM,和QQ什么关系啊?
辅助工具在游戏中增加了两个按钮,点击“对比”则自动找“茬”,用蓝色小框标识,点击“擦除”清除标识。
游戏窗口探查
这得用PyWin32库,它是对windows接口的Python封装,VC能做的它基本都行。
下载地址:,但不能直接点Download图标,不然下下来是一个Readme.txt,点“”寻找需要的版本。
#coding=gbk & import win32gui
game_hwnd = win32gui.FindWindow("#32770", "大家来找茬") print game_hwnd
QQ找茬是个对话框窗口,Class是“#32770”,这种窗口桌面上有很多,所以还配合了标题“大家来找茬”匹配,又因为是中文,所以第一行指定了使用gbk编码,否则要么找不到,要么运行出错。
游戏图片提取
提取图片采用了截屏的方式,找到窗口后将窗口提到最前,再作窗口截屏。截屏使用了大名鼎鼎的库。
import ImageGrab import win32con
win32gui.ShowWindow(game_hwnd, win32con.SW_RESTORE) # 强行显示界面后才好截图 win32gui.SetForegroundWindow(game_hwnd) # 将游戏窗口提到最前 & # 裁剪得到全图 game_rect = win32gui.GetWindowRect(game_hwnd)
src_image = ImageGrab.grab((game_rect[0] + 9, game_rect[1] + 190, game_rect[2] - 9, game_rect[1] + 190 + 450)) # src_image.show() & # 分别裁剪左右内容图片 left_box = (9, 0, 500, 450)
right_box = (517, 0, 517 + 500, 450)
image_left = src_image.crop(left_box)
image_right = src_image.crop(right_box) # image_left.show() # image_right.show()
上面用到的坐标都为为了演示代码简单填的,实际上使用了变量参数,而且要区分分辨率什么的。
PIL是一个强大的Python图形库(),待会的对比分析也须要用到。ImageGrab是PIL的一个模块,用于图像的抓取。不带参数的ImageGrab.grab()进行全屏截屏,返回一个Image对象,也可使用一个元组作为参数指定要截取的范围(左上与右下两点的坐标),这两种截屏都是不带鼠标指针的,还有一个ImageGrab.grabclipboard()可从系统剪贴板采集图像。
得到Image图像后可用show()方法,使用系统默认的图像查看工具打开,方便调试,也可以用save(filename)保存成文件,对应的可以Image.open(filename)打开获得。
grab得到了一个包含左右图片的Image对象后,用crop(box)方法可裁剪得到其中指定的区域,分别拿到左右两个游戏图片。
对比获得两图内容不同的区域
很自然想到把两图裁剪成N个小图片分别对比,左右统一区域对应的小图片不相等则为“茬”区,唯一的问题是怎么判断两个图片内容不一致?
一开始以为很会有些麻烦,直到发现了Image.histogram()函数,该函数用于得到图像的颜色直方图。我平常也爱好摄影,知道直方图可以表示一张图片中各种亮度(或颜色)的数量,两张自然图片的直方图基本是不一样的,除非两图对称、颜色一致但排列不一,但就算如此,将两图继续分割下去,其子图的直方图也会不一样。直方图就是一种图形到数值的转换,对比两图的颜色数值就可知是否存在差异。
一张用RBG颜色格式的图像,histogram()函数将返回一个长度为768的数组,第0-255表示红色的0-255,第256-511表色绿色的0-255,第512-767表色蓝色的0-255,数值表示该颜色像素的个数。因此,histogram()列表所有成员之和等于改图像的像素值
写了一个函数,用来获得两图比较的数值差:
def compare(image_a, image_b): '''返回两图的差异值
返回两图红绿蓝差值万分比之和''' histogram_a = image_a.histogram()
histogram_b = image_b.histogram() if len(histogram_a) != 768 or len(histogram_b) != 768: return None &
red_a = 0 red_b = 0 for i in xrange(0, 256):
red_a += histogram_a[i + 0] * i
red_b += histogram_b[i + 0] * i
diff_red = 0 if red_a + red_b > 0:
diff_red = abs(red_a - red_b) * 10000 / max(red_a, red_b)
green_a = 0 green_b = 0 for i in xrange(0, 256):
green_a += histogram_a[i + 256] * i
green_b += histogram_b[i + 256] * i
diff_green = 0 if green_a + green_b > 0:
diff_green = abs(green_a - green_b) * 10000 / max(green_a, green_b)
blue_a = 0 blue_b = 0 for i in xrange(0, 256):
blue_a += histogram_a[i + 512] * i
blue_b += histogram_b[i + 512] * i
diff_blue = 0 if blue_a + blue_b > 0:
diff_blue = abs(blue_a - blue_b) * 10000 / max(blue_a, blue_b)
& return diff_red, diff_green, diff_blue
将函数返回的红绿蓝差值相加,如果超过了预定定的阀值2000,则表示该区域不同。这个计算方式有点“土”,但对这次要解决的问题很有效,就没再继续改进。
#将左右大图裁剪成多个小图分别进行对比 result = [[0 for a in xrange(0, 50)] for b in xrange(0, 45)] for col in xrange(0, 50):
& & for row in xrange(0, 45):
& & & & clip_box = (col * 10, row * 10, (col + 1) * 10, (row + 1) * 10)
& & & & clip_image_left = image_left.crop(clip_box)
& & & & clip_image_right = image_right.crop(clip_box)
& & & & clip_diff = self.compare(clip_image_left, clip_image_right)
& & & & if sum(clip_diff) > 2000:
& & & & & & result[row][col] = 1
大图是500x450,分隔成10x10的小块,定义一个50x45的二位数组存储结果,分别比较后将差值大于阀值的数组区域标记为1.
在游戏上标记两边不同的区域
最初我用了PyWin32的一些函数,获得游戏窗口句柄后直接在上面绘制,但我不太熟悉Windows编程,不知道如何解决游戏自身重绘后将我的标记擦除的问题,然后搬来了Qt。用Qt创建了一个和游戏大小一样透明的QWidget窗口,叠加在游戏窗口上,用遮罩来绘制标记。标记数据已记录在result数组中,在指定的位置绘制一个方格则表示该区域左右不同,要注意两个方格间的边界不要绘制,避免格子太多干扰了游戏。除标记外,还绘制了两个按钮来触发对比与擦除。
def paintEvent(self, event): # 重置遮罩图像 self.pixmap.fill()
& # 创建绘制用的QPainter,笔画粗细为2像素 # 事先已经在Qt窗体上铺了一个蓝色的背景图片,因此投过遮罩图案看下去标记线条是蓝色的 p = QPainter(self.pixmap)
p.setPen(QPen(QBrush(QColor(0, 0, 0)), 2))
& for row in xrange(len(self.result)): for col in xrange(len(self.result[0])): if self.result[row][col] != 0: # 定一个基点,避免算数太难看 base_l_x = self.ANCHOR_LEFT_X + self.CLIP_WIDTH * col
base_r_x = self.ANCHOR_RIGHT_X + self.CLIP_WIDTH * col
base_y = self.ANCHOR_Y + self.CLIP_HEIGHT * row
& if row == 0 or self.result[row - 1][col] == 0: # 如果是第一行,或者上面的格子为空,画一条上边 p.drawLine(base_l_x, base_y, base_l_x + self.CLIP_WIDTH, base_y)
p.drawLine(base_r_x, base_y, base_r_x + self.CLIP_WIDTH, base_y) if row == len(self.result) - 1 or self.result[row + 1][col] == 0: # 如果是最后一行,或者下面的格子为空,画一条下边 p.drawLine(base_l_x, base_y + self.CLIP_HEIGHT, base_l_x + self.CLIP_WIDTH, base_y + self.CLIP_HEIGHT)
p.drawLine(base_r_x, base_y + self.CLIP_HEIGHT, base_r_x + self.CLIP_WIDTH, base_y + self.CLIP_HEIGHT) if col == 0 or self.result[row][col - 1] == 0: # 如果是第一列,或者左边的格子为空,画一条左边 p.drawLine(base_l_x, base_y, base_l_x, base_y + self.CLIP_HEIGHT)
p.drawLine(base_r_x, base_y, base_r_x, base_y + self.CLIP_HEIGHT) if col == len(self.result[0]) - 1 or self.result[row][col + 1] == 0: # 如果是第一列,或者右边的格子为空,画一条右边 p.drawLine(base_l_x + self.CLIP_WIDTH, base_y, base_l_x + self.CLIP_WIDTH, base_y + self.CLIP_HEIGHT)
p.drawLine(base_r_x + self.CLIP_WIDTH, base_y, base_r_x + self.CLIP_WIDTH, base_y + self.CLIP_HEIGHT)
& # 在遮罩上绘制按钮区域,避免按钮被遮罩挡住看不见 p.fillRect(self.btn_compare.geometry(), QBrush(QColor(0, 0, 0)))
p.fillRect(self.btn_toggle.geometry(), QBrush(QColor(0, 0, 0)))
& # 将遮罩图像作为遮罩 self.setMask(QBitmap(self.pixmap))
这里我没有替换变量,太麻烦了,能看清楚算法就行。
让PyQt程序在任务栏隐藏
为了让PyQt程序不出现在任务栏,构造QWidget设置了这些属性
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Popup | Qt.Tool)
让PyQt程序加入系统托盘、资源文件使用
PyQt添加托盘菜单非常容易,几行代码就可以
# 创建托盘 self.icon = QIcon(":\icon.png")
& self.trayIcon = QSystemTrayIcon(self) self.trayIcon.setIcon(self.icon) self.trayIcon.setToolTip(u"QQ找茬助手") self.trayIcon.show()
& # 托盘气泡消息 self.trayIcon.showMessage(u"QQ找茬助手", u"QQ找茬助手已经待命,进入游戏即可激活")
& # 托盘菜单 self.action = QAction(u"退出QQ找茬助手", self, triggered = sys.exit) # 触发点击后调用sys.exit()命令,即退出 self.menu = QMenu(self) self.menu.addAction(self.action) self.trayIcon.setContextMenu(self.menu)
最初我是用的托盘图标是一个.ico文件,执行脚本可以正常显示,但打包成exe后执行在托盘上显示为一个空白图标,用Python的idle工具编译运行也是空白。尝试多次后发现:PyQt的托盘图标不能使用.ico文件,否则会显示空白,换成png格式素材就没问题!
PyQt资源文件打包
Qt使用一个.qrc格式的xml文件管理素材,代码用可用:\xxx\xxx.png的方式引用资源文件中的素材,这在PyQt中同样支持。
这里我创建了一个resources.qrc文件
阅读(8183) | 评论(2) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
现在的人是怎么了!!!别人写的博客,明明是转载,还不注明原文地址,格式错误还一大堆!我去!实在是看不下去了!附上原文http://cpiz.net/blog/2012/03/a_qq_zhaocha_assistant_by_python/
不错,赞一个!
请登录后评论。}

我要回帖

更多关于 vn怎么玩求高手指点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信