Greasy Fork

Greasy Fork is available in English.

不知名-英语系列 U校园网课答案显示/U校园答案自动填入需要代刷请看描述

脚本已失效<,需要代刷请添加微信:bzm8866999

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

您只有在付费后才能使用脚本的全部功能。Greasy Fork 未参与到支付的流程,因此无法验证您是否获得了有价值的东西,亦无法帮助您申请退款。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         不知名-英语系列 U校园网课答案显示/U校园答案自动填入需要代刷请看描述
// @namespace    https://www.github.com/SSmJaE/
// @description  脚本已失效<,需要代刷请添加微信:bzm8866999
// @version      2.1.5
// @author      不知名的打工仔
// @license      GPL-3.0
// @compatible   Chrome
// @run-at       document-end
// @match        *://u.unipus.cn/*
// @match        *://ucamapi.unipus.cn/*
// @match        *://sso.unipus.cn/sso/login*
// @match        *://uexercise.unipus.cn/uexercise*
// @match        *://u.unipus.cn/user/student/homework*
// @match        *://ucontent.unipus.cn/_pc_default/pc.html?*
// @match        *://ucontent.unipus.cn/_utalk_default/pc.html?*
// @connect      localhost
// @connect      mz.3ds2.top
// @connect      u.unipus.cn
// @connect      47.97.90.127
// @connect      ucamapi.unipus.cn
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_setClipboard
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @grant        GM_openInTab
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        window.close
// @grant        window.onurlchange
// @antifeature  payment
// @noframes
// ==/UserScript==

(function () {
    'use strict';
      let userset = {
        hasInput: true,       //是否开启自动答题,如果设置为false,
        //每道题之间的答题间隔 [单位:毫秒]
        //无需延迟设置min和max为0即可
        //代表(随机1-3秒)    建议2-5秒
        min:1000,
        max:3000,
      }
    const wrapperId = "answerWrapper"
    const titleId = "answerTitle"
    const contentId = "answerContent"
    const innerText = html => {
        let div = document.createElement('div')
        div.innerHTML = html
        if (div.firstChild) {
            return div.firstChild.innerText
        } else {
            return null;
        }
    }
    const inputValue = (dom, st) => {
        if (/input/i.test(dom.tagName)) {
            var setValue = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
            setValue.call(dom, st);
            var e = new Event('input', { bubbles: true });
            dom.dispatchEvent(e);
        } else {
            let evt = new InputEvent('input', {
                inputType: 'insertText',
                data: st,
                dataTransfer: null,
                isComposing: false
            });
            dom.value = st;
            dom.dispatchEvent(evt);
        }
    }
    const knownQuestionKeys = [
        "questions:shortanswer",
        "shortanswer:shortanswer",
        "questions:scoopquestions",
        "questions:sequence",
        "questions:questions",
        "questions:textmatch",
        "questions:bankedcloze",
        "questions:scoopselection"
    ]
    let Timer = function (func) {
        let hasLoaded = false;
        return function (selector, answers) {
          if (!userset.hasInput) {
                return;
            }
            if (hasLoaded) {
                return;
            }
            let cnt = 15;
            let handler = window.setInterval(() => {
                hasLoaded = true;
                if (!(cnt--)) {
                    window.clearInterval(handler);
                    location.reload(true);
                    alert("自动答题失败!");
                }
                hasLoaded = func(selector, answers, handler);
            }, 1000);
        }
    };
    let inputAnswers = Timer((selector, answers, handler) => {
            if (!userset.hasInput) {
                return;
            }
        let inputs = document.querySelectorAll(selector);
        let hasLoaded = true;
        if (inputs.length) {
            window.clearInterval(handler);
            hasLoaded = false;
            for (let i = 0; i < inputs.length; i++) {
                window.setTimeout(() => {
                    if (/(input)|(textarea)/i.test(inputs[i].tagName) && !inputs[i].value) {
setTimeout(function(){
                        inputs[i].click();
                        inputs[i].focus();
                        answers[i] = answers[i].replace('\n','');
                        if(answers[i].indexOf(" | ") != -1){
                            answers[i] = answers[i].split(" | ");
                            answers[i] = answers[i][0];
                           }
                        inputValue(inputs[i], answers[i]);
                        inputs[i].blur();
},Math.floor(Math.random() * (userset.max - userset.min + 1)) + userset.min);
                    }
                }, i * 500 + Math.random() * 300);
            }
        }
        return hasLoaded;
    });
    let selectAnswers = Timer((selector, answers, handler) => {
            if (!userset.hasInput) {
                return;
            }
            var xi;
            for (xi = 0; xi < selector.length; xi++){
            let lists = document.querySelectorAll(selector[xi]);
            if (lists.length != 0) {
                break;
           }
         }
        let lists = document.querySelectorAll(selector[xi]);
        let hasLoaded = true;
        if (lists.length) {
            window.clearInterval(handler);
            hasLoaded = false;
            for (let i = 0; i < lists.length; i++) {
                window.setTimeout(() => {
                    let inputs = lists[i].querySelectorAll('input[type="radio"]');
                    console.log(inputs)
                    for (let j = 0; j < inputs.length; j++) {
                        if (inputs[j].value === answers[i].toUpperCase() || inputs[j].value === answers[i].toLowerCase()) {
                            setTimeout(function(){
                              inputs[j].click();
                             },Math.floor(Math.random() * (userset.max - userset.min + 1)) + userset.min);
                        }
                    }
                }, i * 500 + Math.random() * 300);
            }
        }
        return hasLoaded;
    });
    const answerResolvers = [
        json => {
            console.log('answerResolvers' + 0);
            let answer = "";
            let answers = [];
            json.questions.forEach(question => {
                let text = `\n${innerText(question.analysis.html)}`
                answer += text;
                answers.push(innerText(question.analysis.html).replace('?', '').replace(/[\d]+?\./, '').trim());
            });
            inputAnswers('div.questions textarea', answers);
            return answer
        },
        json => {
            let answer = ""
            let as = [];
            let as2 = [];
            var iii;
            console.log('answerResolvers' + 1);
            if (!innerText(json.analysis.html)) {
                console.log("1")
                for (iii = 0; iii < json.questions.length; iii++) {
                answer = json.questions[iii];
                if (typeof answer === "string") {
                    answer = JSON.parse(answer);
                }
                answer = answer.analysis.html
                answer = innerText(answer);
                as2.push("\n"+answer)
                as.push(answer.replace('?', '').replace(/[\d]+?\./, '').trim())
              }
               console.log(as)
              inputAnswers('div.questions textarea', as);
              return as2;
            } else {
                console.log("2")
                answer = innerText(json.analysis.html);

            }
            inputAnswers('#mainLrRight textarea', [answer]);
            return answer;
        },
        json => {
            console.log('answerResolvers' + 2);
            let answer = [];
            let answers = [];
            var as = "";
            json.questions.forEach(question => {
                as = `\n${innerText(question.content.html)} ${question.answers.join(" | ")}`
                //    answer += `\n${ innerText(question.content.html) } ${ question.answers.join(" | ") }`
                //answer.push("answer:")
                answer.push(as)
                answers.push(question.answers[0]);
            });
            console.log("XX",answers)
            console.log(answer)
            inputAnswers('div#root div.questions input', answers);
            return answer
        },
        json => {
            console.log('answerResolvers' + 3);

            return json.questions.map(question => question.answer).join(", ")
        },
        json => {
           console.log('answerResolvers' + 4);
            //console.log(json.questions.map(question => question.answers))
            let answers = json.questions.map(question => question.answers[0]);
            if(answers[0].length > 1){
                inputAnswers('div#root div.questions input', answers);
            }else{
                selectAnswers(['#main-top ul','#mainLrRight ul'], answers);
            }
            return answers.join(", ")

            },
        json => {
            console.log('answerResolvers' + 5);
            let answers = json.questions.map(question => question.answer);
            inputAnswers('#mainLrRight input',answers);
            return answers.join(", ")
        },
        json => {
            console.log('answerResolvers' + 6);

            return json.questions.map(question => question.answer).join(", ")
        },
        json => {
            console.log('answerResolvers' + 7);
            var si;
            let answers = json.questions.map(question => question.answers[0]);
            for (si = 0;si < answers.length; si++){
             var numa;
             var as;
             var numb;
             numa = th(answers[si])
             as = innerText(json.questions[si].options[numa-1].content.html);
             numb = si+1
             answers[si] = "\n"+numb+". "+as;
            }
           // inputAnswers('div#root div.questions input', answers);
            return answers.join(", ");
        }
    ]
    const specialQuestions = [
        /^content_\d:questions$/,
    ]
    const specialscoopquestions = [
        /^content_\d:scoopquestions$/,
    ]
    const specialAnswerResolvers = [
        json => {
            let answer = ""
            let resolver = answerResolvers[knownQuestionKeys.indexOf("questions:questions")]
            console.log(resolver)
            answer = Object.keys(json).sort().map((key, index) => (index + 1) + ". " + resolver(json[key])).join('\n')
            console.log(answer)
            return answer+"\n[该选择题需手动换页,谢谢配合]!"
        },
    ]
    const showAnswer = json => {
        let answer = "No answer found"
        let isQuestion = true
        if (json != null && json.hasOwnProperty("content")) {
            let contentJson = JSON.parse(json.content)
            console.log("%c%s", "color: red; font-size: 16px;", JSON.stringify(contentJson, '', 2))
            let keys = Object.keys(contentJson)
            let key = keys[0]
            let keyIndex = knownQuestionKeys.indexOf(key)
            if (keyIndex !== -1) {
                answer = answerResolvers[keyIndex](contentJson[key])
                console.log("answer=" + answer);
            } else {
                let specialKeyIndex = -1
                specialQuestions.forEach((pattern, index) => {
                    if (pattern.test(key)) {
                        specialKeyIndex = index
                    }
                })
                if (specialKeyIndex == -1) {
                    console.log(contentJson)
                    specialscoopquestions.forEach((pattern, index) => {
                    if (pattern.test(key)) {
                        specialKeyIndex = index

                    }
                })
                }
                if (specialKeyIndex !== -1) {
                    console.log(contentJson)
                    answer = specialAnswerResolvers[specialKeyIndex](contentJson)
                } else {
                    answer = "Not a question\n" + JSON.stringify(contentJson, '', 2)
                    isQuestion = false
                }
            }
        }

        let title = "参考答案"
        let wrapperElem = document.getElementById(wrapperId) ? document.getElementById(wrapperId) : document.createElement("div");
        let titleElem = document.getElementById(titleId) ? document.getElementById(titleId) : document.createElement("div");
        let contentElem = document.getElementById(contentId) ? document.getElementById(contentId) : document.createElement("div");
        let br = document.createElement("br")
        let tuiguang = document.createElement("a")
        tuiguang.setAttribute("href","http://wpa.qq.com/msgrd?v=3&uin=41737035&site=qq&menu=yes")
        tuiguang.setAttribute("target","_blank")
        tuiguang.text = "查题机器人??"
        if (!isQuestion) {
            return
        }
        wrapperElem.setAttribute("id", wrapperId)
        titleElem.setAttribute("id", titleId)
        contentElem.setAttribute("id", contentId)
        wrapperElem.setAttribute("style",
            "top: 100px; left: 100px; margin: 0 auto; z-index: 1024; border-radius: 1em;"
            + " box-shadow: 0 11px 15px -7px rgba(0,0,0,.2), 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12);"
            + " position: absolute; background: #fff; width: 250px; max-height: 400px; min-height: 200px;")
        titleElem.setAttribute("style", "background: inherit; height: 25px; margin-top: 10px; text-align: center; font-size: x-large")
        contentElem.setAttribute("style", "margin: 10px; color: orange; font-size: medium; overflow-y: auto; max-height: 375px")
        titleElem.innerText = title
        contentElem.innerText = answer
        makeDraggable(titleElem)
        wrapperElem.appendChild(titleElem)
        contentElem.appendChild(br)
        contentElem.appendChild(tuiguang)
        wrapperElem.appendChild(contentElem)
        document.body.appendChild(wrapperElem)
    }
    const real_fetch = window.fetch
    window.fetch = (url, init = null) => real_fetch(url, init).then(response => {
        if (/.*\/course\/api\/content\//.test(url)) {
            let res = response.clone()
            res.json().then(showAnswer)
        }
        return response
    })
    function makeDraggable(elem) {
        document.mouseState = 'up'
        elem.mouseState = 'up'
        elem.lastMousePosY = null
        elem.lastMousePosX = null
        elem.proposedNewPosY = parseInt(elem.style.top, 10)
        elem.proposedNewPosX = parseInt(elem.style.left, 10)
        document.onmousedown = _ => {
            document.mouseState = 'down'
        }

        document.onmouseup = _ => {
            document.mouseState = 'up'
            elem.mouseState = 'up'
        }
        elem.onmousedown = e => {
            elem.lastMousePosY = e.pageY
            elem.lastMousePosX = e.pageX
            elem.mouseState = 'down'
            document.mouseState = 'down'
            document.onselectstart = e => {
                e.preventDefault()
                return false
            }
        }
        elem.onmouseup = e => {
            elem.mouseState = 'up'
            document.mouseState = 'up'
            document.onselectstart = null
        }
        const getAtInt = (obj, attrib) => parseInt(obj.style[attrib], 10)
        document.onmousemove = e => {
            if ((document.mouseState === 'down') && (elem.mouseState === 'down')) {
                elem.proposedNewPosY = getAtInt(elem.parentElement, 'top') + e.pageY - elem.lastMousePosY
                elem.proposedNewPosX = getAtInt(elem.parentElement, 'left') + e.pageX - elem.lastMousePosX
                if (elem.proposedNewPosY < 0) {
                    elem.parentElement.style.top = "0px"
                } else if (elem.proposedNewPosY > window.innerHeight - getAtInt(elem.parentElement, 'height')) {
                    elem.parentElement.style.top = window.innerHeight - getAtInt(elem.parentElement, 'height') + 'px'
                } else {
                    elem.parentElement.style.top = elem.proposedNewPosY + 'px'
                }
                if (elem.proposedNewPosX < 0) {
                    elem.parentElement.style.left = "0px"
                } else if (elem.proposedNewPosX > window.innerWidth - getAtInt(elem.parentElement, 'width')) {
                    elem.parentElement.style.left = window.innerWidth - getAtInt(elem.parentElement, 'width') + 'px'
                } else {
                    elem.parentElement.style.left = elem.proposedNewPosX + 'px'
                }
                elem.lastMousePosY = e.pageY
                elem.lastMousePosX = e.pageX
            }
        }
    }
    function th(s){
   return s.split("").map(function(o){
      return o.toUpperCase().charCodeAt()-64;
   }).join("");
}
})();