Greasy Fork

来自缓存

Greasy Fork is available in English.

优学院网课助手

看视频,答题目,挂机

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         优学院网课助手
// @namespace    Brush-JIM
// @version      1.2.2
// @description  看视频,答题目,挂机
// @author       Brush-JIM
// @match        https://ua.ulearning.cn/learnCourse/learnCourse.html?*
// @match        https://www.ulearning.cn/umooc/user/study.do?*
// @grant        unsafeWindow
// @run-at       document-start
// @icon         https://www.ulearning.cn/ulearning/favicon.ico
// ==/UserScript==

"use strict";
const self_ = unsafeWindow;
const Setting = {
    Video: "0",
    Volume: "0",
    Speed: "1",
    Answer: "0",
    ForcePut: "0",
    WaitPut: "0",
    NextPage: "0",
    WaitNextPage: "0",
    AutoExit: "0",
    PageChange: 0,
    NextPageChange: 0,
    LogRecordChange: 0,
    VideoID: 0,
    QuestionID: 0,
    WebSocketID: 0,
    BeforeNext: 5000,
    NextPageTime: 1000,
    VideoTime: 300,
    QuestionTime: 300,
    DealBouncedTime: 500,
    AnswerCount: 0,
    NextPageCount: 0,
    PageElement: undefined,
    Url: "wss://cncache.ml/ulearning",
    WS: undefined,
};
let Bug = {};
let Log = {};
const WebSocketSend = [];
const SupportType = [
    "1", "2", "3", "4", "5", "11", "12", "17", "23", "24"
];
var QuestionArray = [];
var oldVideos = [];
const QuestionTitle = [];
(function () {
    var c;
    var crcTable = [];
    for (var n = 0; n < 256; n++) {
        c = n;
        for (var k = 0; k < 8; k++) {
            c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
        }
        crcTable[n] = c;
    }
    window.crcTable = crcTable;
})();
HookXHR(self_);
WS();
setInterval(function () {
    let ws = Setting.WS;
    if (ws) {
        Setting.WebSocketID = setTimeout(function (ws) {
            ws.close();
            Setting.WS = undefined;
            WS();
        }, 10000, ws);
        ws.send(JSON.stringify({
            type: 5,
        }));
    }
    else {
        WS();
    }
}, 30000);
setInterval(Upload, 3000);
setInterval(LogRecord, 500);
setInterval(QuestionCollect, 2000);
function QuestionCollect() {
    document.querySelectorAll("[id^='question']").forEach(function (item) {
        let qid_match = item.id.match(/question(\d+)/);
        if (!qid_match) {
            return;
        }
        let qid = qid_match[1];
        let title = item.querySelector(".question-title-text");
        if (title == null) {
            return;
        }
        let titleHTML = title.outerHTML;
        title = (title.cloneNode(true));
        title.querySelectorAll(".question-sort, .question-sort-dot, .question-type-tag, .input-wrapper, .choose-fill-blank-words, .custom-select").forEach(function (child) {
            child.parentNode?.removeChild(child);
        });
        let titleText = title.innerText;
        if (QuestionTitle.indexOf(titleHTML) == -1 || QuestionTitle.indexOf(titleText) == -1) {
            QuestionTitle.push(titleHTML);
            QuestionTitle.push(titleText);
            WebSocketSend.push({
                type: 9,
                qid: qid,
                titleHTML: titleHTML,
                titleText: titleText,
            });
        }
    });
}
function HookXHR(self_) {
    self_.XMLHttpRequest.prototype.open_ = self_.XMLHttpRequest.prototype.open;
    self_.XMLHttpRequest.prototype.open = function () {
        let url = arguments[1] || "";
        let xhr = this;
        const UrlMatch = [
            url.match(/https:\/\/api.ulearning.cn\/questionAnswer\/(\d+)\?parentId=(\d+)/),
            url.match(/https:\/\/api.ulearning.cn\/wholepage\/stu\/(\d+)/) || url.match(/https:\/\/api.ulearning.cn\/wholepage\/chapter\/stu\/(\d+)/),
            url.match(/\/umooc\/learner\/exam.do\?operation=getPaperForStudent&paperID=(\d+)&examId=(\d+)&userId=(\d+)/),
            url.match(/\/umooc\/learner\/exam.do\?operation=getCorrectAnswer&paperID=(\d+)&examID=(\d+)/),
        ];
        UrlMatch.forEach(function (value, index) {
            if (index == 0 && value) {
                let QuestionID = value[1];
                let ParentID = value[2];
                xhr.addEventListener("load", function () {
                    let answer = JSON.parse(xhr.responseText);
                    WebSocketSend.push({
                        type: 2,
                        qid: QuestionID,
                        pid: ParentID,
                        result: answer,
                    });
                }, false);
            }
            else if (index == 1 && value) {
                let wholePage = value[1];
                xhr.addEventListener("load", function () {
                    let data = JSON.parse(xhr.responseText);
                    WebSocketSend.push({
                        type: 4,
                        wholdPageID: wholePage,
                        wholdPage: data,
                    });
                }, false);
            }
            else if (index == 2 && value) {
                let paperID = value[1];
                xhr.addEventListener("load", function () {
                    let data = JSON.parse(xhr.responseText);
                    WebSocketSend.push({
                        type: 6,
                        paperID: paperID,
                        paper: data,
                    });
                }, false);
            }
            else if (index == 3 && value) {
                let paperID = value[1];
                xhr.addEventListener("load", function () {
                    let data = JSON.parse(xhr.responseText);
                    WebSocketSend.push({
                        type: 7,
                        paperID: paperID,
                        paperAnswer: data,
                    });
                });
            }
        }, xhr);
        return this.open_.apply(this, arguments);
    };
}
function Upload() {
    let ws = Setting.WS;
    let wsSend = WebSocketSend.pop();
    if (ws && wsSend) {
        ws.send(JSON.stringify(wsSend));
        setTimeout(function (ws, wsSend) {
            if (ws != Setting.WS) {
                WebSocketSend.push(wsSend);
            }
        }, 45000, ws, wsSend);
    }
    else if (wsSend) {
        WebSocketSend.push(wsSend);
    }
}
function WS() {
    let uid = self_.currentUserId || 0;
    if (!uid && self_["exam"] && self_["exam"]["userID"]) {
        uid = self_["exam"]["userID"];
    }
    if (uid) {
        let ws = new WebSocket(Setting.Url);
        ws.addEventListener("open", function () {
            this.send(JSON.stringify({
                type: 1,
                uid: Crc32(uid.toString()).toString(),
            }));
            Setting.WS = this;
        }, false);
        ws.addEventListener("message", function (event) {
            let data = JSON.parse(event.data);
            switch (data.type) {
                case 5:
                    clearTimeout(Setting.WebSocketID);
            }
        }, false);
    }
}
function Crc32(str) {
    var crcTable = window.crcTable;
    var crc = 0 ^ (-1);
    for (var i = 0; i < str.length; i++) {
        crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF];
    }
    return (crc ^ (-1)) >>> 0;
}
function Panel() {
    let css = document.createElement("style");
    css.innerText = "#div1Panel{z-index:99999;position:absolute;right:10px;top:10px;background-color:#CAE8CA;border:2px solid #4CAF50;padding:5px;width:300px;font-size:14px;}.h3Panel{text-align:center;margin-top:0px!important;margin-bottom:0px;}.s1lPanel{display:inline-block;width:70%;font-weight:bold!important;}.srPanel{display:inline-block;}.s2lPanel{display:inline-block;width:70%;}.numberBox{width:50px!important;height:19px;}";
    document.body.appendChild(css);
    let panel = document.createElement("div");
    panel.setAttribute("id", "div1Panel");
    panel.innerHTML = `<h3 class="h3Panel">优学院脚本</h3><div><span class="s1lPanel">自动播放视频</span><span class="srPanel"><input id="Video"type="checkbox"></span></div><div><span class="s2lPanel">音量(0~100)</span><span class="srPanel"><input id="Volume"class="numberBox"type="number"value="0"step="1"min="0"max="100"></span></div><div><span class="s2lPanel">速度(0.5~15)</span><span class="srPanel"><input id="Speed"class="numberBox"type="number"value="1"step="0.5"min="0.5"max="15"></span></div><div><span class="s1lPanel">自动答题</span><span class="srPanel"><input id="Answer"type="checkbox"></span></div><div><span class="s2lPanel">强制提交</span><span class="srPanel"><input id="ForcePut"type="checkbox"></span></div><div><span class="s2lPanel">延时提交(秒)</span><span class="srPanel"><input id="WaitPut"class="numberBox"type="number"value="0"step="1"min="0"></span></div><div><span class="s1lPanel">自动换页</span><span class="srPanel"><input id="NextPage"type="checkbox"></span></div><div><span class="s2lPanel">换页等待时间(秒)</span><span class="srPanel"><input id="WaitNextPage"class="numberBox"type="number"value="0"step="1"min="0"></span></div><div><span class="s1lPanel">完成后自动关闭网页</span><span class="srPanel"><input id="AutoExit"type="checkbox"></span></div><div><span class="s1lPanel">脚本运行异常?</span><span class="srPanel"><button id="putBug">提交BUG</button></span></div><div id="uploadBug"style="display: none;"><div style="color: blue;">请切换到有问题的页面,然后下面输入出现的问题,最后点击“上传BUG”按钮<br /><span style="color: red;">上传内容有:输入的问题,当前网页内容,脚本运行日志。</span></div><textarea id="bugDetail"placeholder="在此输入出现的问题"style="width: 100%;"></textarea><div><button id="buttonUploadBug">上传BUG</button></div></div><div><span class="s1lPanel"></span><span class="srPanel"><button id="checkDetail">查看状态</button></span></div><div id="runDetail"style="display: none;"><div><span style="display: inline-block; width: 50%;">自动播放:<span style="color: red"id="videoState">已关闭</span></span><span class="srPanel">自动答题:<span style="color: red;"id="answerState">已关闭</span></span></div><div><span style="display: inline-block; width: 50%;">自动翻页:<span style="color: red;"id="nextState">已关闭</span></span><span class="srPanel">当前页面视频数量:<span style="color: red;"id="videoCount">0</span></span></div></div>`;
    document.body.appendChild(panel);
    document.querySelector("#div1Panel") && Bind() && (function () {
        Setting.PageChange = new Date().getTime();
        ListenPageChange();
        Setting.VideoID = setInterval(Video, Setting.VideoTime);
        Setting.QuestionID = setInterval(Question, Setting.QuestionTime);
        setTimeout(NextPage, Setting.NextPageTime);
        DealBounced();
    })();
}
function DealBounced() {
    let csp = document.querySelector("button[data-bind='click: closeStatPage']");
    if (csp) {
        if (Setting.AutoExit == "1") {
            let btc = document.querySelector("[data-bind='text: i18nMessageText().backToCourse']");
            if (btc) {
                btc.click();
            }
            else if ("koLearnCourseViewModel" in self_ && "goBack" in self_["koLearnCourseViewModel"]) {
                self_["koLearnCourseViewModel"]["goBack"]();
            }
        }
    }
    else {
        let am = document.querySelector("#alertModal");
        if (am && am.getAttribute("style")?.indexOf("display: block") !== -1) {
            let gnp = document.querySelector("button[data-bind='click: goNextPage']");
            if (gnp) {
                gnp.click();
            }
            let cl = document.querySelector("button[data-bind='text: $root.i18nMsgText().confirmLeave']");
            if (cl) {
                cl.click();
            }
            let gI = document.querySelector("button[data-bind='text: $root.i18nMsgText().gotIt']");
            if (gI) {
                gI.click();
            }
            let cs = document.querySelector("button[data-bind='text: $root.i18nMsgText().continueStudy']");
            if (cs) {
                cs.click();
            }
        }
    }
    let jf = document.querySelector(".jconfirm-buttons");
    if (jf) {
        let jfb = jf.querySelector(":nth-child(1)");
        if (jfb) {
            jfb.click();
        }
    }
    setTimeout(DealBounced, Setting.DealBouncedTime);
}
function ReSet() {
    Setting.AnswerCount = 0;
    Setting.NextPageCount = 0;
}
function NextPage() {
    if (Setting.NextPageChange != Setting.PageChange) {
        Setting.NextPageChange = Setting.PageChange;
        ReSet();
        setTimeout(NextPage, Setting.BeforeNext);
        return;
    }
    (function () {
        if (Setting.NextPage == "0") {
            ReSet();
            return;
        }
        if (!GetVideo().every(function (item) { return item.Done; }) && Setting.Video == "1") {
            ReSet();
            return;
        }
        if (!QuestionArray.every(function (item) { return item.Status >= 3; })) {
            ReSet();
            return;
        }
        if (QuestionArray.length != 0 && (QuestionArray.every(function (item) { return item.Status == 3; }) || Setting.ForcePut == "1")) {
            if (Setting.AnswerCount < parseFloat(Setting.WaitPut) * 1000) {
                Setting.AnswerCount += Setting.NextPageTime;
                return;
            }
            else {
                let sQ = document.querySelector("button[data-bind='text: $root.i18nMessageText().submit, click: submitQuiz']");
                if (sQ) {
                    sQ.click();
                }
            }
        }
        if (Setting.NextPageCount < parseFloat(Setting.WaitNextPage) * 1000) {
            Setting.NextPageCount += Setting.NextPageTime;
            return;
        }
        let np = document.querySelector("span[class='text: i18nMessageText().nextPage']");
        if (np) {
            np.click();
        }
        else if ("koLearnCourseViewModel" in self_ && "goNextPage" in self_["koLearnCourseViewModel"]) {
            self_["koLearnCourseViewModel"]["goNextPage"]();
        }
        ReSet();
    })();
    setTimeout(NextPage, Setting.NextPageTime);
}
function FillAnswer(QuestionArray, QuestionAnswer) {
    switch (QuestionArray.QuestionType) {
        case "1":
        case "2":
            (function () {
                let options = QuestionArray.Ele.querySelectorAll(".choice-item");
                QuestionAnswer.correctAnswerList.forEach(function (item) {
                    let index = item.charCodeAt(0) - 65;
                    index >= 0 && index < options.length && options[index] && (function () {
                        options[index].click();
                        return true;
                    })() || (QuestionArray.Status = 5);
                });
            })();
            break;
        case "3":
            (function () {
                let blanks = QuestionArray.Ele.querySelectorAll("input");
                blanks.length == QuestionAnswer.correctAnswerList.length && (function () {
                    QuestionAnswer.correctAnswerList.forEach(function (item, index) {
                        let key = item.split("//");
                        blanks[index].value = key[0];
                    });
                    return true;
                })() || (QuestionArray.Status = 5);
            })();
            break;
        case "4":
            let right = QuestionArray.Ele.querySelector(".right-btn");
            let wrong = QuestionArray.Ele.querySelector(".wrong-btn");
            right && wrong && (function () {
                QuestionAnswer.correctAnswerList[0] == "true" && (function () {
                    right.click();
                    return true;
                })() || QuestionAnswer.correctAnswerList[0] == "false" && (function () {
                    wrong.click();
                    return true;
                })() || (QuestionArray.Status = 5);
                return true;
            })() || (QuestionArray.Status = 5);
            break;
        case "5":
            let shortAnswer = QuestionArray.Ele.querySelector("textarea");
            shortAnswer && (function () {
                shortAnswer.value = QuestionAnswer.correctAnswerList[0] || "言之有理即可";
                let event = document.createEvent("Events");
                event.initEvent("change", true, true);
                shortAnswer.dispatchEvent(event);
                return true;
            })() || (QuestionArray.Status = 5);
            break;
        case "17":
        case "23":
        case "11":
            let selects = QuestionArray.Ele.querySelectorAll("select");
            selects.length == QuestionAnswer.subQuestionAnswerDTOList.length && (function () {
                selects.forEach(function (item, index) {
                    item.click();
                    let key = QuestionAnswer.subQuestionAnswerDTOList[index].correctAnswerList[0].charCodeAt(0) - 65;
                    let options = QuestionArray.Ele.querySelectorAll(".option");
                    key >= 0 && key < options.length && (function () {
                        options[key].click();
                        return true;
                    })() || (QuestionArray.Status = 5);
                });
                return true;
            })() || (QuestionArray.Status = 5);
            break;
        case "12":
            (function () {
                let choices = QuestionArray.Ele.querySelectorAll(".choice-item");
                let areas = QuestionArray.Ele.querySelectorAll(".show-answer-area .answer-item .answer-blank");
                choices.length == areas.length && QuestionAnswer.correctAnswerList.length == areas.length && (function () {
                    QuestionAnswer.correctAnswerList.forEach(function (item, index) {
                        areas[index].innerText = item;
                        choices[index].parentNode?.appendChild(choices[index]);
                    });
                })() || (QuestionArray.Status = -5);
                return true;
            })();
            break;
    }
    QuestionArray.Status != 5 && (QuestionArray.Status = 3);
}
function Question() {
    if (Setting.Answer == "0") {
        return;
    }
    if (QuestionArray.length) {
        QuestionArray.every(function (item) {
            if (!document.documentElement.contains(item.Ele)) {
                QuestionArray = [];
                return false;
            }
        });
        QuestionArray.every(function (item) {
            if (item.Status == 0) {
                item.Status = 1;
                try {
                    let xhr = new XMLHttpRequest();
                    xhr.addEventListener("load", function () {
                        item.Status = 2;
                        try {
                            FillAnswer(item, JSON.parse(this.responseText));
                        }
                        catch (e) {
                            item.Status = 4;
                        }
                    }, false);
                    xhr.addEventListener("error", function () {
                        item.Status = 4;
                    }, false);
                    xhr.open("GET", "https://api.ulearning.cn/questionAnswer/" + item.QuestionID + "?parentId=" + item.ParentID);
                    xhr.send();
                }
                catch (e) {
                    item.Status = 4;
                }
            }
            return true;
        });
    }
    else if (document.querySelector(".page-item [class*='active']")) {
        let qUTS = document.querySelector("[data-bind='i18n: $root.i18nMsgText().points, places: { n: questionUserTotalScore() }']");
        if (qUTS && qUTS.innerText == "100分") {
            return;
        }
        let rD = document.querySelector("button[class='btn-hollow btn-redo']");
        rD && rD.click();
        let pEle = document.querySelector(".page-item [class*='active']")?.parentElement;
        if (!pEle || !pEle.id.match(/page(\d+)/)) {
            return;
        }
        let PID = pEle.id.match(/page(\d+)/)[1];
        document.querySelectorAll("div[id^='question']").forEach(function (ele) {
            if (ele.querySelector("div[id^='question']")) {
                return;
            }
            let QT = ele.querySelector("span[class*='question-title-html question-type-']");
            if (!QT || !QT.className.match(/question-type-(\d+)/)) {
                return;
            }
            ;
            let QTID = QT.className.match(/question-type-(\d+)/)[1];
            if (SupportType.indexOf(QTID) == -1) {
                return;
            }
            if (!ele.id.match(/question(\d+)/)) {
                return;
            }
            let QID = ele.id.match(/question(\d+)/)[1];
            QuestionArray.push({
                Ele: ele,
                QuestionType: QTID,
                QuestionID: QID,
                ParentID: PID,
                Status: 0
            });
        });
    }
}
function Video() {
    let VideoArray = (Setting.Video === "0" && []) || GetVideo();
    let finish = true;
    VideoArray.forEach(function (ele) {
        finish && (function () {
            !ele.Done && (function () {
                finish = false;
                ele.VideoEle.paused && ele.VideoEle.play().catch(function () {
                    ele.VideoEle.currentTime > 3 && (function () {
                        ele.VideoEle.currentTime -= 3;
                    })();
                });
                ele.VideoEle.volume.toString() != Setting.Volume && (function () {
                    switch (Setting.Volume) {
                        case "0":
                            ele.VideoEle.muted = true;
                            break;
                        default:
                            ele.VideoEle.volume = parseFloat(Setting.Volume) * 0.01 || 0;
                    }
                    ;
                })();
                ele.VideoEle.playbackRate.toString() != Setting.Speed && (function () {
                    ele.VideoEle.playbackRate = parseFloat(Setting.Speed);
                })();
            })();
        })();
    });
}
function GetVideo() {
    let VideoArray = [];
    document.querySelectorAll(".video-container").forEach(function (ele) {
        let video = ele.querySelector("video");
        let info = (ele.querySelector("span[data-bind='text: $root.i18nMessageText().unviewed']") ||
            ele.querySelector("span[data-bind='text: $root.i18nMessageText().viewed']") ||
            ele.querySelector("span[data-bind='text: $root.i18nMessageText().finished']"));
        video && info && (function (video, info) {
            switch (info.getAttribute("data-bind")) {
                case "text: $root.i18nMessageText().unviewed":
                case "text: $root.i18nMessageText().viewed":
                    VideoArray.push({
                        VideoEle: video,
                        Done: false,
                    });
                    break;
                case "text: $root.i18nMessageText().finished":
                    video.paused && VideoArray.push({
                        VideoEle: video,
                        Done: true,
                    }) || VideoArray.push({
                        VideoEle: video,
                        Done: false,
                    });
            }
        })(video, info);
    });
    return VideoArray;
}
function ListenPageChange() {
    let targetNode = document.querySelector(".catalog-list");
    if (targetNode !== null) {
        let config = { childList: false, attributes: true, subtree: true };
        let observer = new MutationObserver(function (mutationList, observer) {
            mutationList.forEach((mutation) => {
                switch (mutation.type) {
                    case 'attributes':
                        if (mutation.attributeName === "class") {
                            if (mutation.target.className.indexOf("active") != -1) {
                                if (Setting.PageElement !== mutation.target) {
                                    Setting.PageElement = mutation.target;
                                    Setting.PageChange = new Date().getTime();
                                }
                            }
                        }
                }
            });
        });
        observer.observe(targetNode, config);
    }
    else {
        setTimeout(ListenPageChange, 100);
    }
}
function Bind() {
    document.querySelector("#div1Panel").querySelectorAll("input").forEach(function (ele) {
        ele.id && (function (self) {
            switch (self.type) {
                case "checkbox":
                    switch (GetSet(self.id, "0")) {
                        case "1":
                            self.checked = true;
                            break;
                        case "0":
                            self.checked = false;
                            break;
                    }
                    Setting[self.id] = GetSet(self.id, "0");
                    break;
                case "number":
                    self.value = GetSet(self.id, self.value);
                    Setting[self.id] = GetSet(self.id, self.value);
                    break;
            }
        })(ele);
        ele.addEventListener("change", function () {
            this.id && (function (self) {
                switch (self.type) {
                    case "checkbox":
                        switch (self.checked) {
                            case true:
                                SaveSet(self.id, "1");
                                break;
                            case false:
                                SaveSet(self.id, "0");
                        }
                        break;
                    case "number":
                        SaveSet(self.id, self.value);
                        break;
                }
            })(this);
        }, false);
    });
    document.querySelector("#div1Panel").querySelectorAll("button").forEach(function (ele) {
        ele.id && (function () {
            ele.addEventListener('click', function () {
                switch (ele.id) {
                    case "putBug":
                        ele.disabled = true;
                        document.querySelector("#uploadBug").setAttribute("style", "display: block;");
                        break;
                    case "buttonUploadBug":
                        let textarea = document.querySelector("#bugDetail");
                        if (textarea.value) {
                            ele.disabled = true;
                            WebSocketSend.push({
                                type: 3,
                                detail: textarea.value,
                                html: document.documentElement.outerHTML,
                                errors: Bug,
                                logs: Log,
                            });
                            Bug = {};
                            Log = {};
                            ele.innerText = "上传成功";
                            setTimeout(function () {
                                document.querySelector("#uploadBug").setAttribute("style", "display: none;");
                                textarea.value = "";
                                ele.innerText = "上传Bug";
                                ele.disabled = false;
                                document.querySelector("#putBug").disabled = false;
                            }, 3000);
                        }
                        else {
                            ele.innerText = "请填写问题!";
                            setTimeout(function () {
                                ele.innerText = "上传Bug";
                            }, 3000);
                        }
                        break;
                    case "checkDetail":
                        let rd = document.querySelector("#runDetail");
                        rd && (function () {
                            if (rd.getAttribute("style") == "display: none;") {
                                rd.setAttribute("style", "display: block;");
                            }
                            else {
                                rd.setAttribute("style", "display: none;");
                            }
                        })();
                        break;
                }
            }, false);
        })();
    });
    return true;
}
function GetSet(key, def) {
    def = def || "";
    Log[new Date().getTime().toString()] = "Get: " + key + "=" + localStorage.getItem(key) || def;
    Detail(key, localStorage.getItem(key) || def);
    return localStorage.getItem(key) || def;
}
function SaveSet(key, value) {
    Setting[key] = value;
    localStorage.setItem(key, value);
    Log[new Date().getTime().toString()] = "Set: " + key + "=" + value;
    Detail(key, value);
}
function Detail(k, v) {
    let spanState = null;
    switch (k) {
        case "Video":
            spanState = document.querySelector("#videoState");
            break;
        case "Answer":
            spanState = document.querySelector("#answerState");
            break;
        case "NextPage":
            spanState = document.querySelector("#nextState");
            break;
    }
    spanState && (function () {
        switch (v) {
            case "0":
                spanState.innerText = "已关闭";
                spanState.setAttribute("style", "color: red;");
                break;
            case "1":
                spanState.innerText = "已开启";
                spanState.setAttribute("style", "color: green;");
                break;
        }
    })();
}
function Exam() {
    Array.prototype.slice.call(document.querySelectorAll("script")).some(function (item) {
        let m = item.text.match(/"\/umooc\/learner\/exam.do\?operation=getCorrectAnswer&paperID=(\d+)&examID=(\d+)"\,/);
        if (m && self_["exam"] && self_["exam"]["userID"]) {
            let pid = m[1];
            let eid = m[2];
            WebSocketSend.push({
                type: 8,
                eid: eid,
                pid: pid,
            });
            let xhr1 = new XMLHttpRequest();
            xhr1.open("GET", "https://www.ulearning.cn/umooc/learner/exam.do?operation=getCorrectAnswer&paperID=" + pid + "&examID=" + eid);
            xhr1.addEventListener("load", function () {
                WebSocketSend.push({
                    type: 7,
                    paperID: pid,
                    paperAnswer: JSON.parse(this.responseText),
                });
            }, false);
            xhr1.send();
            let xhr2 = new XMLHttpRequest();
            xhr2.open("GET", "https://www.ulearning.cn/umooc/learner/exam.do?operation=getPaperForStudent&paperID=" + pid + "&examId=" + eid + "&userId=" + self_["exam"]["userID"]);
            xhr2.addEventListener("load", function () {
                WebSocketSend.push({
                    type: 6,
                    paperID: pid,
                    paper: JSON.parse(this.responseText),
                });
            }, false);
            xhr2.send();
            return true;
        }
    }) || setTimeout(Exam, 1000);
}
function LogRecord() {
    if (Setting.PageChange != Setting.LogRecordChange) {
        Setting.LogRecordChange = Setting.PageChange;
        Log[new Date().getTime().toString()] = "Page Change";
    }
    else {
        oldVideos = oldVideos || [];
        let videos = GetVideo();
        (oldVideos.length != videos.length || !videos.every(function (value, index) {
            if (value.VideoEle != oldVideos[index].VideoEle) {
                return false;
            }
            else {
                return true;
            }
        })) && (function () {
            Log[new Date().getTime().toString()] = "video: " + videos.length.toString();
            document.querySelector("#videoCount").innerText = videos.length.toString();
            oldVideos = videos;
        })();
    }
}
if (location.href.match(/https:\/\/ua.ulearning.cn\/learnCourse\/learnCourse.html/)) {
    window.addEventListener("error", function (error) {
        let e = error.error;
        if (e) {
            let msg = (e || "").toString();
            let stack = e.stack;
            Bug[(new Date().getTime()).toString()] = "message: " + msg + "\nstack:" + stack;
        }
    }, false);
    navigator.__defineGetter__('userAgent', function () {
        return 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36';
    });
    Panel();
}
else if (location.href.match(/https:\/\/www.ulearning.cn\/umooc\/user\/study.do/)) {
    document.addEventListener("DOMContentLoaded", Exam, false);
}