Greasy Fork

Greasy Fork is available in English.

🔥知到/智慧树-网课【答题小助手】-- 持续更新 | 支持作业、测验、考试答题 | 题库持续更新 | 题库永久免费 |✍💯

🔥知到/智慧树-网课答题小助手。支持以下功能:1、智慧树课堂测验答题【支持自动搜索相关题目、自动做题和保存】;2、智慧树课程考试答题【支持自动搜索相关题目、自动做题和保存】

在您安装前,Greasy Fork 希望您知道此脚本声明其包含了一些负面功能。这些功能也许会使脚本作者获利,而不能给您带来任何直接的金钱收益。

此脚本会在您访问的网站中插入广告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         🔥知到/智慧树-网课【答题小助手】-- 持续更新 | 支持作业、测验、考试答题 | 题库持续更新 | 题库永久免费 |✍💯
// @namespace    starlism
// @version      1.3
// @description  🔥知到/智慧树-网课答题小助手。支持以下功能:1、智慧树课堂测验答题【支持自动搜索相关题目、自动做题和保存】;2、智慧树课程考试答题【支持自动搜索相关题目、自动做题和保存】
// @author       starlism
// @match        *://*.zhihuishu.com/stuExamWeb*
// @connect      free.tikuhai.com
// @run-at       document-start
// @grant        unsafeWindow
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_getValue
// @resource css https://unpkg.com/[email protected]/dist/css/bootstrap.min.css
// @license      MIT
// @antifeature  ads
// ==/UserScript==

const qrCode = `
data:image/png;base64,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
`

enableWebpackHook();

const sleep = (ms) => {
    return new Promise(resolve => setTimeout(resolve, ms));
};

const config = {
    awaitTime: 5000,
    stopTimer: false,
    questionCount: 0,
    finishCount: 0,
    questionType: {
        '判断题': 10,
        '单选题': 20,
        '多选题': 25,
        '填空题': 30,
        '问答题': 40,
    }
};

// answer question and click to next question
function answerQuestion(questionBody, questionIndex) {
    const questionTitle = questionBody.querySelector('.subject_describe div,.smallStem_describe p').__Ivue__._data.shadowDom.textContent;
    appendToTable(questionTitle,"", questionIndex);
    // 题目类型处理
    const questionType = questionBody.querySelector(".subject_type").innerText.match(/【(.+)】|$/)[1]
    let type = config.questionType[questionType]
    if (type === undefined) {
        type = -1;
    }
    // console.log(type);
    // get answer
    GM_xmlhttpRequest({
        method: "GET",
        url: "https://free.tikuhai.com/q?q=" + encodeURIComponent(questionTitle),
        //         headers: {
        //             "Content-type": "application/x-www-form-urlencoded"
        //         },
        //         data: 'question=' + encodeURIComponent(questionTitle),
        onload: function(xhr) {
            const res = JSON.parse(xhr.responseText);
            const msg = res.msg;
            let answerString = res.data;
            if (msg === "暂无答案") {
                answerString = "暂无答案"
                changeAnswerInTable(answerString, questionIndex, true)
            } else {
                let isSelect = chooseAnswer(type, questionBody, answerString);
                changeAnswerInTable(answerString, questionIndex, isSelect)
            }
            // switch to next question
            document.querySelectorAll('.switch-btn-box > button')[1].click()
        },
        onerror: function(err) {
            console.log(err)
        }
    });
}

// choose the correct option of question
function chooseAnswer(questionType, questionBody, answerString) {
    let isSelect = false;
    // 判断题
    if (questionType === 10) {
        // 获取选项
        const firstOptionText = questionBody.querySelector(".node_detail")
        const firstOption = questionBody.querySelector(".nodeLab")
        // 选项表示正确
        if (firstOptionText.innerText.match(/(^|,)(正确|是|对|√|T|ri|right|true)(,|$)/)) {
            if (answerString.match(/(^|,)(正确|是|对|√|T|ri|right|true)(,|$)/)) {
                firstOption.click();
                isSelect = true;
            } else {
                // const secondOption = questionBody.querySelectorAll(".nodeLab")[1];
                // secondOption.cilck();
                questionBody.querySelectorAll(".nodeLab")[1].click();
                isSelect = true;
            }
        } else {
            if (answerString.match(/(^|,)(正确|是|对|√|T|ri|right|true)(,|$)/)) {
                // const secondOption = questionBody.querySelectorAll(".nodeLab")[1];
                // secondOption.cilck();
                questionBody.querySelectorAll(".nodeLab")[1].click();
                isSelect = true;
            } else {
                firstOption.click();
                isSelect = true;
            }
        }
    }
    // 单选题
    if (questionType === 20) {
        const regexPattern = new RegExp("^(" + answerString + ")$");
        // 获取所有选项
        const optionsTextAll = questionBody.querySelectorAll(".node_detail")
        const optionsAll = questionBody.querySelectorAll(".nodeLab")
        for (let i = 0; i < optionsAll.length; i++) {
            if (regexPattern.test(optionsTextAll[i].innerText)) {
                optionsAll[i].click();
                isSelect = true;
                break;
            }
        }
    }
    // 多选题
    if (questionType === 25) {
        const regexPattern = new RegExp("^(" + answerString + ")$");
        // 获取所有选项
        const optionsTextAll = questionBody.querySelectorAll(".node_detail")
        const optionsAll = questionBody.querySelectorAll(".nodeLab")
        for (let i = 0; i < optionsAll.length; i++) {
            if (regexPattern.test(optionsTextAll[i].innerText)) {
                optionsAll[i].click();
                isSelect = true;
            }
        }
    }
    // 填空题

    // 问答题

    return isSelect;
}

function appendToTable(questionTitle, answerString, questionIndex) {
    const table = document.querySelector("#record-table");
    table.innerHTML += `<tr><td>` + questionIndex + `</td><td>` + questionTitle + `</td><td id=answer${questionIndex}>正在搜索...</td></tr>`
    //     const tr = document.createElement("tr");
    //     tr.appendChild(1);
    //     tr.appendChild(questionTitle);
    //     tr.appendChild(answerString);
    //     table.appendChild(tr)
}

function changeAnswerInTable(answerString, questionIndex, isSelect) {
    document.querySelector(`#answer${questionIndex}`).innerText = answerString;
    if (answerString === "暂无答案") {
        // document.querySelector(`#answer${questionIndex}`).style.color = 'red';
        document.querySelector(`#answer${questionIndex}`).insertAdjacentHTML('beforeend',`<p style="color:red">扫码下载APP从完整版题库中获取答案</p>`)
    }
    if (!isSelect) {
        document.querySelector(`#answer${questionIndex}`).insertAdjacentHTML('beforeend',`<p style="color:green">未匹配答案,请根据搜索结果手动选择答案</p>`)
    }
}

function enableWebpackHook() {
    let originCall = Function.prototype.call
    Function.prototype.call = function (...args) {
        const result = originCall.apply(this, args)
        if (args[2]?.default?.version === '2.5.2') {
            args[2]?.default?.mixin({
                mounted: function () {
                    this.$el['__Ivue__'] = this
                }
            })
        }
        return result
    }
}


unsafeWindow.onload = (() => (async () => {
    // css style
    GM_addStyle(GM_getResourceText("css"));
    const cssStyle = `
    <div class="panel panel-info" style="z-index:99999; position:fixed; left:0; top:10%; width:22vw">
      <div class="panel-heading">
        <h3 class="panel-title" style="display:flex; align-items:center; justify-content:center">✍智慧树网课作业考试小助手✍</h3>
      </div>
      <div class="panel-body" id="qr-code" style="display:flex; align-items:center; justify-content:center; margin-top:-10px"></div>
      <div class="panel-body" style="display:flex; align-items:center; justify-content:center; margin-top:-30px">扫码下载APP,获得完整版题库答案</div>
      <div style="display:flex; align-items:center; justify-content:center">读取题目中...</div>
      <div class="panel-body" style="max-height:35vh; overflow-y:scroll; margin-top:0px">
        <div class="bs-example" data-example-id="bordered-table">
          <table class="table table-bordered" id="record-table">
            <thead>
              <tr>
                <th>#</th>
                <th>题目</th>
                <th>答案</th>
              </tr>
            </thead>
            <tbody>
            </tbody>
          </table>
        </div>
      </div>
    </div>
    `
    document.body.insertAdjacentHTML('beforeend', cssStyle);

    // QR Code
    const img = new Image();
    img.src = qrCode;
    img.width = 200;
    img.height = 200;
    document.querySelector("#qr-code").appendChild(img);

    // wait load
    await sleep(config.awaitTime);

    // get all question body
    var questionBodyAll = document.querySelectorAll(".examPaper_subject.mt20")
    if (questionBodyAll.length === 0) {
        return;
    }
    config.questionCount = questionBodyAll.length;

    // generate interval
    answerQuestion(questionBodyAll[0], 1)
    let finishCount = 1;
    var interval = setInterval(()=>{
        answerQuestion(questionBodyAll[finishCount], finishCount+1);
        finishCount += 1;
        if (finishCount === questionBodyAll.length) {
            clearInterval(interval);
            return;
        }
    }, 3000);

    //     for (let i = 0; i < questionBodyAll.length; i++) {
    //         setTimeout(answerQuestion(questionBodyAll[i]), 1000*i);
    //     }


    // setInterval(()=>{answerQuestion()}, 1000);

    // document.querySelector(".asdfgh").innerHTML = questionTitle
    // console.log(questionTitle)
    // Your code here...
}))();