Greasy Fork

Greasy Fork is available in English.

遇见八三的心动瞬间

学企来砍一刀

当前为 2024-01-01 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         遇见八三的心动瞬间
// @namespace    
// @version      1.1.1
// @description  学企来砍一刀
// @author       我纯f5捏
// @match        https://www.cscec83.cn/user/login*
// @match        http://120.27.194.253/*
// @match        https://learn.cscec83.cn/*
// @exclude      https://www.cscec83.cn/dashboard/analysis*
// @compatible   edge
// @license
// @icon         https://s11.ax1x.com/2023/12/30/piOtPX9.jpg
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// @require      https://cdn.jsdelivr.net/npm/tesseract.js@5/dist/tesseract.min.js
// @require      https://update.greasyfork.icu/scripts/447483/1071404/Boxjs.js
// @require      https://update.greasyfork.icu/scripts/483542/1304560/gk%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%B8%80%E8%A6%A7.js
// ==/UserScript==

/*
***********************************************************

        以上参数为脚本必须读取的脚本元属性值,请勿随意改动
        以下参数修改请参见语雀功能文档或者代码注释定制化修改

***********************************************************
*/
(function () {
    'use strict';
    var oldStudyAdminRevise = true; // 控制学企来首页修改, true 为刷新; false 为不刷;
    var cscecAdminCount = true; // 控制主页刷新次数, true 为刷新; false 为不刷新;
    var rootFontSize = 46.6667; // 页面如果大小显示异常, 可尝试修改, 请勿随意变动此数值;
    var clickNextPage = true; // 旧版学企来部门中心默认进入第二页, false 则不翻页;
    var answerTimeGap = 400; // 一键做题操作间隔, 太快页面来不及响应, 太慢影响使用, 单位:ms;
    var loginCheck = 500; // 输入验证码后登录的间隔, 太快无法响应, 太慢影响使用, 单位:ms;
    var monitorGap = 400; // 控制url监控间隔, 太快会影响性能, 太慢影响使用, 单位:ms;

    /*
    ***********************************************************

            以下参数为功能必须的参数初始化或功能预留,请勿随意改动

    ***********************************************************
    */

    var questionAnswerTexts = ''; // 防止答案混淆,目前考试无答案混淆,只做预防
    var questionAnswerText = '';
    var clickMyPractice = true;
    var questionTypeText = '';
    var isDraggable = false;
    var titleMsgAlert = "";
    var innerMsgAlert = "";
    var currentUser = "";
    var userRemind = '';
    var a = "";
    var b = "";
    var C = "";
    var d = "";
    var oldPracticeData = [];
    var practiceData = [];
    var savedData = [];

    overrideOpen();
    setMouseImg();
    setTipsImg();
    webPageWatchUrl(urlOperate);

    window.onload = function () {
        addDiv();
        changeByClick();
        var tipsCard = document.getElementById("tipsCard");
        tipsCard.addEventListener('mouseover', displayTipsImg);
        tipsCard.addEventListener('mouseout', vanishTipsImg);
        tipsCard.addEventListener('mousemove', displayTipsImg);
        document.addEventListener('mousemove', mouseImgMove);
        document.querySelectorAll(".getQAOption")[0].addEventListener('click', getabAndToast);
        document.querySelectorAll(".option2")[0].addEventListener('click', function () {
            if (getab()) { answerCheck(); } else { getabAndToast(); }
        });
        // 一键答题
        document.querySelectorAll(".option3")[0].addEventListener('click', function () {
            if (getab()) { autoAnswerCheck(); } else { getabAndToast(); }
        });
        document.querySelectorAll(".option7")[0].addEventListener('click', fillVerificationCode);
    }

    function reviseRem() {
        var root = document.documentElement;
        var currentSize = parseFloat(window.getComputedStyle(root).fontSize);
        if (currentSize !== rootFontSize) {
            // root.style.fontSize = `${currentSize * 4}px`;
            root.style.fontSize = rootFontSize + "px"
        }
    }

    function webPageWatchUrl(watchCallback) {
        watchCallback();
        var currentUrl = window.location.href;
        setInterval(function () {
            if (currentUrl !== window.location.href) {
                currentUrl = window.location.href;
                watchCallback(currentUrl);
            }
        }, monitorGap);
    }

    function urlOperate(url) {
        reviseRem();
        if (window.location.href.includes('https://www.cscec83.cn/dashboard/analysis') && cscecAdminCount) {
            location.reload();
            cscecAdminCount = false;
        };
        if ((window.location.href === ('http://120.27.194.253/') || window.location.href === ('http://120.27.194.253/index')) && oldStudyAdminRevise) {
            try {
                let targetElement = document.querySelectorAll(".nav_item")[0];
                targetElement.innerText = "科技质量";
                targetElement.style.color = 'red';
                targetElement.style.fontWeight = 'bold';
                targetElement.parentNode.setAttribute("href", "/org/pgdJgz");
                oldStudyAdminRevise = false;
            } catch (error) {
                console.log("old学企来首页科技质量修改失败");
            }
        }
        if (window.location.href == 'http://120.27.194.253/org') {
            setApartmentCSS();
            if (clickNextPage) {
                // 进入第二页
                try {
                    document.querySelector("#app > div > div.content > div.pagination.el-pagination.is-background > button.btn-next").click();
                    clickNextPage = false;
                } catch (error) {
                    console.log("自动点击'我的'失败");
                };
            };
            let departmentElement = document.querySelectorAll(".mechanism_item > .mechanism_item_title");
            for (let i = 0; i < departmentElement.length; i++) {
                let targetElement = departmentElement[i];
                if (targetElement.innerText == '科技质量部') {
                    targetElement.style.color = 'red';
                    targetElement.style.fontWeight = 'bold';
                };
            };
        };
        if (window.location.href.match(new RegExp('http://120.27.194.253/org/[a-zA-Z]{6}$')) !== null) {
            try {
                if (clickMyPractice) {
                    ;
                    document.querySelector("#tab-my").click();
                    document.querySelector(".goods_type_list").childNodes[1].click();
                    clickMyPractice = false;
                }
            } catch (error) { clickMyPractice = false; };
        }
    };
    function fillVerificationCode() {
        if (window.location.href.includes('https://www.cscec83.cn/user/login')) {
            var imgSrc = document.querySelectorAll("img")[4].src;
            var image = new Image();
            image.src = imgSrc;
            const { createWorker } = Tesseract;
            (async () => {
                const worker = await createWorker('eng');
                const { data: { text } } = await worker.recognize(image);
                var inputElement = document.getElementById("inputCode");
                inputElement.value = text;
                // 创建并触发 input 事件
                var event = new Event('input', {
                    bubbles: true,
                    cancelable: true,
                });
                inputElement.dispatchEvent(event);
            })();
            setTimeout(function () {
                document.querySelector(".login-button").click();
            }, loginCheck);
        } else {
            toast("填写验证码", "此页面未添加本功能", 2e3);
            return false;
        }
    }

    // 移动
    function handleMouseDown(event) {
        isDraggable = true;
        var handleMoveDiv = document.getElementById("mainDiv");
        var offsetX = event.clientX - handleMoveDiv.getBoundingClientRect().left;
        var offsetY = event.clientY - handleMoveDiv.getBoundingClientRect().top;
        // 阻止默认行为和冒泡
        event.preventDefault();
        event.stopPropagation();
        document.addEventListener('mousemove', handleWindowMouseMove);
        document.addEventListener('mouseup', handleWindowMouseUp);
        function handleWindowMouseMove(event) {
            if (isDraggable) {
                requestAnimationFrame(() => {
                    handleMoveDiv.style.left = event.clientX - offsetX + 'px';
                    handleMoveDiv.style.top = event.clientY - offsetY + 'px';
                    window.getSelection().empty();
                });
            }
        }
        function handleWindowMouseUp() {
            isDraggable = false;
            document.removeEventListener('mousemove', handleWindowMouseMove);
            document.removeEventListener('mouseup', handleWindowMouseUp);
        }
    }

    // 给所有的可选按钮增加点击事件
    function changeByClick() {
        document.getElementById('movedCard').addEventListener('mousedown', handleMouseDown);
        // 给所有的图片增加点击事件(除了含有speedChoose类的)
        let images = document.querySelectorAll('.clickable-image');
        images.forEach(image => {
            // 检查图片是否包含speedChoose类,如果不包含则添加点击事件
            if (!image.classList.contains('speedChoose')) {
                image.addEventListener('click', function () {
                    this.classList.toggle('clicked');
                });
            }
        });
        // 按钮点击互斥
        var speedChooses = document.querySelectorAll('.speedChoose');
        speedChooses.forEach(function (box) {
            box.addEventListener('click', function () {
                // 如果当前按钮已经是点击状态,则取消点击状态,否则激活点击状态
                if (box.classList.contains('clicked')) {
                    box.classList.remove('clicked');
                } else {
                    // 点击任何一个box时,移除所有box的clicked类
                    speedChooses.forEach(function (otherBox) {
                        otherBox.classList.remove('clicked');
                    });
                    box.classList.add('clicked');
                }
            });
        });
    }

    function overrideOpen() {
        var open = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function () {
            var self = this;
            this.addEventListener('load', function () {
                var data = self.responseText;
                var isProfileData = (data.includes('userName') && data.includes('nickName') && data.includes('postGroup'));
                var isPracticeData = data.includes('testPaperTopics');
                var isOldPracticeData = data.includes('loginName') && data.includes('nickname') && data.includes('userNo');
                if (isProfileData || isPracticeData || isOldPracticeData) {
                    if (isProfileData) {
                        var profileData = profileData || [];
                        if (!Array.isArray(profileData)) {
                            profileData = [];
                        }
                        profileData = JSON.parse(data);
                        handleProfileData(profileData);
                    }
                    if (isPracticeData) {
                        practiceData = practiceData || [];
                        if (!Array.isArray(practiceData)) {
                            practiceData = [];
                        }
                        practiceData.push(JSON.parse(data));
                        handlePracticeData(practiceData);
                    }
                    if (isOldPracticeData) {
                        oldPracticeData = oldPracticeData || [];
                        if (!Array.isArray(oldPracticeData)) {
                            oldPracticeData = [];
                        }
                        oldPracticeData.push(JSON.parse(data));
                        handleOldPracticeData(oldPracticeData);
                    }
                }
            });
            open.apply(this, arguments);
        };
    }

    function handlePracticeData(practiceData) {
        return new Promise(function (resolve) {
            var targetArray = practiceData.find(function (response) {
                return response.msg === "操作成功" && response.code === 200 && response.data.testPaperTopics;
            });
            if (targetArray) {
                let formattedData = outputPracticeTopics(targetArray.data);
                savedData = formattedData.slice();
            } else {
                console.log('脚本未找到符合条件的题库信息');
            }
            practiceData.length = 0;
            resolve();
        });
    }

    function handleProfileData(profileData) {
        return new Promise(function (resolve) {
            var targetArray = Object.values(profileData).find(function (response) {
                return typeof response === 'object' && response !== null;
            });
            if (targetArray) {
                let result = {
                    userName: targetArray.userName,
                    nickName: targetArray.nickName,
                };
                let formattedData = outputProfileDataTopics(JSON.stringify(result));
                currentUser = formattedData;
                titleMsgAlert = currentUser.userName + " " + currentUser.nickName;
            } else {
                console.log("脚本未找到符合条件的个人信息");
            }
            targetArray = [];
            resolve();
        });
    }

    function handleOldPracticeData(oldPracticeData) {
        return new Promise(function (resolve) {
            var targetArray = oldPracticeData.find(function (response) {
                return response.code === 200 && response !== null;
            });
            if (targetArray) {
                let result = {
                    "userName": targetArray.data.loginName,
                    "nickName": targetArray.data.nickname,
                };
                currentUser = result;
                titleMsgAlert = result.userName + " " + result.nickName;
            } else {
                console.log("脚本未找到符合条件的个人信息");
            }
            targetArray = [];
            resolve();
        });
    }

    function answerCheck() {
        var isQuestionFound = savedData.some((questionObject) => {
            return trimText(questionObject.question) == trimText(document.querySelectorAll(".el-card__body")[1].childNodes[2].innerText);
        });
        if (isQuestionFound && getab()) {
            var answerList = [];
            let questionNumber = getQANumber();
            for (let i = 0; i < savedData.length; i++) {
                let answerArray = savedData[i].TrueAnswer.split(',');
                let numericArray = answerArray.map(function (letter) {
                    // 多减 1 个 1, 后面处理点击次序时方便
                    return letter.charCodeAt(0) - 65;
                });
                answerList.push(numericArray);
            }
            try {
                if (answerList[questionNumber - 1].length == 1) {
                    var targetAnswerElement = document.querySelectorAll(".el-radio-group")[0].childNodes[answerList[questionNumber - 1][0]];
                    if (targetAnswerElement && !targetAnswerElement.classList.contains('is-checked')) {
                        targetAnswerElement.click();
                        console.log("题号 " + questionNumber + " 点选: " + String.fromCharCode((answerList[questionNumber - 1][0] + 1) + 64));
                    } else {
                        console.log("用户选择过");
                    }
                } else if (answerList[questionNumber - 1].length > 1) {
                    for (let i = 0; i < answerList[questionNumber - 1].length; i++) {
                        (function (i) {
                            requestAnimationFrame(function () {
                                var targetAnswerElement = document.querySelectorAll(".el-checkbox-group")[0].childNodes[answerList[questionNumber - 1][i]];
                                if (targetAnswerElement && !targetAnswerElement.classList.contains('is-checked')) {
                                    targetAnswerElement.click();
                                    console.log("题号 " + questionNumber + " 点击选项: " + String.fromCharCode((answerList[questionNumber - 1][i] + 1) + 64));
                                } else {
                                    console.log("用户选择过了");
                                }
                            });
                        })(i);
                    }
                } else {
                    toast("提醒", "不在可答题的页面", 1e3);
                }
            } catch (error) {
                console.log("异常错误");
            }
        }
        else {
            toast("提醒", "尝试检查权限与操作", 2e3);
        }
    }

    function autoAnswerCheck() {
        if (getab()) {
            if (savedData.length == 0) {
                toast("提醒", "还未进入答题界面或未劫持到数据", 2e3);
            } else {
                for (let i = getQANumber() - 1; i < savedData.length; i++) {
                    try {
                        setTimeout(function () {
                            answerCheck();
                        }, answerTimeGap * i);
                    } catch (error) {
                        toast("提醒", "请正常手动答题或重新进入", 2e3);
                    }
                    try {
                        setTimeout(function () {
                            document.querySelectorAll(".el-button")[0].click();
                        }, answerTimeGap * (i + 1 / 2));
                    } catch (error) {
                        toast("提醒", "不在指定页面", 2e3);
                    }
                    if (i == savedData.length - 1) {
                        toast("√", "所有题目已完成", 2e3);
                    }
                }
            }
        } else {
            toast("权限提醒", "请联系管理员添加权限", 2e3);
        }
    }

    function getab() {
        if (window.location.href.includes('https://learn.cscec83.cn/') || window.location.href.includes('http://120.27.194.253/')) {
            try {
                var a = userList.some(function (user) {
                    if (user.userName === currentUser.userName && user.nickName === currentUser.nickName) {
                        return true;
                    } else {
                        return false;
                    }
                });
            } catch (error) {
                a = false;
                b = false;
                toast("提醒", "请从公司页面正常渠道进入", 1e3);
                return (a && b);
            }
            if (a) {
                try {
                    var userName = userList.find(u => u.userName === currentUser.userName);
                    var userTime = userName ? userName.time : null;
                } catch (error) {
                    console.log("时长获取错误。");
                    return (a && b);
                }
                innerMsgAlert = "";
                innerMsgAlert = verifyTime(userTime) ? verifyTime(userTime) : "  权限过期 请联系重新授权。";
                return (a && verifyTime(userTime));
            } else {
                innerMsgAlert = "";
                for (let i = 0; i < failStringArray.length; i++) {
                    innerMsgAlert += String.fromCharCode(failStringArray[i]);
                }
                return (a && b);
            }
        } else if (window.location.href.includes('http://120.27.194.253/')) {
            a = false;
            b = false;
            titleMsgAlert = "查 询 失 败";
            innerMsgAlert = " 请进入学企来后使用";
            return (a && b);
        }
        else {
            a = false;
            b = false;
            titleMsgAlert = "查 询 失 败";
            innerMsgAlert = " 请进入学企来后使用";
            return (a && b);
        }
    }

    function getabAndToast() {
        getab();
        waitToast(titleMsgAlert, innerMsgAlert, a);

    }

    function waitToast(titleText, innerText, logText) {
        let CustomBox = Box.mixin({
            customFunction: function () {
                console.log(logText);
            },
        });
        let customBoxInstance = new CustomBox({
            title: titleText,
            text: innerText,
        });
        try {
            customBoxInstance.customFunction();
        } catch (error) {
            console.log("toast 库 error");
        }
    }

    function toast(title, innerText, time) {
        let Toast = Box.mixin({
            title: title,
            toast: true,
            time: time,
        });
        new Toast({ text: innerText });
    }



})();