Greasy Fork

Greasy Fork is available in English.

新版学习通自动重做客观题

【工作原理】(手动打开作业详情页面) -> 随机填选答案 -> 提交 -> (手动打开作业详情页面) -> 查看并保存正确答案 -> 重做 -> 填选正确答案 -> 提交 -> 满分【注意事项】仅适配新版学习通;仅支持单选题、多选题与判断题;只有当作业可重做并且提交后允许查看正确答案时,本脚本才能保证满分提交。

当前为 2023-12-10 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==http://greasyfork.icu/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;
    }
}