高校考试网(gaoxiaokaoshi.com)建立本地题库自动测试

我的九尾狐奶奶呀,毛概每次测试都不及格,算了还是用笨办法吧。获取答案通过历史测试的试题解析,或者多做题库里面的无限次数测试来增加答案。

目前为 2020-06-05 提交的版本。查看 最新版本

// ==UserScript==
// @name         高校考试网(gaoxiaokaoshi.com)建立本地题库自动测试
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  我的九尾狐奶奶呀,毛概每次测试都不及格,算了还是用笨办法吧。获取答案通过历史测试的试题解析,或者多做题库里面的无限次数测试来增加答案。
// @author       Aisen
// @match        http://www.gaoxiaokaoshi.com/ExamList/ExamPage/*
// @match        http://www.gaoxiaokaoshi.com/ExamList/ExamList.aspx
// @run-at       document-end
// @grant        GM_addStyle
// @grant        unsafeWindow
// @require      https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js
// @license      MIT
// ==/UserScript==
var $ = window.jQuery;
var out = {};
var setting = {
    time: 50 //每道题等待时间,单位毫秒
}
pannel();
if (localStorage.getItem('题库') && Object.keys(JSON.parse(localStorage.getItem('题库'))).length > 0) {
    out = JSON.parse(localStorage.getItem('题库'));
    logger('log', '目前题库已收录:' + Object.keys(out).length + '题。')

} else {
    logger('log', '题库为空,请先进行试题分析建立题库。')
    localStorage.setItem('题库', '{}')
}
var url = window.location.pathname;
//console.log(url)
if (url == '/ExamList/ExamPage/ExamDo.aspx') {
    logger('log', '开始答题!')
    doTest()
} else if (url == '/ExamList/ExamPage/viewExam.aspx' || url == '/ExamList/ExamPage/ViewExam.aspx') {
    logger('log', '开始更新题库!')
    saveAnswers()
} else {
    $('.mypanel').css({ 'left': '10px', 'top': '200px' });


}

function doTest() {
    var questions = $('.exam_list dt');
    var num = 0;
    var i = 0;
    var timer = setInterval(function() {
        logger('log', '正在完成第:' + (i + 1) + '道题。');
        var question = $(questions[i]).text();
        question = question.match(/\.(.*)\(/)[1];
        if (out[question]) {
            num++;
            var answers = out[question];
            var choices = $('label[for^=tm_' + (i + 1) + '_');
            console.log(answers);
            for (var j = 0; j < choices.length; j++) {
                if (answers.includes($(choices[j]).text().match(/、(.*)/)[1])) {
                    $(choices[j]).click();
                }

            }
        }
        i
        i++;
        if (i >= questions.length) {
            clearInterval(timer);
            logger('log', '答题完成,有答案的有:' + num + '道题。');
        }

    }, setting.time)




}

function saveAnswers() {
    try {
        var ddtms = $("div[id^=ddTm_]");
        //console.log(ddtms)
        var num = 0;
        for (var i = 0; i < ddtms.length; i++) {
            var div = $(ddtms[i]);
            var question = div.children('dt').text().match(/\d\.(.*)\(/)[1];
            //console.log(question)
            var choices = div.find('.green:last').text();
            //console.log(choices)
            var answers = [];
            for (var j = 0; j < choices.length; j++) {
                switch (choices[j]) {
                    case '对':
                        answers.push('对');
                        break;
                    case '错':
                        answers.push('错');
                        break;
                    case 'A':
                        answers.push($('label[for=tm_' + (i + 1) + '_0').text().slice(2))
                        break;
                    case 'B':
                        answers.push($('label[for=tm_' + (i + 1) + '_1').text().slice(2))
                        break;
                    case 'C':
                        answers.push($('label[for=tm_' + (i + 1) + '_2').text().slice(2))
                        break;
                    case 'D':
                        answers.push($('label[for=tm_' + (i + 1) + '_3').text().slice(2))
                        break;
                    case 'E':
                        answers.push($('label[for=tm_' + (i + 1) + '_4').text().slice(2))
                        break;
                    case 'F':
                        answers.push($('label[for=tm_' + (i + 1) + '_5').text().slice(2))
                        break;
                    case 'G':
                        answers.push($('label[for=tm_' + (i + 1) + '_6').text().slice(2))
                        break;
                    case 'H':
                        answers.push($('label[for=tm_' + (i + 1) + '_7').text().slice(2))
                        break;
                }

            }
            //console.log(answers)
            if (!out[question]) {
                //console.log(question)
                //console.log(out[question])
                num++;
                out[question] = answers;

            } else if (!isSame(out[question], answers)) {
                console.log(out[question])
                console.log(answers)
                num++;
                out[question] = answers.concat(out[question]);
            }
            out[question] = unique1(out[question]);




        }
        logger('log', '已更新:' + num + '题,目前题库已收录:' + Object.keys(out).length + '题。')
        localStorage.setItem('题库', JSON.stringify(out))

    } catch (e) {
        logger('warn', '网址规则不匹配,更新题库失败。')

    }



}
// 判断数组是否相等
function isSame(arg1, arg2) {
    let bol = true;
    if (Object.keys(arg1).length != Object.keys(arg2).length) {
        return false;
    }
    for (let key in arg1) {
        if (typeof arg1[key] == 'object') {
            bol = isSame(arg1[key], arg2[key])
            if (!bol) {
                break;
            }
        } else if (arg1[key] != arg2[key]) {
            bol = false;
            break;
        }
    }
    return bol
}

//去重
function unique1(arr) {
    var hash = [];
    for (var i = 0; i < arr.length; i++) {
        if (hash.indexOf(arr[i]) == -1) {
            hash.push(arr[i]);
        }
    }
    return hash;
}

// Logger
function logger(type, msg) {
    $(".info").text(msg);
    msg = "[高校考试]: " + msg;
    switch (type) {
        case 'warn':
            console.warn(msg);
            break;
        case 'log':
            console.log(msg);
            break;
        case 'info':
            console.info(msg);
            break;
    }
}
//面板
function pannel() {
    GM_addStyle('.mypanel {position: fixed;overflow: hidden;top: 100px;right: 10px; width: 300px;height: 200px;background-color: rgba(70, 196, 38, 0.6);z-index: 999999;border-radius: 5%;}');
    GM_addStyle('.answers, .askMe, .info {height: 70px;line-height: 70px;flote:left;padding-left: 10px;;border-bottom: rgba(0, 0, 0, .2) dashed 2px;font-size: 14px;color:#fff}');
    GM_addStyle('.askMe a {color:pink !important;font-size: 17px}');
    GM_addStyle('.append_0 {position: absolute;left:50%;top:50%;transform: translate(-50%, -50%);overflow: hidden;display:none ;width : 420px;height : 250px;background-color: rgba(70, 196, 38, 0.6);z-index: 9999999;font-size: 14px;color:#fff}');
    GM_addStyle('.append_0 h2 {text-align: center;}');
    GM_addStyle('.btn_ls, .append_1 {margin: 10px}')
     GM_addStyle('.append {margin: 1px;width: 70px;height:30px;float:right;}')
    GM_addStyle(' .append_1, .append_2, .append_3 {width: 50px;height:30px;float:right;}');
    var html = '<div class="mypanel">'
    html += '<div class="answers">我是可爱的标题。(>‿◠)✌ <a href="javascript:" class="append">导入\\出题库</a></div>'
    html += '<div class="askMe">'
    html += '<a href="http://wpa.qq.com/msgrd?v=3&uin=201826658&site=qq&menu=yes" target="_blank">如果有bug,点这反馈。 (゜-゜)つロ </a>'
    html += '</div>'
    html += '<div class="info">info</div>'
    html += '</div>'
    html += '<div class="append_0"> <h2 >题库导入\\出<button class="append_1">关闭</button></h2><p class="btn_ls">规则,文件以txt格式上传,格式为:<br>{"题目1":["答案"],["题目2"]:["答案1","答案2"]<br>注意其中的{}[],:""为英语字符<br>例如:<br>{"近代中国最基本的国情是______。":["半殖民地半封建社会"]党的基本路线最主要的内容是______。":["一个中心","两个基本点"]}</p>'
    html += '<div class="btn_ls">导入题库 : <input type="file"  name="file" accept=".txt" id="fileId" /><button class="append_2">导入</button></div>'
    html += '<div class="btn_ls">导出题库:<button class="append_3">导出</button></div>'
    html += '</div>'
    $("body").append(html);
    $('.append').click(function() {
        $(".append_0").toggle();
        $(".mypanel").toggle();
    })
    $('.append_1').click(function() {
        $(".append_0").toggle();
        $(".mypanel").toggle();
    })
    $('.append_2').click(function() {
        try {
            var objFile = $("#fileId");
            if (objFile.value == "") {
                alert("不能空")
            }
            var files = $('#fileId').prop('files'); //获取到文件列表
            //console.log(files.length);
            if (files.length == 0) {
                alert('请选择文件');
            } else {
                var num = 0;
                var reader = new FileReader(); //新建一个FileReader
                reader.readAsText(files[0], "UTF-8"); //读取文件
                reader.onload = function(evt) { //读取完文件之后会回来这里
                    var fileString = evt.target.result; // 读取文件内容
                    try {
                        var fileJson = JSON.parse(fileString);
                    }catch(err){
                        alert('上传失败!请严格按照文件格式要求上传!');
                        return;

                    }
                    
                    for (var key in fileJson) {
                        var value = fileJson[key];
                        //console.log(key);
                        if (!out[key]) {
                            num++;
                            out[key] = value
                        } else if (!isSame(out[key], value)) {
                            num++;
                            console.log(out[key])
                            console.log(value)
                            out[key] = value.concat(out[key]);
                        }
                        out[key] = unique1(out[key]);

                    }
                    alert('已更新:' + num + '题,目前题库已收录:' + Object.keys(out).length + '题。')
                    localStorage.setItem('题库', JSON.stringify(out))


                }

            }

        } catch (err) {
            alert('上传失败!请严格按照文件格式要求上传!')

        }



    })
    $('.append_3').click(function() {
        //var content  = JSON.stringify(out);
    exportRaw('题库.txt', JSON.stringify(out));







    })




}
function fakeClick(obj) {
                  var ev = document.createEvent("MouseEvents");
                  ev.initMouseEvent("click", true, false);
                  obj.dispatchEvent(ev);
                }

function exportRaw(name, data) {
                  var urlObject = window.URL || window.webkitURL || window;
                  var export_blob = new Blob([data]);
                  var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
                  save_link.href = urlObject.createObjectURL(export_blob);
                  save_link.download = name;
                  fakeClick(save_link);
                }