- // ==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);
- }