// ==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 // @downloadURL none // ==/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 = '
' html += '
我是可爱的标题。(>‿◠)✌ 导入\\出题库
' html += '
' html += '如果有bug,点这反馈。 (゜-゜)つロ ' html += '
' html += '
info
' html += '
' html += '

题库导入\\出

规则,文件以txt格式上传,格式为:
{"题目1":["答案"],["题目2"]:["答案1","答案2"]
注意其中的{}[],:""为英语字符
例如:
{"近代中国最基本的国情是______。":["半殖民地半封建社会"]党的基本路线最主要的内容是______。":["一个中心","两个基本点"]}

' html += '
导入题库 :
' html += '
导出题库:
' html += '
' $("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); }