JS写小游戏「跳一跳」外挂之自己动

上篇文章写道怎么通过Canvas识别跳转位置,本篇文章重点介绍怎样使用adb命令操作「小人」自己挑动。

adb是什么

adb是Andorid Debug Bridge,可以将安卓手机打开USB调试模式,然后连接USB线到电脑,就可以通过adb执行调试命令。

adb安装

mac下面使用brew安装

brew cask install android-platform-tools

windows下面去搜索下载,然后放到环境变量里面去,保证命令行执行adb可以成功。

测试连接成功

使用adb devices查看是否连接成功,如果连接成功会出现设备的编号。

小人跳转需要的命令

整个自动跳动的流程是这样的:

  1. 调用adb命令获取手机当前屏幕截图
  2. 拉取截图到本地路径
  3. 通过js读取图片分析中心点位置计算跳转需要按压时长
  4. 同adb命令发送长按命令

通过node的child_process核心代码执行adb的命令如下:

//截屏,放到sdcard的根目录下
adb shell screencap -p /sdcard/screencap.png
//拉取截图图片到本地电脑
//   将remote路径的图片拉取到本地的路径
adb pull ${SCREENCAP_REMOTE_PATH} ${SCREENCAP_PATH}/screencap.png
//发起长按,swipe后面是开始和结束的手指位置坐标,timeout是时长
adb shell input swipe ${r + 10} ${r + 20} ${r - 10} ${r - 2} ${timeout}

特殊说明

2.04是跳转系数,这个是从其他代码里面直接拿过来的,对应的是720宽度的手机会比较准确,可能不同的手机dpi和屏幕宽度会有不同的值,具体实践中需要根据自己手机情况调整一下。

我在红米4手机上面可以轻松几乎每次都是中心点,轻松过千。

可以看下面的红米机器的视频:

https://v.qq.com/x/page/t1331wmep7e.html

JS写小游戏「跳一跳」外挂之Canvas图像识别

17年结尾的时候微信发布新版重点推出了「小游戏」概念,H5的游戏再次火了起来,新版微信开屏的游戏就是「跳一跳」游戏可玩度很高,网上也出现了各种语言版本的外挂,前几天看到一篇用nodejs搭建的外挂,需要手动点击截屏图片来判断当前和下一步的位置然后跳转,于是就起了用Canvas来实现图像的想法,后面有实现了自动跳转,算是齐活了。今天来完整说下图像识别。

代码都放到了:https://github.com/ksky521/wechat-jump-game-hack 欢迎自己去尝试

先来看最终效果视频:https://v.qq.com/x/page/o1331igmskh.html

Canvas图像处理的原理

Canvas可以通过drawImage在上面添加图片,然后通过getImageData方法获取一个imageData对象,此对象包括了datawidthheight,其中data为图片widthheight4长度的数组,每个像素点表现在数组内为:RGBA四个0~255的值,即Red、Green、Blue和Alpha值。

通过对这个imageData.data进行遍历操作,可以利用图像差值比较找出图片内物体的边缘、物体的中心点,也可以根据图像中某个固定颜色范围的物体,进行匹配,从而找到「小人」的位置。

颜色值差值比较函数

先介绍一个函数tolerenceHelper,用来比较颜色差值,即传入需要比较的rgb,然后跟对比的rtgtbt和差值范围的t进行对比的函数,在范围内则返回true

function tolerenceHelper(r, g, b, rt, gt, bt, t) {
    return r > rt - t && r < rt + t 
            && g > gt - t && g < gt + t 
            && b > bt - t && b < bt + t;
}

获取小人当前位置

小人获取位置用的方式是差值比较,首先通过截屏中的紫色小人颜色范围,可以大致拿到小人的颜色值为:

// 小人的颜色值
const playerR = 40;
const playerG = 43;
const playerB = 86;