HUST华中科技大学军理线上作业自动填充助手

HUST military science online homework autofill assistant

// ==UserScript==
// @name         HUST华中科技大学军理线上作业自动填充助手
// @namespace    https://github.com/XiaoLinXiaoZhu/HUST-
// @version      0.1
// @description  HUST military science online homework autofill assistant
// @author       XLXZ
// @match        http://bookcenter.hustp.com/exercises/detail/*.html
// @grant        none
// @require
// @license      MIT
// ==/UserScript==

//调用一个前端库,好看点
$('head').append('<link href="https://lib.baomitu.com/layui/2.6.8/css/layui.css" rel="stylesheet" type="text/css" />');
$.getScript("https://lib.baomitu.com/layui/2.6.8/layui.js", function(data, status, jqxhr) {
    layui.use('element', function(){
        var element = layui.element;
    });
    layer.closeAll();
    init();
    window.onhashchange = function() {
        layer.closeAll();
        init();
    };
});

//初始化函数
function init() {
    init_answer();
    show();
}

//初始化答案
var answer = new Array();

function init_answer() {
//--------------------answer-------------------------
//可以在这里添加你的答案
// 答案格式为:answer[这里是每一套习题对应的id编号,可以在网页源代码中找到] = "A,B,C,AB,BC,ABC,ACE";
// 其中引号内按逗号分割,一定要是大写字母,也可以是选项的名字(就是那个小圆点的选项边上的文字),如果是多选,各个选项从小到大排序。


//---------------------------------------------------
    answer[1528] = "B,D,D,C,A,A,B,B,C,C,B,C,A,B,A,A,D,B,D,B,C,C,A,A,A,B,A,B,B,B,ABCDE,ABCD,ACD,BD,ABCD,ABCE,ABCE,AD,ABC,AC,ABC,ABCD,ACD,ABD,AD,BC,ABD,ABCD,ABCD,ABC,ABC,AB,ABCD,ABCD,ABCD,ABCD,ABC,ABC,ABC,ABCD"
    answer[1529] = "C,B,C,A,B,D,A,D,C,A,B,C,D,B,C,ABCDE,ABCD,BCDE,ABDE,ACD,ABCDE,ABDE,ACD,ABCDE,ABCDE,ABCDE,ABCE,ABE,ABDE,ACD"
    answer[1530] = "A,C,D,A,B,A,D,C,B,A,A,C,A,D,C,ABC,ABCD,ABC,ABCD,ABC,ABC,ABCD,ABC,ABCD,ABD,ABC,ABD,ABC,ABC,BCD"
    answer[1531] = "C,D,B,D,B,A,A,A,B,D,A,D,D,B,A,B,C,C,A,B,C,D,B,A,C,B,A,C,D,A,C,ABCE,ABCD,ABCD,ACD,ABCD,ABD,BCD,ABCDE,ABCD,ABCD,AB,ABCD,ABCDE,ABC,ABCD,ABCD,ABCD,ABCD,ABCD,BC,AB,ABCE,BCD,BC,ABC,ABC,BCD,ABCD,ABC"
    answer[1536] = "C,C,D,C,B,A,A,A,A,A,B,A,C,A,A,B,C,D,D,A,B,B,A,A,B,A,B,C,B,B,ABCD,ABC,ABC,ABCDEF,ABC,ABC,ABCD,ABCDE,ABCDE,ABCDEF,ABCDE,ABCDE,ABCD,ABCD,BCD,ACD,ABCD,ABCD,ABC,ABCDE,ABC,ABCDEF,ABCDEF,ABCD,ABCD,ABCD,ABCD,ABCD,ABCDE,ABCD"
    answer[1690] = "C,C,B,A,B,C,B,B,D,C,B,A,A,B,C,D,C,B,A,B,ABC,ABCD,ABC,ABCDE,ABC,ABCDE,ABCD,ABCDE,BCD,ABCD,ABCD,ABCD,ABD,ABCD,ABCDE,ABCD,ABC,ABCD,AB,ABCDE,ABCD,AB,ABCDE,ABC,ABCDEF,ABCD,ABC,ABCDEF,ABC,ABC"
}

//定义全局变量
var conf = {
    title: "HUST军理助手",
    datalist:{},
    time:1
};

//展示GUI
function show() {
    layer.open({
        type: 1,
        area: ['200px', '150px'],
        offset: 'rb',
        id: 'msgt',
        closeBtn: 0,
        title: conf.title,
        shade: 0,
        maxmin: true,
        anim: 2,
        content: '<div id="msg"><blockquote class="layui-elem-quote layui-quote-nm"><button type="button" class="layui-btn layui-btn-normal start">点我自动填充答案<button></blockquote></div>'
    });
    $(".start").click(function() {
        start();
    })
}


//主程序
function start(question_index_l, question_index_r){
    //获取试卷信息,并校验是否正确
    var item_page_id = document.getElementById("exercises_id");                 //页面编号
    var item_problem_count = parseInt($('.answer_num').length);                 //试题数目
    var item_problem_id = document.getElementsByClassName("answer_num");        //试题数目(用两种方式进行校验)
    var item_problem_type = document.getElementsByClassName("type_title");      //试题类型数目

    var problem_answer = answer[item_page_id.value].split(",");                 //将答案按照逗号拆分
    // alert(item_problem_count);
    // alert(item_page_id.value);
    // alert(item_problem_id.length);
    // alert(item_problem_type.length);


    //如果试卷信息异常则报错
    if (item_problem_count == 0 || item_page_id.length == 0 || item_problem_id.length == 0 || item_problem_type.length == 0) { alert("页面错误"); return; }

    if (answer[item_page_id.value] == null) { alert("未收录该作业答案"); return; }

    if (problem_answer.length != item_problem_count) { alert("答案与题数不符,请检查"); }


    //匹配页面中的选项并转化为array
    var collection = document.querySelectorAll('[name*="stem"]');
    //alert(document.querySelectorAll('[name*="stem"]').length);
    var divsArray = Array.prototype.slice.call(collection,0);      //将 nodelist 类型转化为 array


    let i = 0;
    let j = 0;

    //将题目按照题目的实际编号进行排序
    for(i=0;i<divsArray.length-1;i++){
        for(j=i+1;j<divsArray.length;j++){
            if(divsArray[i].getAttribute("data-id") > divsArray[j].getAttribute("data-id")){
                var k = divsArray[j];
                divsArray[j] = divsArray[i];
                divsArray[i] = k;
            }
        }
    }

    //便于在控制台观察排序情况
    for(i=0;i<divsArray.length;i++){
        console.log("before_id %d --> after_id %d",collection[i].getAttribute("data-id"),divsArray[i].getAttribute("data-id"));
    }

    i = 0;
    j = 0;

    for(;j<problem_answer.length;j++){
        //单项选择单独选择
        if(problem_answer[j].length == 1){
            for(;i<divsArray.length;i++){
                if (divsArray[i].type == "radio" && divsArray[i].value == problem_answer[j] ) {
                    
                    divsArray[i].click();              //触发点击事件

                    console.log("Answer %d %s match no.%d_%d %s",j,problem_answer[j],(i+1-(i+1)%4)/4,(i+1)%4,divsArray[i].value);

                    do {i++;}  while (divsArray[i].value !='A');        //切换到下一题
                    break;
                }
            }
            continue;
        }
        
        //多项选择
        
        let a = problem_answer[j].split('');       //拆分选项

        let m = 0;
        for(;m<a.length;m++){
            for(;i<divsArray.length;i++){
                if (divsArray[i].type == "checkbox" && divsArray[i].value == a[m] ) {
                    //divsArray[i].checked = true;
                    divsArray[i].click();
                    console.log("Answer %d_%d %s match no.%d %s , it is a multiple selection",j,m,a[m],i,divsArray[i].value);
                    i++;
                    break;
                }
            }
        }
    }
}