autojs之自动答题思路详解
综合之前的知到答题和四史答题,在这里写一些总结,
文章目录
- 一、总流程
- 1. 从网上爬取题库,保存文档
- 2. 读取文档,获取键值对
- 3. 提取页面题目和选项
- 4. 键名(题目)匹配,获得键值(答案)
- 5. 点击答案
- 6. 其他
- 总结
一、总流程
- 从网上爬取题库,保存文档
- 读取文档,获取键值对
- 提取页面题目和选项
- 键名(题目)匹配,获得键值(答案)
- 点击答案
- 其他
1. 从网上爬取题库,保存文档
爬取题库,倒也不是什么高大上的东西,之前写的python爬题库,也不过是记录自己的学习结果,实在不会也可以复制粘贴。
然后是对题库的处理,主要是对replace的运用,实际上你用文档自带的替换可能更快更简单。
2. 读取文档,获取键值对
先将文档保存到手机上,脚本能访问到的位置即可
参照之前的autojs之自动答题
//读取文档
path="/storage/emulated/0/脚本/行政.js"
var tiku =files.read(path)
//处理特殊字符
pattern=/[`~!@#$^&*()=|';'“”\\\[\]\.<>\/?~!@#¥……&*()——|【】';:'。,、?\s]/g;
tiku = tiku.replace(pattern,"")
//转换为键值对
tiku = eval("(" + tiku + ")");
//只有你的题库文档中有地方格式不对,这个eval就会报错
//必须是这样:{"题目":"答案","题目":"答案"}
3. 提取页面题目和选项
使用autojs悬浮窗,分析页面,获得题目和选项的唯一标识
可能是:text,id,desc;
//点击答案
click(daan)
//这个答案选项的text属性里就是"我是答案字符串",所以可以直接点击
//四史中就不可以了,下面讲解
也可能需要多种属性确定:
className(“android.view.View”).depth(“8”).drawingOrder(“0”).indexInParent(“2”)
//获取题目
var wenti = className("android.view.View").depth("8").drawingOrder("0").indexInParent("2").findOnce().text()
//多种属性不是每个都必须,只要能确定唯一指向题目或答案字符串即可
//然后也要对获取的题目进行处理,去除所有特殊字符
最难的就属四史答题了
大家仔细观察这张图片,有没有发现和知到答题有什么不同
没错,四史答题中把题目和选项都切分成了好多小块,这样就没办法通过上面两个方法获得题目和点击答案了,而且网上竟然找不到和我一样的问题,可是把我难为了好几天,尝试了好多种方法(比如就用其中的一块文字进行匹配,还有通过属性标识进行拼接获得完整的文字,也想过通过截图然后百度识图提取题目和选项,但是因为种种原因,这些方法都不好使),最后采取了比较靠谱的方法:
-对于题目,可以通过提取整个页面的文字,然后根据开头【单/多选题】和结尾【出题:武汉大学】/[题目来源:湘潭/西安交通/上海交通大学],将中间的题目提取出来;
控件 = className("android.view.View").find();题目 = ''jj = 0for (i = 0; i < 控件.length; i++) {控件里的文字 = 控件[i].text();if (控件里的文字 != "") {题目 += 控件里的文字;if (控件里的文字.indexOf('学】') > -1 || 控件里的文字.indexOf('学]') > -1) {break}}}if (题目.indexOf("题】") != -1) { //【单选题】【多选题】var index = 题目.indexOf("题】")题目 = 题目.substring(index + 2, 题目.length)}if (题目.indexOf("【出题:武汉大学】") != -1) {var index = 题目.indexOf("【出题:武汉大学】")题目 = 题目.substring(0, index)}if (题目.indexOf("[题目来源:") != -1) { //[题目来源:湘潭大学西安交通大学上海交通大学]var index = 题目.indexOf("[题目来源:")题目 = 题目.substring(0, index)}//对获取的题目进行处理,去除所有特殊字符pattern = /[`~!@#$^&*()=|{}':;'“”,\\\[\]\.<>\/?~!@#¥……&*()——|{}【】';:""'。,、?\s]/g;题目 = 题目.replace(pattern, "")log(题目)
-对于选项,用上面的方法能提取出文字,但是!四个选项都连在一起,分不清ABCD!所以采取了新的处理方法:
从上图可以看到选项被切割了,但是它们还在同一个父框里,所以我通过找父控件,然后获得它的孩子孙子控件中的包含文字的控件,再拼接在一起就是选项了。
for (i = 0; i < 4; i++) {选项[i] = ''if (className("RadioButton").depth("24").indexInParent(i).findOnce())className("RadioButton").depth("24").indexInParent(i).findOne().children().forEach(function (child) {//log(child.className());if (child.className() == "android.view.View") {if (child.text() != "") {if (选项[i] != child.text())选项[i] += child.text()//log(child.text());}else {child.children().forEach(function (child) {// log(child.className());if (child.text() != "") {if (选项[i] != child.text())选项[i] += child.text()//log("!" + child.text());}});}}});log(选项[i]);}
可以看到套了很多层(2层)判断,那是因为四史答题里面,选项的文字,它可能是儿子里包含文字,也可能是孙子,还可能是曾孙子(我遇到过曾孙子的情况,但是懒得写了就没加判断)。。。我没有很好的办法一下子提取所有的,所以只能挨个判断了,如果有更好的思路,欢迎提出,一起讨论。
4. 键名(题目)匹配,获得键值(答案)
还是参见知到答题
/*
*匹配答案
* 题库中[第i个题目].indexof(题目)>-1,表示匹配到问题
* 返回答案
*/
function 匹配答案(题库, 题目) {i = 0flag = 0while (Object.keys(题库)[i]) {if (Object.keys(题库)[i].indexOf(题目) > -1) {flag = 1var 答案 = 题库[Object.keys(题库)[i]]return 答案}i++;}if (flag == 0) 提示文本("没有匹配到问题,自行作答,百度搜索") //没有写百度搜索return -1
}
5. 点击答案
四史答题和知到答题的不同之前已经说了,所以没办法直接click(daan),
上面获取了选项,存储在 选项[i] 中
这里通过if (答案.indexOf(选项[j]) > -1),获得的i就是要点击的选项的indexInParent(j)
单选:
随机位置x = className("android.widget.RadioButton").depth("24").indexInParent(j).findOnce().bounds().centerX() + random(0, 100)
随机位置y = className("android.widget.RadioButton").depth("24").indexInParent(j).findOnce().bounds().centerY() + random(0, 30)
click(随机位置x, 随机位置y)
多选:
随机位置x = className("android.widget.CheckBox").depth(23).indexInParent(j).findOnce().bounds().centerX() + random(0, 100)
随机位置y = className("android.widget.CheckBox").depth(23).indexInParent(j).findOnce().bounds().centerY() + random(0, 30)
click(随机位置x, 随机位置y)
整体框架:
function 点击答案(答案) {if (答案 == -1) {if (!多选) {toast("无匹配,默认点击第2个")。。。}else if (多选) {toast("默认全选")。。。}}else {if (!多选) {for (j = 0; j < 4; j++) {}if (答案.indexOf(选项[j]) > -1) {}}else if (多选) {for (j = 0; j < 4; j++) {}if (答案.indexOf(选项[j]) > -1) {}}}
}
具体参见四史答题
6. 其他
其他的好像也没什么了,想起来再评论补充,对于验证码,ui,多线程,我的处理还不是很好,再学习学习,之后再总结吧
总结
有我没有写到的,可以评论。
感谢点赞,评论,收藏,关注!
autojs之自动答题思路详解相关推荐
- android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...
先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...
- FPGA串口(UART)通信协议制定与设计思路详解示例
串口(UART)通信协议制定与设计思路详解 1 概述 本文用于描述规定的串口通信协议,以及传输内容. 2 项目关于串口的要求 a) 支持BIT自检,1路UART上报BIT信息: b) 1路UART接口 ...
- python virtualenv conda_在vscode中启动conda虚拟环境的思路详解
问题:cudatoolkit cudnn 通过conda 虚拟环境安装,先前已经使用virtualenv安装tf,需要在conda虚拟环境中启动外部python虚拟环境 思路:conda prompt ...
- Tesla AI Day:特斯拉如何实现自动驾驶的详解
之前上课的时候偶然间看到了知乎上关于特斯拉如何实现自动驾驶的详解,因为我本身就是做算法的,对自动驾驶也很感兴趣,得知信息来源于Tesla的AI Day,于是下课后马不停蹄就去找了回放好好学习学习. 视 ...
- 关于日期正则表达式的思路详解
1 概述 首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好. 前几天在CSDN ...
- 非常运维 一体化终端安全管理系统自动安装脚本详解
非常运维 一体化终端安全管理系统自动安装脚本详解 作者:高玉涵 时间:2019.03.13 13:52 博客:blog.csdn.net/cg_i 演示:https://v.youku.com/v ...
- python怎么去掉视频字幕_利用Python实现字幕挂载(把字幕文件与视频合并)思路详解...
其实超简单超简单!python好现成的库,一下子省略了好多步骤! 本文在Windows环境下!linux只是不需要手动输入imagicmagick的位置! 需要用到的环境 python(基本上只要不是 ...
- 【直播】陈安东,但扬:CNN模型搭建、训练以及LSTM模型思路详解
CNN模型搭建.训练以及LSTM模型思路详解 目前 Datawhale第24期组队学习 正在如火如荼的进行中.为了大家更好的学习"零基础入门语音识别(食物声音识别)"的课程设计者 ...
- vuepdf转换html,Vue网页html转换PDF(最低兼容ie10)的思路详解
Vue网页html转换PDF(最低兼容ie10)的思路详解 发布时间:2020-10-16 13:05:09 来源:脚本之家 阅读:95 作者:冷藏封 HTML转PDF: 1.页面底层实现--Vue: ...
最新文章
- 滤镜应用——制作彩虹效果
- 主持人副语言包括什么_央视主持人大赛,董卿最精彩的这几段点评,居然被剪掉了...
- python常用模块教程_盘点Python常用的模块和包
- PDF超过6000页,OMG,学它
- python实现类似于visio_类似visio的软件有哪些?
- Photoshop插件-删除中间调通道蒙板-脚本开发-PS插件
- 计算机与英语的关系论文摘要,中国计算机专业研究生英文学术论文摘要中元话语的使用与特征研究...
- HTML5+CSS大作业——学生个人博客(5页) 大学生个人博客网页作品 网页设计作业模板 学生网页制作源代码下载
- 考研高数 专题11:多元复合函数及隐函数求导的方法和技巧【灵活】
- 测试自行车速度的软件,自行车速度测试
- 武汉大学计算机学院2010情景剧,武汉大学金秋情景剧大赛精彩落幕(组图)
- 计算机数控编程特点,什么是数控图像编程系统有哪些特点
- android水平wheelview,android:自定义横向滚动的WheelView
- PMM使用Grafana告警
- VSS 服务器上的文件是保存在哪个文件夹
- 全新的 React 组件设计理念 Headless UI
- C4D云渲染平台哪家好?
- 基于opencv3.0下的运动车辆检测
- Flash烧录成功后校验器件时出错问题
- 人工神经网络理论设计及应用课后题答案