前言:

最近需要在手机APP上完成每日答题任务。经过一番研究,我发现 Autojs+百度OCR文字识别可以实现安卓手机自动答题,由于我本人也是在工作之余初学Autojs,欢迎各位大神在评论区留言分享。

演示视频:

开发环境 : autojs pro 8
APP : 某个学习软件。


基于autojs实现安卓手机APP自动答题


需求分析:

首先,为什么我提出来用百度OCR文字识别技术?
autojs可以通过Uiselector.text()抓取文本呀?

这是因为:

1、我答题的选项是图片。题目是可以抓取下来,但是作答选项,是个图片,而且每天作答的时候,它的位置来回换。

每天答题的时候,查看选项时我的心情,就像下图的表情包一样,十分复杂, 久久思索,我基本上要看6-10秒,去回答一道题。

2、百度OCR可以根据提交的截图,按照一行一行的结果,返回某段文字在屏幕中的坐标信息。答题选项,例如正确和错误,都是两行,不在同一行,处理起来简单。
3、答题没有时间限制,后期经过我的测试,答题速度可以实现3秒一题。
4、autojs可以截图。
5、每天答的题都是重复的,不用做数据库。题库是固定的97道,连每天的作答顺序都是固定的,只是选项来回变,所以我在程序里把答案都按顺序写好了。

android智能手机答案 手机智能答题软件

所以说,如果题库你没搞定,做答的题还有答题时间限制,各位大哥大姐们,就不要花时间看正文了。

正文:

1、免费申请百度智能云(限新用户,且需实名认证)

用任意一款百度的产品、如百度网盘扫一下登录二维码,只要百度网盘实名认证,它这边就数据互通认证过了。

新用户进去之后,找到领取免费资源,可以领取1000次文字调用。

然后,选择创建应用。记住API Key 和 Secret Key。

2、制作题库

1、把97道题写成了一个字符串,以@作为分隔符,把答案字符串转化成数组。

用的时候,直接for循环,调用就行了,如下图:

3、截图与读取

autojs知识 ,captureScreen()、 images.read()
用的时候,先写个函数,向手机申请一下截图权限,这样97道题,一道一道自动截图,方便。

这里的imges对象,调用结束的时候,一定要记得做recycle()回收,否则容易导致内存泄露。

4、传图片给百度OCR,并识别返回结果

传图片,涉及的知识,就图片经过base64编码,传给百度API。

至于百度为什么愿意帮你文字识别,就涉及到access_token。

这里我不细说,百度文字识别库里有教程。

所以,要用到步骤1中的向百度申请的API Key 和 Secret Key。

如下图,很多人评论说,

如果autojs 报错误:: TypeError Cannot call method “forEach” of undefined

是怎么回事。


一是你的API Key 和 Secret Key,没有填写自己的

二是百度OCR是有1000次等限制,到上限的时候,它会给你传个空字符,建议阅读一下官方文档

获取百度识图结束后,百度会将识别结果,返回一个json对象:包含文字内容word和所在位置location,这两个变量。

如果对这一部分内容想深入研究,比如识别发票什么的,建议进入百度智能云官方网站,仔细阅读官方文档。

5、识别文字与题库中的答案进行比对,实现找字点击

由于识别的文字,返回的是数组;
制作的题库,也是数组。
通过for循环比对的时候,先要把两个数组,转换成字符串,这样连个字符串比对就容易很多了。
例如,截图的答案是“A、正确”,我的题库只有“正确”。
那只要截图中的文字,包含,正确,就行。
就不用equal()函数了,用indexOf()函数。

最终效果

在手机5G网速的情况下,5分钟,答97道,平均3.1秒一道题。


其实最占用时间的,就是传图片给百度的过程,图片质量参数越低,好像识别结果返回到手机上,就越快。

完整代码