前文
JavaScript——易班优课YOOC课群在线测试自动答题解决方案(一)答案获取
Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(二)答案储存
Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(三)答案查询
JavaScript——易班优课YOOC课群在线测试自动答题解决方案(四)答案显示
JavaScript——易班优课YOOC课群在线测试自动答题解决方案(五)简单脚本
Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(六)后端改造
JavaScript——易班优课YOOC课群在线测试自动答题解决方案(七)随机答案
JavaScript——易班优课YOOC课群在线测试自动答题解决方案(八)功能面板
JavaScript——易班优课YOOC课群在线测试自动答题解决方案(九)ID标签
Vue + Element UI + Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(十)问题管理页面
解决方案
// ==UserScript==
// @name YOOC Exam Detail
// @namespace http://tampermonkey.net/
// @version 0.2
// @description try to take over the world!
// @author STZG
// @match https://www.yooc.me/group/*/exam/*/detail
// @grant none
// ==/UserScript==
(function() {
'use strict';
// Your code here...
var examUpload=()=>{
var xmlhttp = new XMLHttpRequest();//获取对象
xmlhttp.onreadystatechange = function(){//设置回调函数
if(xmlhttp.readyState == 4){//这里的4是请求的状态码,代表请求已经完成
if(xmlhttp.status == 200 || xmlhttp.status == 304){//这里是获得响应的状态码,200代表成功,304代表无修改可以直接从缓存中读取
console.log(xmlhttp);
//创建DOM
var html=document.createElement("html");
html.innerHTML=xmlhttp.responseText
console.log(html)
//获取考试信息
var group=document.getElementById('group-data')
var groupId=group.getAttribute("data-group-id")
var examId=group.getAttribute("data-exam-id")
//获取问题信息
var question=Array.from(html.getElementsByClassName('question-board'))
console.log(question)
//数据封装
var question_arr=[]
question.forEach(q=>{
question_arr.push({id:q.id,question:q.outerHTML
.replace(/the-ans fls/g,"the-ans crt")
.replace(/<li class="crt"/g,'<li class=""')
.replace(/<li class="fls"/g,'<li class=""')})
document.getElementById(q.id)
.getElementsByClassName('the-ans')[0]
.innerHTML=q.getElementsByClassName('the-ans')[0].innerHTML
})
//上传服务器
var posthttp = new XMLHttpRequest();//获取对象
posthttp.onreadystatechange = function(){//设置回调函数
if(posthttp.readyState == 4){//这里的4是请求的状态码,代表请求已经完成
if(posthttp.status == 200 || posthttp.status == 304){//这里是获得响应的状态码,200代表成功,304代表无修改可以直接从缓存中读取
var result = posthttp.responseText;//这里获取的是响应文本,也可以获得响应xml或JSON
console.log(result)
}
}
}
posthttp.open("POST","https://locahost/group/"+groupId+"/exam/"+examId+"/upload");
//JSON Header
posthttp.setRequestHeader("Content-Type","application/json");
posthttp.setRequestHeader("Content-Security-Policy","upgrade-insecure-requests");
//解析为JSON
posthttp.send(JSON.stringify(question_arr));//POST请求
}
}
}
xmlhttp.open("GET",document.URL);
xmlhttp.send();//GET请求
}
var answer=()=>{
//获取考试信息
var group=document.getElementById('group-data')
var groupId=group.getAttribute("data-group-id")
var examId=group.getAttribute("data-exam-id")
//获取问题信息
questions=document.getElementsByClassName('question-board')
var question_arr=[]
Array.from(questions).forEach(q=>{
question_arr.push(q.id.substr(9))
})
var xmlhttp = new XMLHttpRequest();//获取对象
xmlhttp.onreadystatechange = function(){//设置回调函数
if(xmlhttp.readyState == 4){//这里的4是请求的状态码,代表请求已经完成
if(xmlhttp.status == 200 || xmlhttp.status == 304){//这里是获得响应的状态码,200代表成功,304代表无修改可以直接从缓存中读取
var result = xmlhttp.responseText;//这里获取的是响应文本,也可以获得响应xml或JSON
console.log(result)
//解析为JS对象
var obj = JSON.parse(result);
var questionContainer=document.getElementsByClassName('exam-detial-container')[0]
obj.forEach(q=>{
var question=document.getElementById('question-'+q.id)
var answer = document.createElement("div");
answer.innerHTML = q.question;
var child=answer.childNodes[0]
child.id='answer-'+q.id
questionContainer.insertBefore(child,question)
console.log(question)
console.log(answer)
})
addIdTag()
}
}
}
xmlhttp.open("GET","https://locahost/group/yooc/group/"+groupId+"/exam/"+examId+"/answer?question="+question_arr);
xmlhttp.send();//GET请求
}
var nullSubmit=()=>{
//获取问题信息
var question=Array.from(document.getElementsByClassName('question-board'))
question.forEach(q=>{console.log(q)
let inputTag=q.getElementsByTagName('input')
console.log(inputTag)
if(inputTag.length>0){
let Ele=inputTag[0]
if(Ele.type==="radio"||Ele.type==="checkbox"){
if(Ele.type==="radio"){
Ele.checked=true;
}else if(Ele.type==="checkbox"){
Ele.checked=true;
}
//页面方法
choiceAnswerData($(q))
}else if(Ele.type==="text"){
let Eles=Array.from(inputTag)
Eles.forEach(e=>{
e.value="test"
})
//页面方法
inputAnswerData($(q))
}
let ele_name=Ele.name.replace(/\_[0-9]+/, '')
let questionTag=document.getElementById(ele_name)
questionTag.classList.add('done')
}
})
}
var appendsomething=()=>{
var releaseButtun=document.getElementsByClassName('release-board')[0]
var ns=document.createElement('a')
ns.id="null-submit"
ns.href="javascript:;"
ns.innerText="提交白卷"
ns.style="margin-left: 0px;margin-top: 10px;"
ns.title="随机答案提交试卷"
ns.onclick=()=>{
nullSubmit()
//页面方法
xAlert('提示','随机答案选择完毕,可以提交了')
}
releaseButtun.appendChild(ns)
var qa=document.createElement('a')
qa.id="query-answer"
qa.href="javascript:;"
qa.innerText="查询答案"
qa.style="margin-left: 20px;margin-top: 10px;"
qa.title="云端题库查询答案"
qa.onclick=()=>{
var ansElements = document.getElementsByClassName('the-ans')
var ansNum = ansElements.length
if(ansNum<0){
answer()
}else{
//页面方法
xAlert('失败','已经有答案了哦')
}
}
releaseButtun.appendChild(qa)
}
var addIdTag=()=>{
//获取问题信息
var question=Array.from(document.getElementsByClassName('question-board'))
question.forEach(q=>{
let board_type=q.id.split('-')[0]
let question_id=q.id.split('-')[1]
let idTag=q.getElementsByClassName('question-id-tag')
if(idTag.length===0){
idTag=document.createElement('span')
idTag.classList.add('question-id-tag')
q.children[0].appendChild(idTag)
}
if(board_type==='question'){
idTag.innerHTML=" 题目ID:"+question_id
}else if(board_type==='answer'){
idTag.innerHTML=" 答案ID:"+question_id
}
})
}
var unblock=()=>{
//选择
document.onselectstart= function(e){
var e = e || window.event;
e.returnValue = true;
return true;
}
//鼠标按下
document.onmousedown = function(e) {
var e = e || window.event;
e.returnValue = true;
return true;
}
//鼠标右键菜单
document.oncontextmenu = function(e) {
var e = e || window.event;
e.returnValue = true;
return true;
}
window.onkeydown = function(e) {
//Ctrl+S 保存
if (e.ctrlKey && e.keyCode == 83) {
e.returnValue = true;
return true;
}
//Ctrl+P 打印
if (e.ctrlKey && e.keyCode == 80) {
e.returnValue = true;
return true;
}
//Ctrl+C 复制
if (e.ctrlKey && e.keyCode == 67) {
e.returnValue = true;
return true;
}
}
}
//获取考试信息
var group=document.getElementById('group-data')
var groupId=group.getAttribute("data-group-id")
var examId=group.getAttribute("data-exam-id")
var examQuestionNum=Number(group.getAttribute("data-questions"))
//获取问题信息
var questions=document.getElementsByClassName('question-board')
var questionNum = questions.length
//获取答案信息
var ansElements = document.getElementsByClassName('the-ans')
var ansNum = ansElements.length
if(ansNum>0){
if(questionNum===examQuestionNum){
examUpload()
}else{
console.log("现在是考试中,不能上传答案哦。")
}
}else{
answer()
appendsomething()
unblock()
}
addIdTag()
})();