autojs之自动答题

文章目录

  • 前言
  • 一、总流程
  • 二、难点分解
    • 1.读取题库
    • 2.答题框架
    • 3.匹配答案
  • 总结


前言

autojs - vs Code - Android
本程序只包含了最后的自动答题模块,前面打开的过程很简单懒得写了,需要的可以参考刷视频篇,根据控件或坐标模拟点击即可。
本程序只达到自用的程度,只是为了磨练技术,不要完全依赖程序答题,答题出错并不会有提示。


一、总流程

  1. 打开题库文档,读取 tiku
  2. 提取问题 wenti
  3. 进行题目匹配
    有则获取答案 tiku[wenti]
    无则提示
  4. 点击相应答案
  5. 点击下一题 提交试卷 确定

二、难点分解

1.读取题库

将电脑题库txt文档传到手机上,一个方便的做法是
将爬取的文档直接放在本脚本文件的文件夹内,然后按照保存脚本文件的方法保存即可
autojs之自动答题_第1张图片
按ctrl+shift+p,点击 save on device,即可保存到手机,会存为js文件
地址为和脚本所在的地址一样,使用log(files.cwd())可打印查看

files.cwd():返回脚本的"当前工作文件夹路径"。

再从文件中读取,返回的是字符串,而不是JSON数据。

所以需要用eval把它转化为JSON形数据
参考https://blog.csdn.net/angus_17/article/details/7181099

代码如下:

path="/storage/emulated/0/脚本/行政.js"		
var tiku =files.read(path)

pattern=/[`~!@#$^&*()=|';'“”\\\[\]\.<>\/?~!@#¥……&*()——|【】';:'。,、?\s]/g;
tiku = tiku.replace(pattern,"")  
tiku = eval("(" + tiku + ")");

2.答题框架

每章有五道题,for循环五次,之后提交

for(n=0;n<5;n++)
{
     
	//获取题目
	var wenti = className("android.view.View").depth("8").drawingOrder("0").indexInParent("2").findOnce().text()
	//对获取的题目进行处理,去除所有特殊字符
	pattern=/[`~!@#$^&*()=|{}':;'“”,\\\[\]\.<>\/?~!@#¥……&*()——|{}【】';:""'。,、?\s]/g;
	wenti = wenti.replace(pattern,"")  

    //并没有模糊匹配处理
	sleep(1000)
	
	//匹配题目,获取答案,赋值daan
	//。3放在这里。

	//点击答案
    click(daan)
  //如果答案里有特殊字符就会出错
  //可以用获取题目的方式获取答案,然后处理选项,进行匹配,坐标点击
  //现在懒得处理了,印象中只有一道题,选项人名中有个破折号,会点不了,先不管了

	sleep(2000)
    click("下一题")
    sleep(2000)
}

click("提交作业")
sleep(1000)
click("确定")
exit()

本来是想写模糊匹配的,毕竟题目一字不差可能会有难度,但是模糊匹配略有点难,还没学会,等搞清楚了再写。
这里的处理是将题库里 问题答案的特殊字符去掉,同时将提取的问题 中的特殊字符去掉,这样问题就会完全一样,可以进行匹配。

3.匹配答案

Object.keys(tiku)[i]就是先把所有问题变成数组,然后用下标顺序访问

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组。
参考JS获取对象键值对中key值的方法

str.indexOf(wenti)

该方法将从头到尾地检索字符串 str,看它是否含有子串 wenti。如果没有找到,将返回 -1。

	i=0				
    flag = 0		//为1说明出错
    while(Object.keys(tiku)[i]){
     

    	if (Object.keys(tiku)[i].indexOf(wenti)>-1){
       
    //if(mohuMatch(Object.keys(tiku)[i], wenti))还没有写出来
      		flag = 1
      		var daan = tiku[Object.keys(tiku)[i]]
   	  		console.log(daan)
      		sleep(3000)
     		break;
   		}
   	    i++;
    }

    if(flag == 0){
     
	    console.log("未找到该题")
        sleep(2000)
    }

还没测试过,有问题可以留言,完整代码放在gitee


总结

此次自动答题的练习,收获了很多:

会爬简单的网页了,虽然写出来就那么几行代码,但是其中学习的积累可是不少,至少算是勉强入门了;
自认熟练掌握了replace()的一种用法,这个真是特别好用,不仅可以去除替换某一特定的字符,还可以改变整体的格式,最厉害的是可以一键去除特殊字符;
最后在电脑文件传手机,读取手机js文件,怎么将读取的字符串变为能匹配的js键值对可是花了我很大功夫呢,虽然现在看来都是很简单的问题了,但是对于当时的我,一点门窍都摸不到。而且可能会有更简单的办法实现,我就抛砖引玉,希望有大佬来指点一下。

你可能感兴趣的:(autojs,android)