教你用android玩冲顶大会——实现几个小时的财务自由
2018-01-19 本文已影响4023人
何时夕
最近答题类app比较火,玩了几把之后想到为什么不用技术来查找答案呢?因此搞了一款辅助app,能够帮助大家直接搜索答案.经过两天的开发和三天的测试,终于让我的冲顶率达到了80%左右,先上几个不错的战绩装个逼.
一.用app去冲顶
这一节是教大家如何使用app的,如果对使用app不感兴趣,想了解技术的同学,可以直接去第二节,新建了一个辅助交流QQ群:314100393,大家有问题可以来这个群里问。
1.让app跑起来
- 安装app。点击下载app
- 进入手机的文件管理器,在本app的cache目录下面新建 tessdata目录 和 ShotImage目录。例如我的小米Mix2的目录是:Android/data/com.example.whensunet.chongdingdahui/cache
- 将chi_sim.traineddata文件放入上面新建的tessdata文件夹中,这个文件是ocr识别的语言库,没有的话就只能查找题干,不能查找选项。点击下载语言库
- 在 设置—>无障碍/辅助功能—>WhenSunsetBaiWanYinXiongFuZhu中点击开启,开启app的服务。
- 下载夸克浏览器,这个浏览器比较轻便,能够减少查找答案的时间
- 打开app,同意所有权限要求,点击屏幕上的按钮,选择搜索引擎
- 此时只要点击本app或冲顶大会的app的任意按钮,就会跳转到夸克浏览器对按钮的内容或者题干+按钮内容进行搜索 ,点击屏幕最底端到屏幕最底端上升500像素内的按钮会直接搜索题干。
- 如果无效请 进入设置中找到 app的权限界面,然后开启所有权限。
- 本app目前适配了mi5、mix2、谷歌nexus5和小米Max,适用于5.0以上的android系统,其他手机可能不能搜索按钮内容,但是题干一般情况下所有手机都能搜索。
2.举个例子
以冲顶大会app来举个例子
- 点击2区域中任意选项按钮,将会搜索题目+选项内容
- 注意需要让弹幕处于静止状态,要不然可能会搜索到错误答案。
- 如果要单独搜索题干,那么需要在3区域点击右下角的按钮,将3区域的输入框唤出并将其限制在3区域中,最后点击输入框,这样就能搜索题干了。
3.冲顶经验
经过3天的测试,我的冲顶率已经达到了80%左右,所以分享几个使用辅助的经验。
- 12道题目中一般会有10题是只需要搜索题干的
- 一般来说可以准备两只手机,一只运行速度快的手机进行答案的搜索,再搜索到答案之后先帮另一只手机选择答案,然后点击返回键回到本手机的冲顶大会选择答案。
- 比较难的场次会有1-2道需要查询选项的题目,此时需要两到三个人,每个人查一个选项,这样能够确保总结出最后的正确答案。
- 一般来说ios系统的直播速度比android系统慢2-3秒,可以利用好这个时间差,延长找答案的时间。建议第二只手机使用iphone或者ipad。
- 建议如果两个人搜索答案的话,可以一个人使用谷歌搜索,一个人使用百度搜索。
二.app用到的技术解析
本节是对本app使用到的技术进行解析,没有兴趣的同学可以直接跳过.
1.需要实现的功能分析
- 监听冲顶大会app在前台的时候,我们点击按钮的事件
- 获取到被点击按钮的文字内容。
- 如果不能获取被点击按钮的文字内容,需要使用ocr技术,对图片进行文字解析
- 为了在3的情况下获取到图片,我们需要在运行后台service的时候对屏幕进行截图
- 获取到查找内容之后拼接搜索引擎的url,调起浏览器
2.确定了需求之后要使用的技术
1.使用android内置的无障碍服务可以实现监听冲顶大会app的各种事件。
2.我测试的时候发现,冲顶大会做了某些处理,使得不能通过无障碍来获取选项按钮的文字内容,只能获取该view的区域。此时我就想到额使用ocr技术,来识别该区域的文字。具体的库是tess-two,这是一个c++的库,需要开发者自己编译出so文件。然后调用java层的api,来实现ocr识别。
3.在运行在后台的情况下,对屏幕进行截图。这里5.0起的android系统提供了MediaProjection这个api,能够获取当前屏幕的帧。至于5.0以下需要root才能在后台进行屏幕截图,所以就放弃了。
4.可以通过Intent和浏览器包名,调起指定浏览器。这里我用了比较简洁快速的夸克浏览器。
3.代码详解
因为某些原因,打算过一段时间之后再放出源码,所以这里就讲解一下,app整个运行流程.当然我放出的apk是debug版,大家如果会反编译的话,还是能看见源码的
- 首先是在MainActivity中初始化一些东西
- 初始化tess-two的库
- 向用户请求无障碍和屏幕截图的权限
- 运行无障碍service
- 1结束之后,此时无障碍service已经运行起来了,当我们点击冲顶大会的一个按钮的时候
- 进入了onAccessibilityEvent()方法。
onAccessibilityEvent
- 进入了按钮点击的事件
- 获取题干信息,这里我们需要注意到的问题是,冲顶大会的题干是不可点击的,所以在getQuestionRecursion方法中我会获取到,当前界面的Root View树的结构,然后递归寻找每个view中符合题干特征的文字.(这里需要大家对 view的绘制原理和view树的结构有一定的了解)
getQuestionRecursion
- 方法传入的getRootInActiveWindow()是获取到当前屏幕上面window的view树结构
- 可以看见方法内部就是对view树进行递归查找
- 判断点击区域是否在只查询题干的区域,有了题干信息我们还需要判断,查的是题干还是选项。所以我规定了只要点击了屏幕上某个区域的按钮,那么就是要对题干进行查询。(细心的同学会发现,这个区域就是我前面提到的 屏幕底部 到 底部向上500像素的区域。)getIsSearchQuestion方法内部如图
getIsSearchQuestion
- 内部的结构很简单,仅仅是比较当前点击的view的区域,是否在我规定的区域内部
- 如果3中返回的字符串不为空,就表示我们需要直接查询题干,此时直接调起夸克浏览器,否则就要识别点击的view区域的图像,来对选项进行查询,这里我们就只讲ocr识别的部分。useOcrToSearch方法内部如图
useOcrToSearch
- 这里的代码也很简单,构造MediaProjection。
- 通过MediaProjection获取一个VirtualDisplay并将ImageReader的Surface放入。
- 此时ImageReader中每时每刻都会暂存一张当前屏幕的图片。
- 接下来就是处理截图,然后进行ocr识别了,这里使用了AsyncTask在其他线程执行操作。
- 前面我们都知道了怎么获取view的区域—————一个Rect,使用这个我们就可以将点击的按钮的区域变成一个bitmap
- 有了view区域的图片,就可以直接调用tess-two的java api来进行ocr了。
- 最后我们终于获取到了选项的内容,此时就可以调起浏览器进行搜索了。速度挺快的,我的mi5识别起来在500毫秒内,网好的情况下从点击到显示查找界面不会超过1.5秒。
- 进入了onAccessibilityEvent()方法。
onAccessibilityEvent
三.总结
- 大家可能会问,为什么这个app不是百万英雄的辅助,其实有两个原因:
- 百万英雄玩的人太多,每场能分的钱等级分化太严重。冲顶大会总的奖金少,但是奖金比较平均。
- 其实上面一个原因是屁话,哈哈。最开始本app是针对百万英雄的辅助,但是头条毕竟是大厂,技术还是很好的。可能是为了防止作弊吧,西瓜视频的无障碍功能被禁止了 ,所以只能先用冲顶大会试试水。但是目前我已经找到了百万英雄的漏洞,或许下一次博客就是百万英雄的辅助介绍了,大家如果想知道的话,要多多关注我哈。
- 在简书上写了一年多的博客,终于混了一个简书程序员优秀作者的称号,还是多靠了大家的捧场,接下还会发表更多关于android的高质量文章,如果大家觉得有帮助希望能多多点赞。
- 最后,用了本app的同学,如果冲顶成功了,别忘了发红包哈,嘿嘿!