其实做一个游戏辅助脚本的过程也是一种对python的学习过程,在开发过程中,也学习到了不少,对python的认识也增加不少。下面是我写脚本的整个心路历程……(跳过心路历程可以到下面技术躺坑篇)
round 1:
以前玩过两次梦幻,都是三开,这次重新玩,开始对打图,运镖,抓鬼等等这些重复度非常高又无聊到爆炸的任务感到烦厌,所以就打起了辅助工具的念头,所以就很简单的开了个按键精灵点点点(其实学按键精灵的脚本和写打图、运镖、抓鬼、秘境、门派等等脚本也花了一定的时间……),就这样version1版本就出来了,也是可以正常使用的(先不说功能多强大啦,反正能自动化运行就是了)。
round 2:
看到群上有人说用按键很容易被封号,而且常规外挂也很容易被抓,我心想作为程序员为什么我不直接自己写脚本呢。然后就在平时开发的电脑上研究了,研究了不到10分钟,就打通了第一个关键技术【模拟鼠标点击】和第二个关键技术【屏幕取色】,使用pymouse就可以模拟鼠标点击,使用PIL.ImageGrab就可以根据坐标点屏幕取色……至此,我在按键精灵需要用到的功能,这边都可以实现了。所以我后悔了,一早就用python来写(本来就会一点),比花时间学那按键精灵脚本来得快太多了。 然后花了半小时时间把按键精灵的功能移植过来,至此version2版本就出来了。
round 3:
把脚本放到用来挂机的破旧电脑上(N年前的电脑了=。=!),一运行,找不到模块库,pip走起~ 结果就是各种安装报错……去官网下载python2.x,python3.x各种安装尝试都不成功,最后发现原来是 墙 的原因……根本下载不下来。 最后用清华和阿里云的镜像地址安装的。
千身万苦安装成功了,缺发现自动点击点游戏外的窗口或者文件都没问题,游戏内点击没反应,研究了一波原来是权限不够,用管理员权限运行终于能点击到游戏内的东西了。
round 4:
辅助脚本能正常运行了,就对其进行了一波优化和功能更新,优化方案就是防止被检测出来呗,主要就是点击时加入随机值,让每一下点击都不在同一个坐标点上,然后时间间隔之间也加上随机值,最后就在某些步骤加入更多拟人化的模拟操作。功能更新就是加入了“一条龙”以及商城自动抢东西功能(PS:商城抢东西真是个发财致富的好功能……)。至此,version3版本出来了……
round 5:
上面4回合,都是自己想自己做的,没参考过别人,用起来也发现了很多不舒服的地方,因为我是双开(两个电脑客户端嘛),所以一个脚本同时控制两边,只能说运镖两边一起运,不能左边运镖右边打图(因为某些步骤要sleep,sleep了之后另外一边自然动不了了)。 而且之前都是在一个python文件上写的(本来打算玩玩没认真,结果越写越多功能越来越强……)。 果断重构了一波,按照不同的功能分开多个python文件,然后每执行一项任务都开条线程来执行,不影响主线程操作。 至此,version4版本出来了……
round6:
几天过后,我用着辅助脚本,又不爽了……继续改!这次的目标是增加UI界面,增加图片识别。 只是做简单的UI界面,所以选用了Tkinter这个简单的库来做,也没专门去学,上手直接写!要用到哪个控件直接查他有什么方法就完事了。写UI界面倒是没什么难点卡着,倒是用来挂机的旧电脑又出幺蛾子了,再次各种报错! 最后发现……坑!原来老电脑上的python我用2.x 要用“Tkinter”注意首字母!而开发的电脑用的是tkinter也能正常运行! 至于图片识别也花了一点时间(虽然现在效果不理想,不太满意,之后可能会继续研究其他图片识别方法),制作思路放在技术篇第五点了。至此有UI界面的version5版本出来了……
round7:
因为要做很多第三方库,如果换台电脑设备什么的,就要把整个python环境重新配一遍,实在太麻烦了,所以这次就是把辅助打包成exe,以后换啥电脑,带个exe就可以用了,方便快捷【技术篇第七点】。 另外,由于图片识别的效果不理想,最后还是改回用像素点识别了,只是在原来单点识别的基础上改成多点识别,让命中率更高。
round8:
一个小优化。之前是睡觉前打开商城界面挂机,等时间到了就开始抢东西。后来心想,正常玩家是不会打开商城界面几小时不动的(辅助肯定尽可能模拟玩家操作啦),所以我就在每次抢完东西之后关闭商城界面,然后等下次开始抢时才打开界面。可是……在不同的界面(战斗界面和非战斗界面)打开商城点击屏幕的步骤是不同的!最后,又用了新的方法,不通过鼠标点击屏幕而通过快捷键(alt+a)的方式来打开商城,实现在任何界面都可以准确的打开商城。 为此我还改了电脑微信的截图快捷键!因为它的优先级比梦幻高!
-------------------------------------------------------------- 技术篇------------------------------------------------------------
1.国内网路使用pip很难安装到python的库,可以用第三方的镜像地址下载,会相对容易很多。下面是部分镜像地址:
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
在原来的pip命令后加上 -i https://pypi.tuna.tsinghua.edu.cn/simple 就可以去清华的镜像下载库了。
2.pymouse库做自动点击操作的,脚本最好使用管理员权限运行,不然可能很多东西权限不够,鼠标点不下去。
3.使用PIL.ImageGrab可以实现屏幕取色功能。
4.UI界面,使用Tkinter库来制作简单的UI界面,无需太多学习成本,要用到哪个控件直接查就完事了。注意一个坑,python3.x是“from tkinter import *” ,而python2.x是“from Tkinter import *”。 注意“t”字母的大小写!!!就因为这个我卡了很久=。=!
5.图片识别使用了PIL和cv2两个库。第一个坑就是安装cv2这个库,直接“pip install opencv-python”会报错,后来百度了一番后,发现要指定一个老一点的版本,就可以安装了,使用命令:“pip install opencv-python==4.1.1.26‘。第二个坑就是PIL只是python2.x的库,所以python3.x上找不到这个库,可以安装pillow这个库,功能基本和PIL一样。
第一步就是简单的使用PIL的方法,把屏幕某部分截图保存下来(用来与你想要寻找的图片来做对比),截图后和你想要对比的图进行对比,对比过程如下:
1.把图片缩放为8*8
2.转为256阶灰度图
3.计算灰度图的平均值
4.比平均值大的记录为1,相反记录为0,生成一串64位的码。
最后就是对比两张图的64位码,有多少位不一样来确定图片的相似度。
如果两张图片相似,证明游戏界面弹出了你想要的界面,可以继续进行后续的指令步骤了。不过梦幻西游手游的PC端我暂时没办法设置分辨率,手动拖窗口改变分辨率没办法让窗口大小每次都一样,窗口大小不同(哪怕差几个像素)截图出来的图片和要比较的图片64位码比较差别也较大,所以暂时这种图片识别方式还没像素识别效果好。
6.使用pynput.keyboard监听接受键盘输入。方便制作类似按键精灵F12停止之类的功能,毕竟例如疯狂点击鼠标的功能一旦开始需要有个用键盘来停止点击的功能。
7.打包exe使用的工具是pyinstaller,建议使用时使用参数 -F,把所有东西都打包到exe里面。然后躺的第一个小坑就是打包路径不能有中文目录。 接着还有个大坑,至今还没很好的办法去解决。 就是当我们直接运行python脚本时,代码能正常运行的。 可打包成exe后,就各种报错了,原因是各种第三方库的版本不对应。就像这次我报错是报在“from pynput.keyboard import Key,Listener”,可我不知道是pyinstaller的版本不对还是pynput的版本不对呀,我首要目标定在了pyinstaller,然后装了3.6版,2.0版等……出现不同的报错,最后降低了pynput的版本才最终把exe运行起来。 所有的库我都是用pip直接安装的(原本我以为会自动匹配合适的第三方库版本,可有时又要手动指定版本来安装比较低版本的第三方库)。 至今我还没很好的解决办法来确定应该怎么选择第三方库的版本,只能用最笨的办法,出了问题,去第三方库官网查一下那些版本信息再来确定版本……
8.使用pykeyboard来模拟键盘输入。
暂时用到的库有下面这些:
import threading # 开线程
import random # 随机数
import time # 时间模块
import os
from pymouse import * # 模拟鼠标输入
from pykeyboard import * # 模拟键盘输入
import pyautogui as pag # 获取鼠标当前位置
import PIL.ImageGrab # 获取屏幕像素
from pynput.keyboard import Key,Listener # 获取键盘输入
from Tkinter import * # UI界面制作
from PIL import Image, ImageGrab # 截图&图片处理
import cv2 # 图片处理
【python|游戏辅助脚本开发之旅】看过淘宝的辅助截图,功能无比强大,我这个简直简陋的不要不要的……
反正一天不封号,一天不停步!优化还在继续中,to be continued……
推荐阅读
- java|LeetCode(561. Array Partition(数组分割))
- Python基础语法|leetcode 961. 重复N次的元素(python)
- 数据库|30 道 MySQL 面试题全放送!
- 算法与数据结构|Leetcode0720. 词典中最长的单词(simple)
- python中 if条件语句的作用和语法、注意事项
- 万能的list列表,python中的堆栈、队列实现全靠它!
- Python中的if...else语法、作用和执行流程
- Python中的 多重判断的语法/作用、执行流程、代码实例
- 《Python零基础入门与进阶》系列专栏完结