高等继续教育网自动刷题,支持【单选题、多选题、简答题、填空题、在线考试】

已停更,永久免费,不保证百分百可用

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         高等继续教育网自动刷题,支持【单选题、多选题、简答题、填空题、在线考试】
// @description  已停更,永久免费,不保证百分百可用
// @namespace    http://tampermonkey.net/
// @version      0.1.4
// @description  
// @author       nightjarjar
// @match        https://kc.jxjypt.cn/paper/start*
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
    'use strict';

    // 获取所有的问题项(li元素)
    let questionItems = document.querySelectorAll('li[id^="question_li_"]');

    // 遍历每个问题项
    questionItems.forEach(function (item) {

        // 获取“展开解析”的链接元素
        let expandLink = item.querySelector('.zkjx');

        // 模拟点击“展开解析”
        if (expandLink) {
            expandLink.click();

            // 等待异步请求完成,然后获取参考答案并填充到textarea中
            setTimeout(function () {
                fillReferenceAnswer(item);
            }, 1000); // 可根据实际情况调整等待时间
        } else {
            // 获取隐藏域的值
            let pqidValue = item.querySelector('input[name^="pqid"]').value;
            console.debug('pqid value:', pqidValue);

            let captchaIdValue = document.querySelector('#captchaId').value;
            console.log(captchaIdValue);

            $.ajax({
                url: "question/resolve/txt",
                data: {uid: captchaIdValue, pqid: pqidValue},
                success: function (data) {
                    if (data.type === "success") {
                        fillReferenceAnswer(item, data.content);
                    }
                }
            });
        }

    });

    // 填充参考答案到textarea的函数
    function fillReferenceAnswer(item, referenceAnswerText) {
        // 获取当前问题项的答案文本
        let answerText;
        if(referenceAnswerText != null){
            answerText = referenceAnswerText;
        }else{
            answerText = item.querySelector('.solution').textContent.trim();
        }


        // 寻找“参考答案:”后的内容
        let startIndex = answerText.indexOf('释疑:');
        let endIndex = answerText.indexOf('解析:');
        let referenceAnswer = answerText.substring(startIndex + 5, endIndex).trim();

        // 如果 referenceAnswer 的长度大于 1,则认为是多选题,逐个模拟点击对应的 dd 标签
        if (referenceAnswer.length > 1) {
            simulateClickOnMultipleDD(item, referenceAnswer);
        } else {
            // 模拟点击与参考答案相匹配的 dd 标签
            simulateClickOnCorrectDD(item, referenceAnswer);
        }

        // 获取当前问题项的 textarea 元素
        let textarea = item.querySelector('textarea');

        // 将截取的文本填充到 textarea 中
        if (textarea && referenceAnswer) {
            textarea.value = referenceAnswer;

            // 手动触发输入事件(change)
            let changeEvent = new Event('change', {bubbles: true});
            textarea.dispatchEvent(changeEvent);

            // 手动触发失去焦点事件(blur)
            textarea.blur();
        }
    }

    // 模拟点击与参考答案相匹配的 dd 标签
    function simulateClickOnCorrectDD(item, referenceAnswer) {
        // 获取当前问题项的所有 dd 标签
        let ddList = item.querySelectorAll('.sub-answer dd');

        // 遍历 dd 标签
        ddList.forEach(function (dd) {
            // 获取当前 dd 标签的 data-value 属性值
            let ddValue = dd.getAttribute('data-value');

            // 如果当前 dd 标签的值与参考答案匹配,则模拟点击事件
            if (ddValue === referenceAnswer) {
                dd.click();
            }
        });
    }

    // 多选题情况下,逐个模拟点击对应的 dd 标签
    function simulateClickOnMultipleDD(item, referenceAnswer) {
        // 获取当前问题项的所有 dd 标签
        let ddList = item.querySelectorAll('.sub-answer dd');

        // 遍历 referenceAnswer 中的每个字符,逐个模拟点击对应的 dd 标签
        for (let i = 0; i < referenceAnswer.length; i++) {
            let currentChar = referenceAnswer[i];

            // 找到对应的 dd 标签并模拟点击
            let correspondingDD = findDDByValue(ddList, currentChar);
            if (correspondingDD) {
                correspondingDD.click();
            }
        }
    }

    // 根据 data-value 的值找到对应的 dd 标签
    function findDDByValue(ddList, value) {
        for (let i = 0; i < ddList.length; i++) {
            let ddValue = ddList[i].getAttribute('data-value');
            if (ddValue === value) {
                return ddList[i];
            }
        }
        return null;
    }
})();