自制按键精灵

Reboot

Posted by 木木的木头 on May 25, 2019

项目地址(已经闭源)

由来

之前想给手游写一套很牛逼的自动化控制脚本,能够实现自动领任务,自动寻路,找怪,打怪。。。以前一直用按键精灵写简单的游戏脚本,但是按键精灵底层不够稳定,经常死掉无响应,而且按键精灵网络通信基本等于残废。于是我决定自己从轮子开始开发。

大致架构

首先,领任务,找怪。。。这些肯定得用上文字识别,在寻找很久后,最终用了cnocr 这个项目基于MXNet网络训练,并且部署及其简单。在识别率和速度上面都完全满足游戏脚本开发,我将其用django包裹成了restapi以供脚本调用。

屏幕监控方面,使用的android的录屏实现,屏幕每次从新渲染都会更新记录到内存,因此有些低配手机可能会卡顿。但是如果不保存每次的屏幕可能会造成找图慢和找图延迟(按键精灵就是这样)。

模拟点击和输入,为了实现这个我花了很多时间,我反编译了按键精灵,看了他的实现,也在网上找了很多别人的实现。但是都没有找到合适的方法。最终,我使用了android的Instrumentation实现。使用了xposed的hook功能, 拦截修改了系统权限检测函数,从而实现全局的按键点击。

找图功能,我第一想法是引入opencv,使用opencv的模板匹配来找图,但是实际使用发现opencv太大了,用在这里不太适合。于是我自己实现了一个找图功能(其实相当于按键精灵的多点找色)。出于性能的考虑,没有实现图片匹配功能, 其实按键精灵也是滑动窗口的方法找图的,性能并不好,另外实际游戏脚本开发中找图并不好用,各种屏幕尺寸会造成各种适配问题。为此得每种屏幕都做截图,非常麻烦。

到这里,整个项目基本功能都实现了,但是!尝试进行脚本开发后发现使用java代码开发很不方便,每次改动都得重新编译安装,安装过程中游戏会处于后台,可能被杀死。于是我引入了lua脚本到程序中,使用lua脚本来控制程序。 从而每次改动只需要重新推lua脚本到手机上,然后就能重新运行测试。

引入lua脚本参考了Android-Lua项目。

引入lua脚本后,我把常用的几个功能写成了lua的全局函数,注入到了lua运行时中,在lua脚本中可以直接调用。

目前支持函数:

1.Lua语言提供的自带函数,有哪些请参考Lua官网

2.找图函数 findMulPoint(string t)

findMulPoint("0,0,0,0,\"FFFFFF\",\"36|14|1E1EE9,54|24|FFFFFF,69|24|000000")  

和按键精灵的多点找图相似,前4个数字表示需要查找的区域(左上到右下),后面一个是颜色的第一个坐标,再后面是颜色和第一个颜色的偏移位置+颜色的色值。提示,这个多点找色特征值可以使用按键精灵的工具制作(删掉最后的颜色偏差),也可以使用我提供的python脚本制作,但是我的工具很简陋。

3.日志输出loge(string log)

loge("hello")

输出错误日志。使用的android Log.e输入,因此,你需要连接adb才能看到错误输出。

4.单行文字识别singeLineOcr(int x1,int y1,int x2,int y2)

singeLineOcr(x1,y1,x2,y2)

识别一个区域(参数为左上到右下的坐标)内的文字,这个文字必须是单行的(其实可以支持多行,但是我不需要,没有实现)。

5.暂停sleep(int i)

sleep(int i)

使脚本停止i毫秒

6.触摸屏幕某个点tap(int x,int y)

tap(int x,int y)

点击屏幕(x,y)坐标

到此。大喊一声,真tm完美!终于,把轮子造完了。我可以开始开发我的手游程序了。但是,轮子造完我已经不想玩以前那手游了。emmmmmm,我这里把我造的轮子开源出来吧,有需要的老哥自取。(滑稽)