Greasy Fork 支持简体中文。

微波MOOC自动互评/自评

自动完成中国大学MOOC课程的互评和自评操作,全部满分!

// ==UserScript==
// @name         微波MOOC自动互评/自评
// @namespace    https://greasyfork.org/users/1226768-singledog957
// @version      0.2.3
// @description  自动完成中国大学MOOC课程的互评和自评操作,全部满分!
// @author       SingleDog
// @match        https://www.icourse163.org/learn/BUAA-1002534005?tid=1473108463*
// @icon         https://edu-image.nosdn.127.net/32a8dd2a-b9aa-4ec9-abd5-66cd8751befb.png?imageView&quality=100
// @license      MIT
// @supportURL   https://greasyfork.org/zh-CN/scripts/521083-%E5%BE%AE%E6%B3%A2mooc%E8%87%AA%E5%8A%A8%E4%BA%92%E8%AF%84-%E8%87%AA%E8%AF%84
// @homepageURL  https://greasyfork.org/zh-CN/scripts/521083-%E5%BE%AE%E6%B3%A2mooc%E8%87%AA%E5%8A%A8%E4%BA%92%E8%AF%84-%E8%87%AA%E8%AF%84
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    const contentId = [
        1245523541, 1245522594, 1245527464, 1245524507, 1245527466, 1245526463,
        1245527467, 1245524508, 1245524509, 1245523546, 1245527469, 1245526465,
        1245525504, 1245524513, 1245523548, 1245523549, 1245525505, 1245527473,
        1245526468, 1245523554, 1245527475, 1245522603
    ];
    let userString = "好"; // 自定义评论内容
    const baseUrl = "https://www.icourse163.org/learn/BUAA-1002534005?tid=1473108463#/learn/hw?id=";
    const urlList = contentId.map(id => `${baseUrl}${id}`);
    let currentIndex = parseInt(localStorage.getItem('currentIndex')) || 0;

    // 从 localStorage 中获取 count,如果没有则要求用户输入
    let count = parseInt(localStorage.getItem('count'), 10);
    if (isNaN(count)) {
        // 如果 localStorage 没有 count 值,弹窗要求用户输入
        count = parseInt(prompt("x=0:每次作业只互评5份, \nx>0: 每次作业再多评x份", "0"), 10);
        if (isNaN(count) || count < 0) {
            alert("输入无效,使用默认值 0");
            count = 0;
        }
        // 将 count 存储到 localStorage
        localStorage.setItem('count', count);
    } else {
        console.log(`从 localStorage 获取到的 count 值为: ${count}`);
    }

    // 跳转到指定 URL
    function navigateToUrl(index) {
        if (index < urlList.length) {
            console.log(`即将跳转到 URL: ${urlList[index]}`);
            localStorage.setItem('currentIndex', index);
            window.location.href = urlList[index];
        } else {
            console.log("URL 列表已遍历完毕,脚本结束。");
            localStorage.removeItem('currentIndex');
            localStorage.removeItem('count'); // 清除 count 值
        }
    }

    // 主逻辑函数
    function main() {
        console.log("等待 5 秒后开始执行页面逻辑...");
        setTimeout(() => {
            let hasPerformedSelfEvaluation = false; // 每次进入新页面时重置为 false

            // 查找并匹配“点击自评”按钮
            let selfEvaluationBtn = Array.from(document.querySelectorAll('table.listtable tbody tr a.clickbtn.j-selfevabtn'))
                .find(btn => btn.textContent.trim() === "点击自评"); // 匹配按钮文本为“点击自评”

            if (selfEvaluationBtn && !hasPerformedSelfEvaluation) {
                console.log("找到‘点击自评’按钮,点击并执行自评逻辑...");
                selfEvaluationBtn.click(); // 点击自评按钮
                setTimeout(() => {
                    performEvaluation(true); // 执行评分逻辑(传递 isSelfEvaluation = true)
                    hasPerformedSelfEvaluation = true; // 标记自评已完成
                }, 2000); // 延迟 2 秒执行自评
                return; // 等待自评完成后刷新页面
            }

            // 如果没有找到“点击自评”按钮或已经执行过自评,继续检查后续逻辑
            checkForStudent6AndContinue();
        }, 2000); // 等待 5 秒后开始执行页面逻辑
    }

    // 检查是否存在 student6 并继续后续逻辑
    function checkForStudent6AndContinue() {
        if (count > 0) {
            console.log(`count 值为 ${count},跳过 student6 检测,直接执行后续流程`);
            continueWorkflow();
            return; // 停止进一步逻辑
        }

        let allCells = document.querySelectorAll('td.l1'); // 查询所有 l1 类的单元格
        let student6Cell = Array.from(allCells).find(cell => cell.textContent.trim() === "student6");

        if (student6Cell) {
            console.log("检测到 student6,等待 5 秒后跳转到下一个 URL");
            currentIndex++; // 更新当前索引
            setTimeout(() => navigateToUrlAndExecuteMain(currentIndex), 2000); // 跳转并继续执行 main
            return; // 停止当前页面操作
        }

        let startEvaluationBtn = Array.from(document.querySelectorAll('a'))
            .find(btn => btn.textContent.trim() === "开始评分");

        if (startEvaluationBtn) {
            startEvaluationBtn.click();
            console.log("已找到并点击‘开始评分’按钮");
            continueWorkflow(); // 继续后续流程
        } else {
            console.log("未找到‘开始评分’按钮,直接尝试其他操作");
            continueWorkflow(); // 防止逻辑卡住
        }
    }

    // 后续流程
    function continueWorkflow() {
        setTimeout(() => {
            let pendingReviewBtn = document.querySelector('a[title="还未提交互评"]');
            if (pendingReviewBtn) {
                pendingReviewBtn.click();
                console.log("已点击‘还未提交互评’按钮");

                setTimeout(() => performEvaluation(false, count), 2000); // 执行非自评
            } else {
                console.log("未找到‘还未提交互评’按钮,直接执行评分操作");
                performEvaluation(false, count); // 执行非自评
            }
        }, 1000);
    }

    // 执行评分、输入文本并提交的逻辑
    function performEvaluation(isSelfEvaluation, remainingCount = 1) {
        let targetInput = document.querySelector('input[type="radio"][value="100"]');
        if (targetInput) {
            let targetLabel = targetInput.closest('label');
            if (targetLabel) {
                targetLabel.click();
                console.log("目标单选按钮已点击");
            } else {
                console.error("未找到与 input 关联的 label");
            }
        } else {
            console.error("未找到 value=100 的单选按钮");
        }

        let textarea = document.querySelector('textarea[name="inputtxt"]');
        if (textarea) {
            textarea.value = userString;
            textarea.dispatchEvent(new Event('input', { bubbles: true })); // 触发 input 事件
            console.log("文本已输入到 textarea");
        } else {
            console.error("未找到目标 textarea");
        }

        let submitButton = document.querySelector('a.u-btn.u-btn-default.j-submitbtn');
        if (submitButton) {
            submitButton.click();
            console.log("提交按钮已点击");

            setTimeout(() => {
                if (isSelfEvaluation) {
                    console.log("自评完成,刷新页面...");
                    location.reload(); // 刷新页面
                } else if (remainingCount > 1) {
                    // 如果还有剩余执行次数,点击“继续评估下一份作业”并递减计数
                    clickNextEvaluation(remainingCount - 1);
                } else {
                    console.log("评分执行次数达到要求,Jump");
                    currentIndex=currentIndex+1;
                    navigateToUrlAndExecuteMain(currentIndex);
                }
            }, 2000); // 延迟 2 秒后执行下一步逻辑
        } else {
            console.error("未找到提交按钮");
        }
    }

    // 跳转到指定 URL 并继续执行 main
    function navigateToUrlAndExecuteMain(index) {
        if (index < urlList.length) {
            console.log(`跳转到 URL: ${urlList[index]} 并继续执行 main`);
            localStorage.setItem('currentIndex', index);
            window.location.href = urlList[index];
            setTimeout(main, 1000); // 跳转后等待 1 秒再执行 main
        } else {
            console.log("URL 列表已遍历完毕,脚本结束。");
            localStorage.removeItem('currentIndex');
            localStorage.removeItem('count'); // 清除 count 值
        }
    }

    // 脚本启动:跳转到第一个 URL 并开始操作
    console.log("等待 1 秒后开始第一个跳转...");
    setTimeout(() => {
        navigateToUrlAndExecuteMain(currentIndex);
    }, 1000); // 初始延迟 1 秒
})();