让它自己跳吧 -- 微信小游戏跳一跳 (2)

Github 上的跳一跳外挂层出不穷,最多都破万星了。一周破万,能吹好久了。

这些挂大部分都实现了自动跳跃的功能,原理是利用adb截图,识别出棋子底部中点和方块中点,算出距离,进而算出时间,再利用adb模拟点击事件,iOS 也能利用Facebook的一个测试框架实现类似的功能,不过都要连着跳数据线。

那能不能把上次做得辅助点击弄成自动跳跃呢?当然能!

OpenCV

最受欢迎那个项目并没有使用OpenCV进行图像识别,虽然它的依赖里有OpenCV的库。它只是使用了Python的Image这个库来分析图像,边缘检测通过判断图片RGB变化来完成,相当“原生态”,不过对这个游戏来说也够了。

OpenCV用C++语言编写一个计算机视觉库,可以用来对视频或图像进行各种操作分析。跟对OpenGL的认识差不多,之前我对它了解也就仅限于以上的这句话了。

模板匹配

  • 识别棋子

这个游戏里的方块有很多种,大小形状不一,但棋子除了在蓄力和跳跃过程中,其余时候都是一样的,此处要有图

2018-01-07-piece_template

使用OpenCV的模板匹配就可以很用获得棋子底部位置了。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 待检测图片
(UIImage *)boardImage = [UIImage imageNama:@"boardImage"];
cv::Mat boardMat = [UIImage cvMatFromUIImage:boardImage];
// 抠出来的棋子
UIImage *pieceImage = [UIImage imageNama:@"pieceImage"];
cv::Mat pieceMat = [UIImage cvMatFromUIImage:pieceImage];
// 灰度处理
cv::Mat boardMatGreyMat;
cv::cvtColor(boardMat, boardMatGreyMat, CV_BGR2GRAY);
cv::Mat pieceMatGreyMat;
cv::cvtColor(pieceMat, pieceMatGreyMat, CV_BGR2GRAY);

int result_rows = boardMat.rows;
int result_cols = boardMat.cols;
// 要返回的结果
float piece_certer_X=0, piece_certer_Y=0;
float body_certer_X=0, body_certer_Y=0;
// 棋子匹配
cv::Mat resultMat = cv::Mat(result_cols,result_rows,CV_32FC1);
cv::matchTemplate(boardMatGreyMat, pieceMatGreyMat, resultMat, cv::TM_CCOEFF_NORMED);
// 获取匹配结果
double minVal, maxVal;
cv::Point minLoc, maxLoc, matchLoc;
cv::minMaxLoc( resultMat, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat());

cv::Mat 是用来存储图片像素信息的,UIImage与cv::Mat互转的封装有很多,这里就不贴了,搜个UIImage的分类就好。

需要注意的是,模板匹配使用的图要用 jpg格式的,用 png 得出的准确率很低,估计跟png的透明通道有关。

  • 识别白点

当跳到中心时,下一方块是会出现白点的,这要要有图

2018-01-07-demo1

依葫芦画瓢,继续检测白点位置即可。

边缘检测

方块白点不一定有,第一步肯定没白点,这时就要边缘检测了。

代码如下

1
2
3
4
cv::Mat boardGaussianBlurMat;
cv::GaussianBlur(boardMatGreyMat, boardGaussianBlurMat, cv::Size(3,3), 0);
cv::Mat resultCannyMat;
cv::Canny(boardGaussianBlurMat, resultCannyMat, 1, 10);

先对灰度化后的带检测图片进行高斯模糊,使用图像更加平滑,在进行边缘检测,得出的图大概像这样的

2018-01-07-31515337968_.pic

为了检测方块更加准确,会把棋子去掉

1
2
3
4
5
for (int i=maxLoc.y-10; i<maxLoc.y+pieceMat.rows+10; i++) {
for (int j=maxLoc.x-5; j<maxLoc.x+pieceMat.cols+5; j++) {
resultCannyMat.at<u_char>(i, j) = 0;
}
}

2018-01-07-41515337968_.pic

至此,识别就差不多了,剩下就是些计算和界面搭建的工作了

防反作弊

自从上次源码泄露事件后,跳一跳开始做一些反作弊的举措了,或者说加强了反作弊。

先看看抓包数据

1
2
3
4
5
6
7
{
"base_req": {
"session_id": "arCQAJOCBxx9pMqd47rcu4uCg34NJuF5NY1jpRBjs8pChhNWrAJwsoK5BZYkfvUTn4q3RW5RTo0ggyIo3Z0CGhYitWx8ovjpk9LiQ1aREp52y9gziuufqxBEJzOPH+PqozUAqAHVY0FYNf6K24DOXQ==",
"fast": 1
},
"action_data": "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"
}

这是用户每次打破自己记录时会发送的一段 json,可以看到里面有个 action_data字段,是一串加密过的字符串,猜测是微信记录的一些用户交互数据。

可以从这几方面入手

  • 棋子连续落在物块中点次数
  • 点击时间间隔
  • 点击位置变化

那么要防反作弊,就要降低连续中点的概率,每次模拟点击事件间隔随机,位置随机,即touchstart和touchend的point随机

已在cydia发布插件,添加源 http://apt.sephilex.com 搜跳一跳即可