【工作原理】(手动打开作业详情页面) -> 随机填选答案 -> 提交 -> (手动打开作业详情页面) -> 查看并保存正确答案 -> 重做 -> 填选正确答案 -> 提交 -> 满分【注意事项】仅适配新版学习通;仅支持单选题、多选题与判断题;只有当作业可重做并且提交后允许查看正确答案时,本脚本才能保证满分提交。
// ==UserScript==https://greasyfork.org/zh-CN
// @name 新版学习通自动重做客观题
// @namespace https://wuhang.xyz/
// @version 0.1
// @description 【工作原理】(手动打开作业详情页面) -> 随机填选答案 -> 提交 -> (手动打开作业详情页面) -> 查看并保存正确答案 -> 重做 -> 填选正确答案 -> 提交 -> 满分【注意事项】仅适配新版学习通;仅支持单选题、多选题与判断题;只有当作业可重做并且提交后允许查看正确答案时,本脚本才能保证满分提交。
// @author Matty
// @match https://mooc1.chaoxing.com/mooc2/mooc-ans/work/*
// @icon https://wuhang.xyz/upload/%E5%A5%B6%E7%89%9B%E7%8C%AB128.svg
// @license GPLv3
// ==/UserScript==
// TODO 适配填空题(typename="填空题")
// 获取正确答案:document.getElementsByClassName("mark_fill colorGreen").item(【i】).innerText.substring(6)
// 填入正确答案:document.getElementsByClassName("mark_fill colorGreen").item(【i】).innerText = '正确答案'
if(window.location.href.indexOf("dowork") != -1) {
doWork();
}
else {
view();
}
// 取消下面这行代码的注释,即可启用自动提交功能,无需手动确认。
// document.getElementsByClassName("jb_btn jb_btn_92 fr fs14").item(0).click();
function doWork() {
console.log("开始处理【作业作答】页面!");
let allQ1 = document.getElementsByClassName("padBom50 questionLi");
let qLength1 = allQ1.length;
console.log("当前位于【作业作答】页面,总共有" + qLength1 + "道题目,包括单选题、多选题和判断题。");
if(! haveAnswers()) {
for(let i = 0; i < qLength1; i++) {
let q = allQ1.item(i);
q.getElementsByTagName("input").item(1).value = isPanduanti(q) ? "true" : "A";
}
console.log("第一步:在【作业作答】页面完成第一次做题,选择题全选A,判断题全选对,得分看运气。(注意此时页面上每道题的选项按钮可能还会保持原样,没关系的,不用管它)");
}
else {
let allA1 = getAnswers();
for(let i = 0; i < qLength1; i++) {
let q = allQ1.item(i);
let a = allA1[i];
q.getElementsByTagName("input").item(1).value = isPanduanti(q) ? (a.rightAnswerValue == "对" ? 'true' : 'false') : a.rightAnswerValue;
}
console.log("第三步:从本地存储中取回正确答案,在【作业作答】页面完成第二次做题,100%满分。(注意此时页面上每道题的选项按钮可能还会保持原样,没关系的,不用管它)");
}
submitValidate();
}
function view() {
console.log("开始处理【作业详情】页面!");
let allQ2 = document.getElementsByClassName("marBom60 questionLi");
let qLength2 = allQ2.length;
let allA2 = new Array();
console.log("当前位于【作业详情】页面,总共有" + qLength2 + "道题目,包括单选题、多选题和判断题。");
for(let i = 0; i < qLength2; i++) {
let q = allQ2.item(i);
allA2.push({
// 从【作业详情】页面获取题目id,再转换成答案id。【作业作答】页面中对应id的input元素的value属性就是用户作答时已选中的答案。
answerInputId: q.id.replace('question', 'answer'),
rightAnswerValue: q.getElementsByClassName("colorGreen marginRight40 fl").item(0).innerText.substring(6)
});
}
console.log("第二步:在【作业详情】页面收集正确答案,并存储到本地。");
saveAnswersToLocal(allA2);
redoWork();
}
// 根据URL计算出当前这份学习通作业的唯一id
function getWorkId() {
let queryVariables = window.location.search.substring(1).split("&");
let itemId = '';
// courseId + classId + cpi + workId
for(let i = 0; i < 4; i++) {
itemId += queryVariables[i].split("=")[1];
}
return itemId;
}
// 将当前这份作业的正确答案保存到本地存储中(对象转换为字符串)
function saveAnswersToLocal(allA) {
localStorage.setItem(getWorkId(), JSON.stringify(allA));
}
// 检查本地存储中是否已经保存了当前这份作业的正确答案
function haveAnswers() {
if(localStorage.getItem(getWorkId()) != null) {
return true;
}
else {
return false;
}
}
// 从本地存储中获取当前这份作业的正确答案(字符串转换为对象)
function getAnswers() {
return JSON.parse(localStorage.getItem(getWorkId()));
}
//检查当前div元素是不是属于判断题
function isPanduanti(questionDiv) {
if(questionDiv.getAttribute("typename") == "判断题") {
return true;
}
else {
return false;
}
}