Greasy Fork is available in English.

hnrcscExam

storehouse

This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greasyfork.org/scripts/496824/1387535/hnrcscExam.js

(function() {
    'use strict';
    /* globals jQuery, $, waitForKeyElements */
    unsafeWindow.GM_getValue = GM_getValue
    unsafeWindow.GM_deleteValue = GM_deleteValue
    unsafeWindow.GM_xmlhttpRequest = GM_xmlhttpRequest

    // 检查当前窗口是否为顶层窗口
    if (window.self === window.top) {
        if(window.location.href.split('?')[0].toString() != 'https://admin.hnpxw.org/learner/examine/openPaper.do'){
            return;// 如果是顶层窗口,则不执行脚本
        }
    }

    // 创建一个新的 script 标签
    var script = document.createElement('script');
    script.textContent = 'console.log("Script injected by Tampermonkey!");';

    // 将 script 标签插入到页面的 head 中
    document.head.appendChild(script);

    let btn1=GM_registerMenuCommand ("\u4f5c\u8005\uff1a\ud83c\udf49\u897f\u74dc\u8981\u5927\u7684\ud83c\udf49", function(){
        confirm("Hello,\u611f\u8c22\u4f7f\u7528\ud83c\udf49\u897f\u74dc\u5237\u8bfe\u52a9\u624b\ud83c\udf49\uff01\u591a\u591a\u53cd\u9988\u54e6");
        GM_unregisterMenuCommand(btn1);
    }, "");
    let btn2=GM_registerMenuCommand ("\u4ed8\u8d39\u5185\u5bb9", function(){
        alert("\u9650\u65f6\u514d\u8d39\uff0c\u5168\u529b\u5f00\u53d1\u4e2d...");
    }, "p");

    var ddds3 = null;
    var addMessage = null;

    const panel = function(){
        var container = $('<div id="gm-interface"></div>');
        var titleBar = $('<div id="gm-title-bar">\ud83c\udf49\u897f\u74dc\u7f51\u8bfe\u52a9\u624b\ud83c\udf49</div>');
        var minimizeButton = $('<div title="\u6536\u8d77" style="display:black"><svg id="gm-minimize-button" class="bi bi-dash-square" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M14 1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/><path fill-rule="evenodd" d="M3.5 8a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 0 1H4a.5.5 0 0 1-.5-.5z"/></svg></div>');
        var maxButton = $('<div title="\u5c55\u5f00" style="display:none"><svg id="gm-minimize-button" class="bi bi-plus-square" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 3.5a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5H4a.5.5 0 0 1 0-1h3.5V4a.5.5 0 0 1 .5-.5z"/><path fill-rule="evenodd" d="M7.5 8a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1H8.5V12a.5.5 0 0 1-1 0V8z"/><path fill-rule="evenodd" d="M14 1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/></svg></div>');
        var content = $('<div id="gm-content"></div>');
        var tips = $('<div class="tip" style="display:none;">\u957f\u6309\u62d6\u62fd</div>');
        var scrollText = $('<marquee>').text('\u4e7e\u5764\u672a\u5b9a\uff0c\u4f60\u6211\u7686\u662f\u9ed1\u9a6c----\u4f5c\u8005\uff1a\u897f\u74dc\u8981\u5927\u7684\uff08\u611f\u8c22\u652f\u6301\uff01\uff09').css({
            'position': 'absolute',
            'top': '15%',
            'left': '50%',
            'transform': 'translate(-50%, -50%)',
            'width': '90%',
            'height': '25px',
            'font-size': '16px',
            'line-height': '1.5',
            'white-space': 'nowrap'
        }).appendTo(content);
        //var ddds1 = $('<div style="position: absolute;top: 20%;width:90%;height:10%;padding: 3px;background: #ffedf0;border-radius: 5px;">\u70b9\u51fb\u542f\u52a8\uff1a<button id="startxg" style="position: absolute;width:48px;right: 10px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">\u542f\u52a8</button></div>');
        //var ddds5 = $('<div style="position: absolute;top: 35%;width:90%;height:10%;padding: 3px;background: #ffedf0;border-radius: 5px;">\u70b9\u51fb\u542f\u52a8\uff1a<button id="stopxg" style="position: absolute;width:48px;right: 10px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">暂停</button></div>');
        //var ddds2 = $('<div style="position: absolute;top: 50%;width:90%;height:10%;padding: 3px;background: #ffedf0;border-radius: 5px;">\u89c6\u9891\u500d\u901f\uff1a<button id="speedxg" style="position: absolute;width:48px;right: 10px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">X16</button></div>');
        ddds3 = $('<div id="message-container" style="position: absolute;display: grid;align-content: baseline;justify-content: center;top: 20%;width:94%;height:62%;max-height:62%;overflow-y:auto;padding: 3px;background: #ffffff;border-radius: 5px;"></div>');
        var ddds4 = $('<div style="position: absolute;top: 85%;width:94%;height:10%;padding: 3px;background: #ffedf0;border-radius: 5px;"><button id="saveExam" style="position: absolute;width:69;right: 356px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">录入</button><button id="beginExam" style="position: absolute;width:69;right: 306px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">考试</button><button id="delExam" style="position: absolute;width:69;right: 256px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">删除</button><a href="http://8.130.116.135/?article/" style="position: absolute;right: 10px;text-decoration: none;color: pink;">\u003e\u003e\u003e\u8054\u7cfb\u003a\u0031\u0039\u0030\u0038\u0032\u0034\u0035\u0033\u0030\u0032\u0040\u0071\u0071\u002e\u0063\u006f\u006d</a></div>');

        container.append(titleBar);
        //content.append(ddds1);
        //content.append(ddds5);
        //content.append(ddds2);
        content.append(ddds3);
        content.append(ddds4);
        container.append(content);
        container.append(maxButton);
        container.append(minimizeButton);
        $('body').append(container);
        $('body').append(tips);

        GM_addStyle(`
        #gm-interface {
            position: fixed;
            top: 10%;
            left: 70%;
            border-radius: 5px;
            background-color: white;
            z-index: 9999;
        }

        #gm-title-bar {
            padding: 5px;
            background-color: #ffc0c0;
            border: 1px solid black;
            border-radius: 5px;
            cursor: grab;
        }

        #gm-minimize-button {
            position: absolute;
            top: 2px;
            right: 2px;
            width: 30px;
            height: 30px;
            border-radius: 5px;
            padding: 0;
            font-weight: bold;
            background-color: #ffc0c0;
            cursor: pointer;
        }

        #gm-content {
            padding: 10px;
            border: 1px solid black;
            border-radius: 2px 2px 5px 5px;
            background-color: #ffe5e5;
            width: 400px;
            height: 300px;
        }
        .tip{
            font-family: "黑体";
            color: black;
            -webkit-transform: scale(0.8);
            position:absolute;
            padding: 6px 5px;
            background-color:#ffe8f0;
            border-radius: 4px;
            z-index: 9999;
        }
    `);

        titleBar.on('mousemove',function(e){
            tips.attr("style", "display:black;");
            var top = e.pageY+5;
            var left = e.pageX+5;
            tips.css({
                'top' : top + 'px',
                'left': left+ 'px'
            });
        });

        titleBar.on('mouseout',function(){
            tips.hide();
        });

        titleBar.on('mousedown', function(e) {
            var startX = e.pageX - container.offset().left + window.scrollX;
            var startY = e.pageY - container.offset().top + window.scrollY;

            $(document).on('mousemove', function(e) {
                e.preventDefault();
                var newX = e.pageX - startX;
                var newY = e.pageY - startY;
                container.css({ left: newX, top: newY });
            });

            $(document).on('mouseup', function() {
                $(document).off('mousemove');
                $(document).off('mouseup');
            });
        });


        $("#beginExam").on('click',function(){
            ddds3.children().remove();
            let examName = $('<div id="tableForm"><div><input type="text" id="xgExamName" placeholder="请输入考试课程名称"></div><button id="xgSelect" style="width:88px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">开始</button></div>');
            examName.appendTo(ddds3);

            $("#xgSelect").on('click',function(){
                let ju = getAnswerByName();
                if(!ju){
                    return;
                }

                ddds3.children().remove();
                addMessage('开始答题:'+ju);
                document.querySelector("#insertPaper").children[1].children[0].children[2].click();
                let danxuanCount = document.querySelector("#insertPaper").children[2].childElementCount;
                nowAnswer = ju;
                beginExam(danxuanCount);
            });

            pintOldData();
        });

        $('#saveExam').on('click',function(){
            ddds3.children().remove();
            let tableForm = $('<div id="tableForm"><div><input type="text" id="xgExamName" placeholder="请输入考试课程名称"></div><div><textarea type="text" id="xgAnswer" placeholder="请输入答案集"></textarea></div><button id="xgSave" style="width:88px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">保存</button></div>');
            tableForm.appendTo(ddds3);

            $("#xgSave").on('click',function(){
                let xgExamName = $("#xgExamName").val();
                let xgAnswer = $("#xgAnswer").val();
                if(xgExamName === '' || xgExamName === null || xgExamName === undefined){
                    alert("考试课程不可为空!");
                }
                else if(xgAnswer === '' || xgAnswer === null || xgAnswer === undefined){
                    alert("答案集不可为空!");
                }
                else{
                    console.log(xgAnswer);
                    let aw = xgAnswer.split(',');
                    saveAnswer(xgExamName,aw);
                    alert('保存成功:('+JSON.stringify(aw)+'),刷新页面即可自启动');
                }
            });

            pintOldData();
        });

        $("#delExam").on('click',function(){
            ddds3.children().remove();
            // GM_deleteValue('answerList');
            addMessage("未获取删除权限");
        });

        minimizeButton.on('click', function() {
            minimizeButton.attr("style", "display:none;");
            maxButton.attr("style", "display:black;");
            content.slideToggle(0);
            container.css({ width: 200 });
        });

        maxButton.on('click', function() {
            minimizeButton.attr("style", "display:black;");
            maxButton.attr("style", "display:none;");
            content.slideToggle(0);
            container.css({ width: 422 });
        });

        ddds3.on('mousewheel', function(event) {
            event.preventDefault();
            var scrollTop = ddds3.scrollTop();
            ddds3.scrollTop(scrollTop + event.originalEvent.deltaY);
        });

        addMessage = function(message){
            if (ddds3.children().length >= 288) {
                ddds3.children().first().remove();
            }
            var messageElement = $('<div class="message"></div>').text(message).css({
                'margin-bottom': '10px'
            }).appendTo(ddds3);
        }

    }

    function pintOldData(){
        addMessage('保存记录:');
        getAnswer().forEach(obj => {
            for (let key in obj) {
                addMessage(key);
            }
        });
    }

    function getAnswerByName(){
        let xgExamName = $("#xgExamName").val();

        if(xgExamName === '' || xgExamName === null || xgExamName === undefined){
            alert("考试课程不可为空!");
            return false;
        }

        let data = getAnswer();

        let result = data.reduce((accumulator,obj) => {
            if(xgExamName in obj){
                return obj[xgExamName];
            }
            return accumulator;
        },undefined);

        if(!result){
            addMessage('没有此考试数据!');
            return false;
        }
        return result;
    }

    function getAnswer(){
        let oldData = GM_getValue('answerList');

        if(Array.isArray(oldData)){
            return oldData;
        }

        return [];
    }

    function saveAnswer(name,content){
        let answer = getAnswer();

        let existIndex = answer.findIndex(obj => name in obj);

        if (existIndex !== -1) {
            // 更新值为['1','2','3']
            answer[existIndex][name] = content;
        } else {
            // push新集合
            let tempMap = {};
            tempMap[name] = content;
            answer.push(tempMap);
        }

        GM_setValue('answerList',answer);
    }

    panel();
    addMessage("》》》》》辅助工具");


    var wait = null;
    var overlay;
    function startSetInt(){
        wait = setInterval(function (){
            ddds3.children().remove();
            addMessage("考试");
            if(window.location.href.split('?')[0].toString() === 'https://admin.hnpxw.org/learner/examine/openPaper.do'){
                try{
                    tipsWin().then((result) => {
                        if(!result){
                            // ddds3.children().remove();
                            addMessage("启动");
                            setTimeout(function(){

                            },1000);
                        }else{
                            addMessage("取消");
                        }
                    });
                }catch(e){
                    addMessage(e);
                }
            }
            else{
                addMessage("当前状态无法使用");
            }
            stopTimer();
        }, 900);
    }

    // 手动停止定时器
    function stopTimer() {
        clearInterval(wait);
    }

    function tipsWin(){
        return new Promise((resolve, reject) => {

            var popup = document.createElement('div');
            popup.id = 'customPopup';
            popup.style.display = 'none';
            popup.style.position = 'fixed';
            popup.style.top = '50%';
            popup.style.left = '50%';
            popup.style.transform = 'translate(-50%, -50%)';
            popup.style.backgroundColor = '#fff';
            popup.style.padding = '20px';
            popup.style.border = '1px solid #ccc';
            popup.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.2)';
            popup.style.zIndex = '9999';
            popup.innerHTML = `
        <p id="timeCount">5秒后执行脚本?</p>
        <button id="confirmButton">是</button>
        <button id="cancelButton">否</button>
       `;

            document.body.appendChild(popup);

            var confirmButton = document.getElementById('confirmButton');
            var cancelButton = document.getElementById('cancelButton');
            var confirmed = false;
            let juNext = false;

            popup.style.display = 'block';

            confirmButton.addEventListener('click', function() {
                confirmed = true;
                closePopup();
                resolve(false);
            });

            cancelButton.addEventListener('click', function() {
                ddds3.children().remove();
                addMessage("刷新页面即可重启");
                confirmed = true;
                closePopup();
                resolve(true);
            });

            function ju(time){
                if(!confirmed){
                    if(time < 1){
                        popup.innerHTML = ` <p>时间到了! 脚本启动.</p>`;
                        setTimeout(function() {
                            closePopup();
                            resolve(false);

                        }, 1000);
                    }
                    else{
                        document.getElementById('timeCount').innerText = time+'秒后执行脚本?';
                    }

                    setTimeout(function(){
                        ju(--time)
                    },1000);

                }
            }

            ju(5);

            function closePopup() {
                popup.style.display = 'none';
            }
        });

    }

    function toggleOverlay(show) {
        if (show) {
            overlay = document.createElement('div');
            overlay.style.position = 'fixed';
            overlay.style.top = '0';
            overlay.style.left = '0';
            overlay.style.width = '100%';
            overlay.style.height = '100%';
            overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
            overlay.style.zIndex = '9999';

            overlay.addEventListener('click', function(event) {
                event.stopPropagation();
                event.preventDefault();
            });

            document.body.appendChild(overlay);
        } else {
            if (overlay) {
                overlay.parentNode.removeChild(overlay);
                overlay = null;
            }
        }
    }

    startSetInt();

    var nowAnswer = null;
    var questionIndex = 3;
    var answerIndex = 0;
    function beginExam(count){
        if(questionIndex < count){
            console.log();
            inputRadio(0,nowAnswer[answerIndex],count,2);
        }
        else{
            addMessage('单选结束');
            nowAnswer.splice(0,count/4);
            questionIndex = 3;
            answerIndex = 0;

            document.querySelector("#insertPaper").children[1].children[0].children[3].click();
            let duoxuanCount = document.querySelector("#insertPaper").children[3].childElementCount;

            setTimeout(function(){
                beginExamTow(duoxuanCount);
            },1000);
        }
    }

    function beginExamTow(count){

        if(questionIndex < count){
            inputRadio(0,nowAnswer[answerIndex],count,3);
        }
        else{
            addMessage('多选结束');
            nowAnswer.splice(0,count/4);
            questionIndex = 3;
            answerIndex = 0;

            document.querySelector("#insertPaper").children[1].children[0].children[4].click();
            let duoxuanCount = document.querySelector("#insertPaper").children[4].childElementCount;

            setTimeout(function(){
                beginExamThree(duoxuanCount);
            },1000);
        }
    }

    function beginExamThree(count){

        if(questionIndex < count){
            inputRadio(0,nowAnswer[answerIndex],count,4);
        }
        else{
            addMessage('答题完毕'+nowAnswer.length);
            nowAnswer.splice(0,count/4);
            questionIndex = 3;
            answerIndex = 0;
        }
    }

    function inputRadio(index,answer,count,page){
        let tempAW = answer;
        let tempCount = count;
        let tempPage = page;
        console.log(index,answer,count,page);
        if(index < tempAW.length){
            switch(answer[index])
            {
                case 'A':
                    console.log("第"+(answerIndex+1)+"题选","A");
                    radioOk(0,page);
                    break;
                case 'B':
                    console.log("第"+(answerIndex+1)+"题选","B");
                    radioOk(1,page);
                    break;
                case 'C':
                    console.log("第"+(answerIndex+1)+"题选","C");
                    radioOk(2,page);
                    break;
                case 'D':
                    console.log("第"+(answerIndex+1)+"题选","D");
                    radioOk(3,page);
                    break;
                case 'E':
                    console.log("第"+(answerIndex+1)+"题选","E");
                    radioOk(4,page);
                    break;
                case '√':
                    console.log("第"+(answerIndex+1)+"题选","是");
                    radioOk(0,page);
                    break;
                case '×':
                    console.log("第"+(answerIndex+1)+"题选","否");
                    radioOk(1,page);
                    break;
            }

            setTimeout(function(){
                inputRadio(++index,tempAW,tempCount,tempPage)
            },200);
        }else{
            console.log("第"+(answerIndex+1)+"题结束");
            setTimeout(function(){
                questionIndex+=4;
                answerIndex++;

                switch(page)
                {
                    case 2:
                        beginExam(count);
                        break;
                    case 3:
                        beginExamTow(count);
                        break;
                    case 4:
                        beginExamThree(count);
                        break;
                }
            },333);
        }
    }

    function radioOk(index,page){
        if(!document.querySelector("#insertPaper").children[page].children[questionIndex].getElementsByTagName('input')[index].checked){
            document.querySelector("#insertPaper").children[page].children[questionIndex].getElementsByTagName('input')[index].click();
        }
        else{
            console.log('无需重复选择');
        }
    }
})();