前言:
最近需要在手机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道,连每天的作答顺序都是固定的,只是选项来回变,所以我在程序里把答案都按顺序写好了。

所以说,如果题库你没搞定,做答的题还有答题时间限制,各位大哥大姐们,就不要花时间看正文了。
正文:
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秒一道题。
其实最占用时间的,就是传图片给百度的过程,图片质量参数越低,好像识别结果返回到手机上,就越快。
完整代码
