// ==UserScript== // @name SuperStar超星助手-支持作业、考试、视频、章节测验全自动处理✨支持DIY题库+第三方题库、全自动收录题库、一键复制题目✨ // @namespace Trprr // @version 2.3.8 // @author Trprr // @description 【🥇操作简单】超星学习小助手,无需任何配置,安装即可使用。【🔊功能齐全】支持视频、音频倍速秒过;文档、图书自动完成;字体解密;章节测验、课后作业、考试自动答题、自动提交、自动收录答案;支持自动切换任务点、自动登录等。【📔丰富题库】免费题库、自建题库、第三方独家题库,每日更新,精准识别,答案全对。【✨功能扩展】开放自定义参数,功能控制更简单 // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA5RJREFUWEftlluoVVUUhr/z4IHIwBfFykgTQkQyMMK0pJv4YIWXSsoHBSvNS0WKcUSwIEWwlEjBEEUU0bzkQ5EP3hMqK/GGZRJiN8METRRUFHR+Mlass85Ze6/ty0FwwOJc5hxz/PMfY/xjNtHB1tTB8bmlATQD9wB3A6eBE8DVRhltlAGDvQKMBB4vBLuS1n4Fvk+gPgN+yq13AgYDPeI7BfwBbG8EwPvA63HrfOyDwF3AAwVAnwO/AENSoCcAQRStpSqA9cBL4b0f+AbYm1jYFvS71AXoC4wD3ihJxRbgh2DhKaC5CoBrucNmp9t+DFyKNAwHBgLnAH//L/YOAN7LgX4XWJQ7ZwywDvitHgBv+Wg4ejsplYl3gEGFWz4C7Cv8L8+c+7+Lov0SEOSntQDMBWbFgeZxTwT3UO0YsDaqX1p/LqF9MzAC+Au4LxXjVuBZ4Kg/ywD0i2q+MzktT86vAW8Bn0SQacAy4HKFtnsYMPfdgQ25tIwCNpcBWADMCMqk7pkoOOM9D3xVIXB+iynL18DLAaZUCXcCTwKToqdtwTkpb+buhQaDS/caoFv4/R/cv8sYyCrfAvwxHAW0q8Hgps5U5W0CsCL7R3sAVKs/Q1bvSMUl4n8AWWnELGALWfvWfAOm1m9mLQCPhYNS6q0vAL8DPStGV2DUgGGx/81UgEujEwTxdWjGjeX2GLDPbTXp9rCxSdlOVmDAHBtY0dFkzHrxAprq6IzYBLxYxkAW3PXDwEMVb+2MsGseTCAuAh8mmZ1X8JWFicBiwDZuw0A+eLZuDztsyuzVNAum5FTRLjG4wlS03TGYDC6IVgD6RJ/fC6wO0RiaUvRB2mULFk1lmwy4R1OyFaxixef9/gW6Ar1CPVsB+CKGi3l7GpiqTif1OxNzXNnUWZb8LE7NQnXfqhosuVSqIxZh/1ShByJ3Uq7Gaz4Y1O4lIbmjgftjzfowx060eibYrIXbqKgApgMfAYeAt+NxoW6bDtUvb754TItDqKplouYcUFNamQCeC4mtdaDvPQOvrBo1sdaS64QjgAOujWU6YK8rm4qQY1MllBHnt4IyPjwVkfkxmsuw9AYW5mbG3/ECand/vQdJ5mS+vVFmTkNZOR4PUV/H1pI15Nc5Nqp8jt1SqwrAA3xYWiMWYz2zgAWt8tW0RgBkB5kmq9nq9pnu7c+HXJvrjUlwdiSwZ+sFd/1mAFQ5t/Ke2wA6nIHr54C0BK9FxloAAAAASUVORK5CYII= // @match *://*.chaoxing.com/* // @match *://*.edu.cn/* // @match *://*.nbdlib.cn/* // @match *://*.hnsyu.net/* // @match *://*.qutjxjy.cn/* // @match *://*.ynny.cn/* // @require https://greasyfork.org/scripts/474385/code/GF_ElementGetter.js // @require https://greasyfork.org/scripts/445293/code/TyprMd5.js // @require https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/limonte-sweetalert2/11.4.4/sweetalert2.all.min.js // @require https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.6.0/jquery.min.js // @resource Table https://www.forestpolice.org/ttf/2.0/table.json // @connect lemtk.xyz // @connect ioscx.com // @connect icodef.com // @connect enncy.cn // @grant GM_getResourceText // @grant GM_getValue // @grant GM_info // @grant GM_setClipboard // @grant GM_setValue // @grant GM_xmlhttpRequest // @grant unsafeWindow // @run-at document-end // @antifeature payment // ==/UserScript== var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)(); var _GM_info = /* @__PURE__ */ (() => typeof GM_info != "undefined" ? GM_info : void 0)(); var _GM_setClipboard = /* @__PURE__ */ (() => typeof GM_setClipboard != "undefined" ? GM_setClipboard : void 0)(); var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)(); var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)(); var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)(); var setting = { showBox: 1, // 显示脚本浮窗,0为关闭,1为开启,不建议关闭 tiku: 1, // 柠檬题库服务器切换,0为主线路,1为备用线路 task: 0, // 只处理任务点任务,0为关闭,1为开启 video: 1, // 处理视频,0为关闭,1为开启 audio: 1, // 处理音频,0为关闭,1为开启 rate: 1, // 视频/音频倍速,0为秒过,1为正常速率,最高16倍 review: 0, // 复习模式,0为关闭,1为开启可以补挂视频时长 work: 1, // 测验自动处理,0为关闭,1为开启,开启将会处理测验,关闭会跳过测验 time: 5e3, // 答题时间间隔,默认5s=5000 sub: 1, // 测验自动提交,0为关闭,1为开启,当没答案时测验将不会提交,如需提交请设置force:1 force: 0, // 测验强制提交,0为关闭,1为开启,开启此功能将会强制提交测验(无论作答与否) share: 1, // 自动收录答案,0为关闭,1为开启,推荐开启,会在相应页面自动收录答案 decrypt: 1, // 字体解密,0为关闭,1为开启,推荐开启,方法来自wyn665817大佬 examTurn: 1, // 考试自动跳转下一题,0为关闭,1为开启 examTurnTime: 0, // 考试自动跳转下一题随机间隔时间(3-7s)之间,0为关闭,1为开启 examAutoClick: 1, // 考试自动点击答案,0为关闭,1为开启 autoLogin: 0, // 自动登录,0为关闭,1为开启,开启此功能请配置登陆配置项 phone: "", // 登录配置项:登录手机号/超星号 password: "" // 登录配置项:登录密码 }; var _w = _unsafeWindow, _l = location, _d = _w.document, $ = _w.jQuery || top.jQuery, md5 = md5 || window.md5, UE = _w.UE, Swal = Swal || window.Swal, _host = ["https://api.lemtk.xyz", "https://api.ioscx.com"][setting.tiku]; var _mlist, _defaults, _domList, $subBtn, $saveBtn, $frame_c; var reportUrlChange = 0; Object.defineProperty(setting, "token", { get() { let sign = _w.localStorage.getItem("tksign"); if (sign) { return sign.trim(); } return ""; }, set(val) { _w.localStorage.setItem("tksign", val.trim()); } }); $(document).keydown(function (e) { if (e.keyCode == 75 && $("#ne-21notice")[0] != void 0) { let show = $("#ne-21box").css("display"); $("#ne-21box").css("display", show == "block" ? "none" : "block"); } }); $(".navshow").find("a:contains(体验新版)")[0] ? $(".navshow").find("a:contains(体验新版)")[0].click() : ""; setting.decrypt ? decryptFont() : ""; if (_l.hostname == "i.mooc.chaoxing.com" || _l.hostname == "i.chaoxing.com") { showTips(); } else if (_l.pathname == "/login" && setting.autoLogin) { showBox(); setTimeout(() => { autoLogin(); }, 3e3); } else if (_l.pathname.includes("/mycourse/studentstudy")) { showBox(); $("#ne-21log", window.parent.document).html("
🎉🎉🎉脚本已加载,初始化完毕!🎉🎉🎉"); } else if (_l.pathname.includes("/knowledge/cards")) { if (top.location.href != _GM_getValue("curUrl")) { _GM_setValue("curUrl", top.location.href); setTimeout(() => { top.location.replace(top.location.href); }, 1e3); } else { var params = getTaskParams(); if (params == null || params == "$mArg" || $.parseJSON(params)["attachments"].length <= 0) { logger("无任务点可处理,即将跳转页面", "red"); toNext(); } else { setTimeout(() => { top.checkJob ? top.checkJob = () => false : true; _domList = []; _mlist = $.parseJSON(params)["attachments"]; _defaults = $.parseJSON(params)["defaults"]; $.each($(".wrap .ans-cc .ans-attach-ct"), (i, t) => { _domList.push($(t).find("iframe")); }); logger("共计" + _mlist.length + "个任务,即将开始逐个处理~", "#ed4845"); missonStart(); }, 3e3); } } } else if (_l.pathname.includes("/exam/test/reVersionTestStartNew")) { showBox(); setTimeout(() => { missonExam(); }, 3e3); } else if (_l.pathname.includes("/exam/test/reVersionPaperMarkContentNew")) { setting.share && (() => { showBox(); setTimeout(() => { uploadExam(); }, 3e3); })(); } else if (_l.pathname.includes("/mooc2/work/dowork")) { showBox(); setTimeout(() => { missonHomeWork(); }, 3e3); } else if (_l.pathname.includes("/mooc2/work/view")) { setting.share && (() => { showBox(); setTimeout(() => { uploadHomeWork(); }, 3e3); })(); } else if (_l.pathname.includes("/work/phone/doHomeWork")) { _oldal = _w.alert; _w.alert = function (msg) { if (msg == "保存成功") { return; } return _oldal(msg); }; _w.workPop = function (content, okTent, okcallback, cancelCallback) { okcallback && okcallback(); }; _w.workPop2 = function (content, okTent, cancelTent, okcallback, cancelCallback) { okcallback && okcallback(); }; if (top.workPop2) { top.workPop2 = _w.workPop2; } } else if (_l.pathname.includes("/mooc2/exam/exam-list")) { Swal.fire("超星学习小助手提示", "注意:专业课可能会存在答案不全或无答案,请谨慎使用脚本考试,一切后果由您自己承担。", "info"); } else if (_l.pathname.includes("/mycourse/studentcourse")) { let texts = `
注意:请勿在非正常学习时间段(凌晨、通宵)运行脚本,以免造成学习进度被重置。

数据收集提示

因脚本答题相关服务依赖于第三方,故脚本在配置了相关题库收录接口且开启自动收录后,脚本将收集用户的已完成问题的题目及答案信息,如介意请自行关闭收录功能或卸载此脚本。
`; Swal.fire(texts); } else { }; function http2https(url) { let _url = url.replace(/^http:/, "https:"); return _url; } function parseUrlParams() { let query = window.location.search.substring(1); let vars = query.split("&"); let _p = {}; for (let i = 0; i < vars.length; i++) { let pair = vars[i].split("="); _p[pair[0]] = pair[1]; } return _p; } function showTips() { var _msg = `
题库官网:https://www.lemtk.xyz
题库为第三方题库,与本脚本无任何关系,有能力者可自行更换。
脚本失效问题请直接GreasyFork私信或油猴中文网私信。
脚本基于Ne-21修改且供自己使用,感谢Ne-21大佬的源码!
`; Swal.fire(_msg); } function switchLemtkPro() { if (_GM_getValue("lemtkpro") == 1) { $("#lemtkpro").text("关闭题库高级搜索"); } else if (_GM_getValue("lemtkpro") == 0) { $("#lemtkpro").text("开启题库高级搜索"); } else { _GM_setValue("lemtkpro", 1); switchLemtkPro(); } } function switchLemtkToken() { if (setting.token) { $("#lemtktoken").val(setting.token); $("#lemtkbtn").text("清空Token"); $("#lemtksq").text("重置Token"); } else { $("#lemtktoken").val(""); $("#lemtkbtn").text("保存Token"); $("#lemtksq").text("获取Token"); } } function showBox() { if (setting.showBox && top.document.querySelector("#ne-21notice") == void 0) { var box_html = `

🌸SuperStar学习小助手v` + _GM_info["script"]["version"] + `

[K键关闭面板]

柠檬题库Token:
- -
`; $(box_html).appendTo("body"); $("#ne-21close").click(function () { let show = $("#ne-21box").css("display"); $("#ne-21box").css("display", show == "block" ? "none" : "block"); }); $(`

🔈脚本基于Ne-21大佬修改,本身不收取任何费用,但对接了第三方题库,故收费与否本脚本无关,有能力的同学可自行更换。


🎉如何自动收录答案到题库?点击查看视频教程(@Ne-21)

🎉如果您觉得脚本使用起来还不错,那么请给本脚本评个分吧~

🎉自建DIY题库功能仅支持柠檬题库(默认对接题库)~
👉点此开始DIY你的题库👈

`).appendTo("#ne-21notice"); $("#lemtkbtn").click(function () { if (setting.token) { setting.token = ""; logger("Token清除成功!", "green"); } else { if ($("#lemtktoken").val().length != 32) { logger("Token格式不正确!", "red"); return; } setting.token = $("#lemtktoken").val(); logger("Token保存成功!", "green"); } switchLemtkToken(); }); $("#lemtksq").click(function () { window.open("https://www.lemtk.xyz/#/", "_blank"); }); $("#lemtkpro").click(function () { if (_GM_getValue("lemtkpro")) { _GM_setValue("lemtkpro", 0); logger("已关闭高级搜索功能!", "red"); } else { _GM_setValue("lemtkpro", 1); logger("已开启高级搜索功能!搜题需配置柠檬题库TOKEN。", "red"); } switchLemtkPro(); }); $("#lemtkcopy").click(function () { _GM_setClipboard($("#lemtktoken").val()); logger("已复制Token到剪贴板!", "green"); }); } else { $("#ne-21log", window.parent.document).html(""); } switchLemtkPro(); switchLemtkToken(); } function logger(str, color) { let logSelector = $("#ne-21log", window.parent.document); let _time = (/* @__PURE__ */ new Date()).toLocaleTimeString(); $('

[' + _time + "]" + str + "

").prependTo(logSelector).on("click", function () { if ("题目".indexOf($(this).html()) != -1) { _GM_setClipboard(getStr($(this).html(), "题目:", "
---->")); Swal.fire({ text: "已复制", position: "top-end", width: 150, timer: 1500, showConfirmButton: false }); } }); } function getStr(str, start, end) { let res = str.match(new RegExp(`${start}(.*?)${end}`)); return res ? res[1] : null; } function getTaskParams() { try { var _iframeScripts = _d.scripts, _p = null; for (let i = 0; i < _iframeScripts.length; i++) { if (_iframeScripts[i].innerHTML.indexOf('mArg = "";') != -1 && _iframeScripts[i].innerHTML.indexOf("==UserScript==") == -1) { _p = getStr(_iframeScripts[i].innerHTML.replace(/\s/g, ""), "try{mArg=", ";}catch"); return _p; } } return _p; } catch (e) { return null; } } function getCk(name) { var _a; return (_a = document.cookie.match(`[;s+]?${name}=([^;]*)`)) == null ? void 0 : _a.pop(); } function autoLogin() { logger("用户已设置自动登录", "green"); if (setting.phone.length <= 0 || setting.password.length <= 0) { logger("用户未设置登录信息", "red"); return; } setTimeout(() => { $("#phone").val(setting.phone); $("#pwd").val(setting.password); $("#loginBtn").click(); }, 3e3); } function toNext() { refreshCourseList().then((res) => { if (setting.review || !setting.work) { setTimeout(() => { $("#ne-21log", window.parent.document).html(""); if (top.document.querySelector("#mainid > .prev_next.next") == void 0) { top.document.querySelector("#prevNextFocusNext").click(); return; } top.document.querySelector("#mainid > .prev_next.next").click(); }, 5e3); return; } let _t = []; $.each($(res).find("li"), (_, t) => { let curid = $(t).find(".posCatalog_select").attr("id"), status = $(t).find(".prevHoverTips").text(), name = $(t).find(".posCatalog_name").attr("title"); if (curid.indexOf("cur") != -1) { _t.push({ "curid": curid, "status": status, "name": name }); } }); let _curChaterId = $("#coursetree", window.parent.document).find(".posCatalog_active").attr("id"); let _curIndex = _t.findIndex((item) => item["curid"] == _curChaterId); for (_curIndex; _curIndex < _t.length - 1; _curIndex++) { if (_t[_curIndex]["status"].indexOf("待完成") != -1) { let c_tabs = top.document.querySelectorAll("#prev_tab li"); let c_active_tab = top.document.querySelector("#prev_tab li.active"); if (c_tabs && c_active_tab) { let c_active_tab_id = c_active_tab.getAttribute("id").replace(/dct/, ""); if (c_active_tab_id != c_tabs.length) { setTimeout(() => { $("#ne-21log", window.parent.document).html(""); if (top.document.querySelector("#mainid > .prev_next.next") == void 0) { top.document.querySelector("#prevNextFocusNext").click(); return; } top.document.querySelector("#mainid > .prev_next.next").click(); }, 5e3); return; } } } let t = _t[_curIndex + 1]; if (t["status"].indexOf("待完成") != -1) { setTimeout(() => { $("#ne-21log", window.parent.document).html(""); if (top.document.querySelector("#mainid > .prev_next.next") == void 0) { top.document.querySelector("#prevNextFocusNext").click(); return; } top.document.querySelector("#mainid > .prev_next.next").click(); showBox(); }, 5e3); return; } else if (t["status"].indexOf("闯关") != -1) { logger("当前为闯关模式,存在未完成任务点,脚本已暂停运行,请手动完成并点击下一章节", "red"); return; } else if (t["status"].indexOf("开放") != -1) { logger("章节未开放", "red"); return; } else ; } logger("此课程处理完毕", "green"); return; }); } function missonStart() { if (_mlist.length <= 0) { logger("此页面任务处理完毕,准备跳转页面", "green"); return toNext(); } let _type = _mlist[0]["type"], _dom = _domList[0], _task = _mlist[0]; if (_type == void 0) { _type = _mlist[0]["property"]["module"]; } switch (_type) { case "video": if (_mlist[0]["property"]["module"] == "insertvideo") { logger("开始处理视频", "purple"); missonVideo(_dom, _task); break; } else if (_mlist[0]["property"]["module"] == "insertaudio") { logger("开始处理音频", "purple"); missonAudio(_dom, _task); break; } else { logger("未知类型任务,请联系作者,跳过", "red"); switchMission(); break; } case "workid": logger("开始处理测验", "purple"); missonWork(_dom, _task); break; case "document": logger("开始处理文档", "purple"); missonDoucument(_dom, _task); break; case "read": logger("开始处理阅读", "purple"); missonRead(_dom, _task); break; case "insertbook": logger("开始处理读书", "purple"); missonBook(_dom, _task); break; default: let GarbageTasks = ["insertimage"]; if (GarbageTasks.indexOf(_type) != -1) { logger("发现无需处理任务,跳过。", "red"); switchMission(); } else { logger("暂不支持处理此类型:" + _type + ",跳过。", "red"); switchMission(); } } } function missonAudio(dom, obj) { if (!setting.audio) { logger("用户设置不处理音频任务,准备开始下一个任务。", "red"); setTimeout(() => { switchMission(); }, 3e3); return; } let isDo; if (setting.task) { logger("当前只处理任务点任务", "red"); if (obj["jobid"] == void 0 ? false : true) { isDo = true; } else { isDo = false; } } else { logger("当前默认处理所有任务(包括非任务点任务)", "red"); isDo = true; } if (isDo) { let classId = _defaults["clazzId"], userId = _defaults["userid"], fid = _defaults["fid"], reportUrl = _defaults["reportUrl"], isPassed = obj["isPassed"], otherInfo = obj["otherInfo"], jobId = obj["property"]["_jobid"], name = obj["property"]["name"], objectId = obj["property"]["objectid"]; if (!setting.review && isPassed == true) { logger("音频:" + name + "检测已完成,准备处理下一个任务", "green"); switchMission(); return; } else if (setting.review) { logger("已开启复习模式,开始处理音频:" + name, "pink"); } $.ajax({ url: _l.protocol + "//" + _l.host + "/ananas/status/" + objectId + "?k=" + fid + "&flag=normal&_dc=" + String(Math.round(/* @__PURE__ */ new Date())), type: "GET", success: function (res) { try { let duration = res["duration"], dtoken = res["dtoken"], clipTime = "0_" + duration, playingTime = 0, isdrag = "3", _rt = "0.9"; if (setting.rate == 0) { logger("已开启音频秒过,99.9%会导致进度重置、挂科等问题。", "red"); logger("已开启音频秒过,请等待5秒!!!", "red"); } else if (setting.rate > 1 && setting.rate <= 16) { logger("已开启音频倍速,当前倍速:" + setting.rate + ",99.9%会导致进度重置、挂科等问题。", "red"); logger("已开启音频倍速,进度40秒更新一次,请等待!", "red"); } else if (setting.rate > 16) { setting.rate = 1; logger("超过允许设置的最大倍数,已重置为1倍速。", "red"); } else { logger("音频进度每隔40秒更新一次,请等待耐心等待...", "blue"); } logger("音频:" + name + "开始播放"); updateAudio( reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt ).then((status) => { switch (status) { case 1: logger("音频:" + name + "已播放" + String(playingTime / duration * 100).slice(0, 4) + "%", "purple"); isdrag = "0"; break; case 3: _rt = _rt === "1" ? "0.9" : "1"; break; default: console.log(status); } }); let _loop = setInterval(() => { playingTime += 40 * setting.rate; if (playingTime >= duration || setting.rate == 0) { clearInterval(_loop); playingTime = duration; isdrag = "4"; } else if (_rt === "1" && playingTime == 40 * setting.rate) { isdrag = "3"; } else { isdrag = "0"; } updateAudio( reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt ).then((status) => { switch (status) { case 0: playingTime -= 40; break; case 1: logger("音频:" + name + "已播放" + String(playingTime / duration * 100).slice(0, 4) + "%", "purple"); break; case 2: clearInterval(_loop); logger("音频:" + name + "检测播放完毕,准备处理下一个任务。", "green"); switchMission(); break; case 3: playingTime -= 40; _rt = _rt === "1" ? "0.9" : "1"; break; default: console.log(status); } }); }, setting.rate == 0 ? 5e3 : 4e4); } catch (e) { logger("发生错误:" + e, "red"); } } }); } else { logger("用户设置只处理属于任务点的任务,准备处理下一个任务", "green"); switchMission(); return; } } function missonVideo(dom, obj) { if (!setting.video) { logger("用户设置不处理视频任务,准备开始下一个任务。", "red"); setTimeout(() => { switchMission(); }, 3e3); return; } let ifs = $(dom).attr("style"); $(dom).contents().find("body").find(".main").attr("style", "visibility:hidden;"); $(dom).contents().find("body").prepend(`

🌸 SuperStar 提醒您:


视频正在后台播放,具体进度参看右侧浮窗。


`); $(dom).contents().find("body").find("#ne21_button").click(() => { $(dom).contents().find("body").find("#ne21_mask").attr("style", "display:none;"); $(dom).contents().find("body").find(".main").attr("style", "visibility:none;"); }); let isDo; if (setting.task) { logger("当前只处理任务点任务", "red"); if (obj["jobid"] == void 0 ? false : true) { isDo = true; } else { isDo = false; } } else { logger("当前默认处理所有任务(包括非任务点任务)", "red"); isDo = true; } if (isDo) { let classId = _defaults["clazzId"], userId = _defaults["userid"], fid = _defaults["fid"], reportUrl = _defaults["reportUrl"], isPassed = obj["isPassed"], otherInfo = obj["otherInfo"], jobId = obj["property"]["_jobid"], name = obj["property"]["name"], objectId = obj["property"]["objectid"]; if (!setting.review && isPassed == true) { logger("视频:" + name + "检测已完成,准备处理下一个任务", "green"); switchMission(); return; } else if (setting.review) { logger("已开启复习模式,开始处理视频:" + name, "pink"); } $.ajax({ url: _l.protocol + "//" + _l.host + "/ananas/status/" + objectId + "?k=" + fid + "&flag=normal&_dc=" + String(Math.round(/* @__PURE__ */ new Date())), type: "GET", success: function (res) { try { let duration = res["duration"], dtoken = res["dtoken"], clipTime = "0_" + duration, playingTime = 0, isdrag = "3", _rt = "0.9"; if (setting.rate == 0) { logger("已开启视频秒过,99.9%会导致进度重置、挂科等问题。", "red"); logger("已开启视频秒过,请等待5秒!!!", "red"); } else if (setting.rate > 1 && setting.rate <= 16) { logger("已开启视频倍速,当前倍速:" + setting.rate + ",99.9%会导致进度重置、挂科等问题。", "red"); logger("已开启视频倍速,进度40秒更新一次,请等待!", "red"); } else if (setting.rate > 16) { setting.rate = 1; logger("超过允许设置的最大倍数,已重置为1倍速。", "red"); } else { logger("视频进度每隔40秒更新一次,请等待耐心等待...", "blue"); } logger("视频:" + name + "开始播放"); updateVideo( reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt ).then((status) => { switch (status) { case 1: logger("视频:" + name + "已播放" + String(playingTime / duration * 100).slice(0, 4) + "%", "purple"); isdrag = "0"; break; case 3: _rt = _rt === "1" ? "0.9" : "1"; break; default: console.log(status); } }); let _loop = setInterval(() => { playingTime += 40 * setting.rate; if (playingTime >= duration || setting.rate == 0) { clearInterval(_loop); playingTime = duration; isdrag = "4"; } else if (_rt === "1" && playingTime == 40 * setting.rate) { isdrag = "3"; } else { isdrag = "0"; } updateVideo( reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt ).then((status) => { switch (status) { case 0: playingTime -= 40; break; case 1: logger("视频:" + name + "已播放" + String(playingTime / duration * 100).slice(0, 4) + "%", "purple"); break; case 2: clearInterval(_loop); logger("视频:" + name + "检测播放完毕,准备处理下一个任务。", "green"); switchMission(); break; case 3: playingTime -= 40; _rt = _rt === "1" ? "0.9" : "1"; break; default: console.log(status); } }); }, setting.rate == 0 ? 5e3 : 4e4); } catch (e) { logger("发生错误:" + e, "red"); } } }); } else { logger("用户设置只处理属于任务点的任务,准备处理下一个任务", "green"); switchMission(); return; } } function missonBook(dom, obj) { if (setting.task) { if (obj["jobid"] == void 0) { logger("当前只处理任务点任务,跳过", "red"); switchMission(); return; } } let jobId = obj["property"]["jobid"], name = obj["property"]["bookname"], jtoken = obj["jtoken"], knowledgeId = _defaults["knowledgeid"], courseId = _defaults["courseid"], clazzId = _defaults["clazzId"]; if (obj["job"] == void 0) { logger("读书:" + name + "检测已完成,准备执行下一个任务。", "green"); switchMission(); return; } $.ajax({ url: _l.protocol + "//" + _l.host + "/ananas/job?jobid=" + jobId + "&knowledgeid=" + knowledgeId + "&courseid=" + courseId + "&clazzid=" + clazzId + "&jtoken=" + jtoken + "&_dc=" + String(Math.round(/* @__PURE__ */ new Date())), method: "GET", success: function (res) { if (res.status) { logger("读书:" + name + res.msg + ",准备执行下一个任务。", "green"); } else { logger("读书:" + name + "处理异常,跳过。", "red"); } switchMission(); return; } }); } function missonDoucument(dom, obj) { if (setting.task) { if (obj["jobid"] == void 0) { logger("当前只处理任务点任务,跳过", "red"); switchMission(); return; } } let jobId = obj["property"]["jobid"], name = obj["property"]["name"], jtoken = obj["jtoken"], knowledgeId = _defaults["knowledgeid"], courseId = _defaults["courseid"], clazzId = _defaults["clazzId"]; if (obj["job"] == void 0) { logger("文档:" + name + "检测已完成,准备执行下一个任务。", "green"); switchMission(); return; } $.ajax({ url: _l.protocol + "//" + _l.host + "/ananas/job/document?jobid=" + jobId + "&knowledgeid=" + knowledgeId + "&courseid=" + courseId + "&clazzid=" + clazzId + "&jtoken=" + jtoken + "&_dc=" + String(Math.round(/* @__PURE__ */ new Date())), method: "GET", success: function (res) { if (res.status) { logger("文档:" + name + res.msg + ",准备执行下一个任务。", "green"); } else { logger("文档:" + name + "处理异常,跳过。", "red"); } switchMission(); return; } }); } function missonRead(dom, obj) { if (setting.task) { if (obj["jobid"] == void 0) { logger("当前只处理任务点任务,跳过", "red"); switchMission(); return; } } let jobId = obj["property"]["jobid"], name = obj["property"]["title"], jtoken = obj["jtoken"], knowledgeId = _defaults["knowledgeid"], courseId = _defaults["courseid"], clazzId = _defaults["clazzId"]; if (obj["job"] == void 0) { logger("阅读:" + name + ",检测已完成,准备执行下一个任务。", "green"); switchMission(); return; } $.ajax({ url: _l.protocol + "//" + _l.host + "/ananas/job/readv2?jobid=" + jobId + "&knowledgeid=" + knowledgeId + "&courseid=" + courseId + "&clazzid=" + clazzId + "&jtoken=" + jtoken + "&_dc=" + String(Math.round(/* @__PURE__ */ new Date())), method: "GET", success: function (res) { if (res.status) { logger("阅读:" + name + res.msg + ",准备执行下一个任务。", "green"); } else { logger("阅读:" + name + "处理异常,跳过。", "red"); } switchMission(); return; } }); } function missonWork(dom, obj) { if (!setting.work) { logger("用户设置不自动处理测验,准备处理下一个任务", "green"); switchMission(); return; } let isDo; if (setting.task) { logger("当前只处理任务点任务", "red"); if (obj["jobid"] == void 0 ? false : true) { isDo = true; } else { isDo = false; } } else { logger("当前默认处理所有任务(包括非任务点任务)", "red"); isDo = true; } if (isDo) { if (obj["jobid"] !== void 0) { let phoneWeb = _l.protocol + "//" + _l.host + "/work/phone/work?workId=" + obj["jobid"].replace("work-", "") + "&courseId=" + _defaults["courseid"] + "&clazzId=" + _defaults["clazzId"] + "&knowledgeId=" + _defaults["knowledgeid"] + "&jobId=" + obj["jobid"] + "&enc=" + obj["enc"]; setTimeout(() => { startDoPhoneCyWork(0, dom, phoneWeb); }, 3e3); } else { setTimeout(() => { startDoCyWork(0, dom); }, 3e3); } } else { logger("用户设置只处理属于任务点的任务,准备处理下一个任务", "green"); switchMission(); return; } } function doPhoneWork($dom) { let $cy = $dom.find(".Wrappadding form"); $subBtn = $cy.find(".zquestions .zsubmit .btn-ok-bottom"); $saveBtn = $cy.find(".zquestions .zsubmit .btn-save"); let TimuList = $cy.find(".zquestions .Py-mian1"); startDoPhoneTimu(0, TimuList); } function startDoPhoneTimu(index, TimuList) { if (index == TimuList.length) { if (setting.sub) { logger("测验处理完成,准备自动提交。", "green"); setTimeout(() => { $subBtn.click(); setTimeout(() => { logger("提交成功,准备切换下一个任务。", "green"); _mlist.splice(0, 1); _domList.splice(0, 1); setTimeout(() => { switchMission(); }, 3e3); }, 3e3); }, 5e3); } else if (setting.force) { logger("测验处理完成,存在无答案题目,由于用户设置了强制提交,准备自动提交。", "red"); setTimeout(() => { $subBtn.click(); setTimeout(() => { logger("提交成功,准备切换下一个任务。", "green"); _mlist.splice(0, 1); _domList.splice(0, 1); setTimeout(() => { switchMission(); }, 3e3); }, 3e3); }, 5e3); } else { logger("测验处理完成,存在无答案题目或用户设置不自动提交,自动保存!", "green"); setTimeout(() => { $saveBtn.click(); setTimeout(() => { logger("保存成功,准备切换下一个任务。", "green"); _mlist.splice(0, 1); _domList.splice(0, 1); setTimeout(() => { switchMission(); }, 3e3); }, 3e3); }, 5e3); } return; } let questionFull = $(TimuList[index]).find(".Py-m1-title").html(); let _question = tidyQuestion(questionFull).replace(/.*?\[.*?题\]\s*\n\s*/, "").trim(); let _type = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4, 选择题: 5 }[questionFull.match(/.*?\[(.*?)]|$/)[1]]; let _a = []; let _answerTmpArr; switch (_type) { case 0: getAnswer(_type, _question).then((agrs) => { _answerTmpArr = $(TimuList[index]).find(".answerList.singleChoice li"); $.each(_answerTmpArr, (i, t) => { _a.push(tidyStr($(t).html()).replace(/^[A-Z]\s*\n\s*/, "").trim()); }); let _i = _a.findIndex((item) => item == agrs); if (_i == -1) { logger("未匹配到正确答案,跳过此题", "red"); setting.sub = 0; setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } else { $(_answerTmpArr[_i]).click(); logger("自动答题成功,准备切换下一题", "green"); setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } }); break; case 1: getAnswer(_type, _question).then((agrs) => { if (agrs == "暂无答案") { logger("未匹配到正确答案,跳过此题", "red"); setting.sub = 0; setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } else { _answerTmpArr = $(TimuList[index]).find(".answerList.multiChoice li"); $.each(_answerTmpArr, (i, t) => { let _tt = tidyStr($(t).html()).replace(/^[A-Z]\s*\n\s*/, "").trim(); if (agrs.indexOf(_tt) != -1) { setTimeout(() => { $(_answerTmpArr[i]).click(); }, 300); } }); let check = 0; setTimeout(() => { $.each(_answerTmpArr, (i, t) => { if ($(t).attr("class").indexOf("cur") != -1) { check = 1; } }); if (check) { logger("自动答题成功,准备切换下一题", "green"); } else { logger("未能正确选择答案,请手动选择,跳过此题", "red"); setting.sub = 0; } setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); }, 1e3); } }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } }); break; case 2: getAnswer(_type, _question).then((agrs) => { if (agrs == "暂无答案") { logger("未匹配到正确答案,跳过此题", "red"); setting.sub = 0; setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); return; } let answers = agrs.split("#"); let tkList = $(TimuList[index]).find(".blankList2 input"); $.each(tkList, (i, t) => { setTimeout(() => { $(t).val(answers[i]); }, 200); }); setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } }); break; case 3: getAnswer(_type, _question).then((agrs) => { if (agrs == "暂无答案") { logger("未匹配到正确答案,跳过此题", "red"); setting.sub = 0; setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } else { let _true = "正确|是|对|√|T|ri"; _answerTmpArr = $(TimuList[index]).find(".answerList.panduan li"); if (_true.indexOf(agrs) != -1) { $.each(_answerTmpArr, (i, t) => { if ($(t).attr("val-param") == "true") { $(t).click(); } }); } else { $.each(_answerTmpArr, (i, t) => { if ($(t).attr("val-param") == "false") { $(t).click(); } }); } logger("自动答题成功,准备切换下一题", "green"); setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } }); break; case 5: getAnswer(_type, _question).then((agrs) => { setting.sub = 0; logger("此类型题目无法区分单/多选,请手动选择答案", "red"); setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); } }); break; default: logger("暂不支持处理此类型题目:" + questionFull.match(/.*?\[(.*?)]|$/)[1] + ",跳过!请手动作答。", "red"); setting.sub = 0; setTimeout(() => { startDoPhoneTimu(index + 1, TimuList); }, setting.time); break; } } function startDoPhoneCyWork(index, doms, phoneWeb) { if (index == doms.length) { logger("此页面全部测验已处理完毕!准备进行下一项任务"); setTimeout(missonStart, 5e3); return; } logger("等待测验框架加载...", "purple"); elmGetter.get("iframe", $(doms[index]).contents()[0]).then((element) => { let workIframe = element; if (workIframe.length == 0) { setTimeout(() => { startDoPhoneCyWork(index, doms); }, 5e3); } let workStatus = $(workIframe).contents().find(".newTestCon .newTestTitle .testTit_status").text().trim(); if (!workStatus) { logger("获取测验状态失败,请联系作者修复!", "red"); _domList.splice(0, 1); setTimeout(missonStart, 2e3); return; } if (setting.share && workStatus.indexOf("已完成") != -1) { logger("测验:" + (index + 1) + ",检测到此测验已完成,准备收录答案。", "green"); setTimeout(() => { upLoadWork(index, doms, workIframe); }, 2e3); } else if (workStatus.indexOf("待做") != -1 || workStatus.indexOf("待完成") != -1) { logger("测验:" + (index + 1) + ",准备处理此测验...", "purple"); $(workIframe).attr("src", phoneWeb); elmGetter.get('iframe[src="' + phoneWeb + '"]', $(doms[index]).contents()[0]).then((element2) => { setTimeout(() => { doPhoneWork($(element2).contents()); }, 3e3); }); } else if (workStatus.indexOf("待批阅") != -1) { _mlist.splice(0, 1); _domList.splice(0, 1); logger("测验:" + (index + 1) + ",测验待批阅,跳过", "red"); setTimeout(() => { startDoPhoneCyWork(index + 1, doms, phoneWeb); }, 5e3); } else { _mlist.splice(0, 1); _domList.splice(0, 1); logger("测验:" + (index + 1) + ",未知状态或用户选择不收录答案,跳过", "red"); setTimeout(() => { startDoPhoneCyWork(index + 1, doms, phoneWeb); }, 5e3); } }); } function startDoCyWork(index, doms) { if (index == doms.length) { logger("此页面全部测验已处理完毕!准备进行下一项任务"); setTimeout(missonStart, 5e3); return; } logger("等待测验框架加载...", "purple"); elmGetter.get("iframe", $(doms[index]).contents()[0]).then((element) => { let workIframe = element; if (workIframe.length == 0) { setTimeout(() => { startDoCyWork(index, doms); }, 5e3); } let workStatus = $(workIframe).contents().find(".newTestCon .newTestTitle .testTit_status").text().trim(); if (!workStatus) { logger("获取测验状态失败,请联系作者修复!", "red"); _domList.splice(0, 1); setTimeout(missonStart, 2e3); return; } if (setting.share && workStatus.indexOf("已完成") != -1) { logger("测验:" + (index + 1) + ",检测到此测验已完成,准备收录答案。", "green"); setTimeout(() => { upLoadWork(index, doms, workIframe); }, 2e3); } else if (workStatus.indexOf("待做") != -1 || workStatus.indexOf("待完成") != -1) { logger("测验:" + (index + 1) + ",准备处理此测验...", "purple"); setTimeout(() => { doWork(index, doms, workIframe); }, 5e3); } else if (workStatus.indexOf("待批阅") != -1) { _mlist.splice(0, 1); _domList.splice(0, 1); logger("测验:" + (index + 1) + ",测验待批阅,跳过", "red"); setTimeout(() => { startDoCyWork(index + 1, doms); }, 5e3); } else { _mlist.splice(0, 1); _domList.splice(0, 1); logger("测验:" + (index + 1) + ",未知状态或用户选择不收录答案,跳过", "red"); setTimeout(() => { startDoCyWork(index + 1, doms); }, 5e3); } }); } function missonHomeWork() { logger("开始处理作业", "green"); let $_homeworktable = $(".mark_table").find("form"); let TimuList = $_homeworktable.find(".questionLi"); doHomeWork(0, TimuList); } function doHomeWork(index, TiMuList) { if (index == TiMuList.length) { logger("作业题目已全部完成", "green"); return; } let _type = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[$(TiMuList[index]).attr("typename")]; let _questionFull = $(TiMuList[index]).find(".mark_name").html(); let _question = tidyQuestion(_questionFull).replace(/^[(].*?[)]/, "").trim(); let _a = []; let _answerTmpArr, _textareaList; switch (_type) { case 0: _answerTmpArr = $(TiMuList[index]).find(".stem_answer").find(".answer_p"); getAnswer(_type, _question).then((agrs) => { $.each(_answerTmpArr, (i, t) => { _a.push(tidyStr($(t).html())); }); let _i2 = _a.findIndex((item) => item == agrs); if (_i2 == -1) { logger("未匹配到正确答案,跳过此题", "red"); setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); } else { setTimeout(() => { let check = $(_answerTmpArr[_i2]).parent().find("span").attr("class"); if (check.indexOf("check_answer") == -1) { $(_answerTmpArr[_i2]).parent().click(); } logger("自动答题成功,准备切换下一题", "green"); setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); }, 300); } }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); } }); break; case 1: _answerTmpArr = $(TiMuList[index]).find(".stem_answer").find(".answer_p"); getAnswer(_type, _question).then((agrs) => { $.each(_answerTmpArr, (i, t) => { if (agrs.indexOf(tidyStr($(t).html())) != -1) { setTimeout(() => { let check = $(_answerTmpArr[i]).parent().find("span").attr("class"); if (check.indexOf("check_answer_dx") == -1) { $(_answerTmpArr[i]).parent().click(); } }, 300); } }); logger("自动答题成功,准备切换下一题", "green"); setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); } }); break; case 2: _textareaList = $(TiMuList[index]).find(".stem_answer").find(".Answer .divText .textDIV textarea"); getAnswer(_type, _question).then((agrs) => { let _answerTmpArr2 = agrs.split("#"); $.each(_textareaList, (i, t) => { let _id = $(t).attr("id"); setTimeout(() => { UE.getEditor(_id).setContent(_answerTmpArr2[i]); }, 300); }); logger("自动答题成功,准备切换下一题", "green"); setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); } }); break; case 3: let _true = "正确|是|对|√|T|ri"; let _false = "错误|否|错|×|F|wr"; let _i = 0; _answerTmpArr = $(TiMuList[index]).find(".stem_answer").find(".answer_p"); $.each(_answerTmpArr, (i, t) => { _a.push($(t).text().trim()); }); getAnswer(_type, _question).then((agrs) => { if (_true.indexOf(agrs) != -1) { _i = _a.findIndex((item) => _true.indexOf(item) != -1); } else if (_false.indexOf(agrs) != -1) { _i = _a.findIndex((item) => _false.indexOf(item) != -1); } else { logger("答案匹配出错,准备切换下一题", "green"); setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); return; } setTimeout(() => { let check = $(_answerTmpArr[_i]).parent().find("span").attr("class"); if (check.indexOf("check_answer") == -1) { $(_answerTmpArr[_i]).parent().click(); } }, 300); logger("自动答题成功,准备切换下一题", "green"); setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); } }); break; case 4: _textareaList = $(TiMuList[index]).find(".stem_answer").find(".eidtDiv textarea"); getAnswer(_type, _question).then((agrs) => { $.each(_textareaList, (i, t) => { let _id = $(t).attr("id"); setTimeout(() => { UE.getEditor(_id).setContent(agrs); }, 300); }); logger("自动答题成功,准备切换下一题", "green"); setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); }).catch((agrs) => { if (agrs["c"] == 0) { setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); } }); break; default: logger("暂不支持处理此题型:" + $(TiMuList[index]).attr("typename") + ",跳过。", "red"); setTimeout(() => { doHomeWork(index + 1, TiMuList); }, setting.time); } } function missonExam() { let $_examtable = $(".mark_table").find(".whiteDiv"); let _questionFull = tidyStr($_examtable.find("h3.mark_name").html().trim()); let _qType = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3 }[_questionFull.match(/[(](.*?),.*?分[)]|$/)[1]]; let _question = tidyQuestion(_questionFull.replace(/[(].*?分[)]/, "").replace(/^\s*/, "")); let $_ansdom = $_examtable.find("#submitTest").find(".stem_answer"); let _answerTmpArr; let _a = []; switch (_qType) { case 0: _answerTmpArr = $_ansdom.find(".clearfix.answerBg .fl.answer_p"); getAnswer(_qType, _question).then((agrs) => { $.each(_answerTmpArr, (i, t) => { _a.push(tidyStr($(t).html())); }); let _i2 = _a.findIndex((item) => item == agrs); if (_i2 == -1) { logger("未匹配到正确答案,跳过此题", "red"); setTimeout(toNextExam, 5e3); } else { setTimeout(() => { if ($(_answerTmpArr[_i2]).parent().find("span").attr("class").indexOf("check_answer") == -1) { $(_answerTmpArr[_i2]).parent().click(); logger("自动答题成功,准备切换下一题", "green"); toNextExam(); } else { logger("此题已作答,准备切换下一题", "green"); toNextExam(); } }, 300); } }).catch((agrs) => { if (agrs["c"] == 0) { toNextExam(); } }); break; case 1: _answerTmpArr = $_ansdom.find(".clearfix.answerBg .fl.answer_p"); getAnswer(_qType, _question).then((agrs) => { if ($_ansdom.find(".clearfix.answerBg span.check_answer_dx").length > 0) { logger("此题已作答,准备切换下一题", "green"); toNextExam(); } else { $.each(_answerTmpArr, (i, t) => { if (agrs.indexOf(tidyStr($(t).html())) != -1) { setTimeout(() => { $(_answerTmpArr[i]).parent().click(); }, 300); } }); logger("自动答题成功,准备切换下一题", "green"); toNextExam(); } }).catch((agrs) => { if (agrs["c"] == 0) { toNextExam(); } }); break; case 2: let _textareaList = $_ansdom.find(".Answer .divText .subEditor textarea"); getAnswer(_qType, _question).then((agrs) => { let _answerTmpArr2 = agrs.split("#"); $.each(_textareaList, (i, t) => { let _id = $(t).attr("id"); setTimeout(() => { UE.getEditor(_id).setContent(_answerTmpArr2[i]); }, 300); }); logger("自动答题成功,准备切换下一题", "green"); toNextExam(); }).catch((agrs) => { if (agrs["c"] = 0) { toNextExam(); } }); break; case 3: let _true = "正确|是|对|√|T|ri"; let _false = "错误|否|错|×|F|wr"; let _i = 0; _answerTmpArr = $_ansdom.find(".clearfix.answerBg .fl.answer_p"); $.each(_answerTmpArr, (i, t) => { _a.push($(t).text().trim()); }); getAnswer(_qType, _question).then((agrs) => { if (_true.indexOf(agrs) != -1) { _i = _a.findIndex((item) => _true.indexOf(item) != -1); } else if (_false.indexOf(agrs) != -1) { _i = _a.findIndex((item) => _false.indexOf(item) != -1); } else { logger("答案匹配出错,准备切换下一题", "green"); toNextExam(); return; } if ($(_answerTmpArr[_i]).parent().find("span").attr("class").indexOf("check_answer") == -1) { setTimeout(() => { $(_answerTmpArr[_i]).parent().click(); }, 300); logger("自动答题成功,准备切换下一题", "green"); toNextExam(); } else { logger("此题已作答,准备切换下一题", "green"); toNextExam(); } }).catch((agrs) => { if (agrs["c"] == 0) { toNextExam(); } }); break; } } function toNextExam() { if (setting.examTurn) { let $_examtable = $(".mark_table").find(".whiteDiv"); let $nextbtn = $_examtable.find(".nextDiv a.jb_btn"); setTimeout(() => { $nextbtn.click(); }, setting.examTurnTime ? 2e3 + Math.floor(Math.random() * 5 + 1) * 1e3 : 2e3); } else { logger("用户设置不自动跳转下一题,请手动点击", "blue"); } } function uploadExam() { logger("考试答案收录功能处于bate阶段,遇到bug请及时反馈!!", "red"); logger("开始收录考试答案", "green"); let TimuList = $(".mark_table .mark_item .questionLi"); let data = []; $.each(TimuList, (i, t) => { let _a = {}; let _answer; let _answerTmpArr, _answerList = []; let TiMuFull = tidyQuestion($(t).find("h3").html()); let _type = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[TiMuFull.match(/[(](.*?)[)]|$/)[1].replace(/,.*?分/, "")]; let _question = TiMuFull.replace(/^[(].*?[)]|$/, "").trim(); let _rightAns = $(t).find(".mark_answer").find(".colorGreen").text().replace(/正确答案[::]/, "").trim(); switch (_type) { case 0: if (_rightAns.length <= 0) { let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class"); let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text(); if (_isTrue2 == "marking_dui" || _isZero != "0") { _rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/我的答案[::]/, "").trim(); } else { break; } } _answerTmpArr = $(t).find(".mark_letter li"); $.each(_answerTmpArr, (a, b) => { _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, "")); }); let _i = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[_rightAns]; _answer = _answerList[_i]; _a["question"] = _question; _a["type"] = _type; _a["answer"] = _answer; data.push(_a); break; case 1: _answer = []; if (_rightAns.length <= 0) { let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class"); let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text(); if (_isTrue2 == "marking_dui" || _isTrue2 == "marking_bandui" || _isZero != "0") { _rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/我的答案[::]/, "").trim(); } else { break; } } _answerTmpArr = $(t).find(".mark_letter li"); $.each(_answerTmpArr, (a, b) => { _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, "")); }); $.each(_rightAns.split(""), (c, d) => { let _i2 = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[d]; _answer.push(_answerList[_i2]); }); _a["question"] = _question; _a["type"] = _type; _a["answer"] = _answer.join("#"); data.push(_a); break; case 2: _answerTmpArr = []; let answers = $(t).find(".mark_answer").find(".colorDeep").find("dd"); if (_rightAns.length <= 0) { $.each(answers, (i2, t2) => { _isTrue = $(t2).find("span:eq(1)").attr("class"); if (_isTrue == "marking_dui") { _rightAns = $(t2).find("span:eq(0)").html(); _answerTmpArr.push(_rightAns.replace(/[(][0-9].*?[)]/, "").replace(/第.*?空:/, "").trim()); } else { return; } }); _answer = _answerTmpArr.join("#"); } else { _answer = _rightAns.replace(/\s/g, "").replace(/[(][0-9].*?[)]/g, "#").replace(/第.*?空:/g, "#").replace(/^#*/, ""); } if (_answer.length != 0) { _a["question"] = _question; _a["type"] = _type; _a["answer"] = _answer; data.push(_a); } break; case 3: if (_rightAns.length <= 0) { let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class"); let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text(); if (_isTrue2 == "marking_dui" || _isZero != "0") { _rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/我的答案[::]/, "").trim(); } else { let _true = "正确|是|对|√|T|ri"; _rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/我的答案[::]/, "").trim(); if (_true.indexOf(_rightAns) != -1) { _rightAns = "错"; } else { _rightAns = "对"; } } } _a["question"] = _question; _a["type"] = _type; _a["answer"] = _rightAns; data.push(_a); break; case 4: if (_rightAns.length <= 0) { break; } _a["question"] = _question; _a["type"] = _type; _a["answer"] = _rightAns; data.push(_a); break; } }); setTimeout(() => { uploadAnswer(data, 0); }, 1500); } function refreshCourseList() { let _p = parseUrlParams(); return new Promise((resolve, reject) => { $.ajax({ url: _l.protocol + "//" + _l.host + "/mycourse/studentstudycourselist?courseId=" + _p["courseid"] + "&chapterId=" + _p["knowledgeid"] + "&clazzid=" + _p["clazzid"] + "&mooc2=1", type: "GET", dateType: "html", success: function (res) { resolve(res); } }); }); } function updateAudio(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt) { return new Promise((resolve, reject) => { getEnc(classId, userId, jobId, objectId, playingTime, duration, clipTime).then((enc) => { if (reportUrlChange) { reportUrl = http2https(reportUrl); } $.ajax({ url: reportUrl + "/" + dtoken + "?clazzId=" + classId + "&playingTime=" + playingTime + "&duration=" + duration + "&clipTime=" + clipTime + "&objectId=" + objectId + "&otherInfo=" + otherInfo + "&jobid=" + jobId + "&userid=" + userId + "&isdrag=" + isdrag + "&view=pc&enc=" + enc + "&rt=" + Number(_rt) + "&dtype=Audio&_t=" + String(Math.round(/* @__PURE__ */ new Date())), type: "GET", success: function (res) { try { if (res["isPassed"]) { if (setting.review && playingTime != duration) { resolve(1); } else { resolve(2); } } else { if (setting.rate == 0 && playingTime == duration) { resolve(2); } else { resolve(1); } } } catch (e) { logger("发生错误:" + e, "red"); resolve(0); } }, error: function (xhr) { if (xhr.status == 403) { logger("超星返回错误信息,尝试更换参数,40s后将重试,请等待...", "red"); resolve(3); } else { reportUrlChange = 1; logger("超星返回错误信息,如果持续出现,请联系作者", "red"); } } }); }); }); } function updateVideo(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt) { return new Promise((resolve, reject) => { getEnc(classId, userId, jobId, objectId, playingTime, duration, clipTime).then((enc) => { if (reportUrlChange) { reportUrl = http2https(reportUrl); } $.ajax({ url: reportUrl + "/" + dtoken + "?clazzId=" + classId + "&playingTime=" + playingTime + "&duration=" + duration + "&clipTime=" + clipTime + "&objectId=" + objectId + "&otherInfo=" + otherInfo + "&jobid=" + jobId + "&userid=" + userId + "&isdrag=" + isdrag + "&view=pc&enc=" + enc + "&rt=" + _rt + "&dtype=Video&_t=" + String(Math.round(/* @__PURE__ */ new Date())), type: "GET", success: function (res) { try { if (res["isPassed"]) { if (setting.review && playingTime != duration) { resolve(1); } else { resolve(2); } } else { if (setting.rate == 0 && playingTime == duration) { resolve(2); } else { resolve(1); } } } catch (e) { logger("发生错误:" + e, "red"); resolve(0); } }, error: function (xhr) { if (xhr.status == 403) { logger("超星返回错误信息,尝试更换参数,40s后将重试,请等待...", "red"); resolve(3); } else { reportUrlChange = 1; logger("超星返回错误信息,如果持续出现,请联系作者", "red"); } } }); }); }); } function upLoadWork(index, doms, dom) { let $CyHtml = $(dom).contents().find(".CeYan"); let TiMuList = $CyHtml.find(".TiMu"); let data = []; for (let i = 0; i < TiMuList.length; i++) { let _a = {}; let questionFull = $(TiMuList[i]).find(".Zy_TItle.clearfix > div.clearfix").html().trim(); let _question = tidyQuestion(questionFull); let _TimuType = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[questionFull.match(/^|$/)[1]]; _a["question"] = _question; _a["type"] = _TimuType; let _selfAnswerCheck = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .answerScore .CorrectOrNot span").attr("class"); switch (_TimuType) { case 0: if (_selfAnswerCheck == "marking_dui") { let _selfAnswer = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[$(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer").text().trim().replace(/正确答案[::]/, "").replace(/我的答案[::]/, "").trim()]; let _answerForm2 = $(TiMuList[i]).find(".Zy_ulTop li"); let _answer2 = $(_answerForm2[_selfAnswer]).find("a.fl").html(); _a["answer"] = tidyStr(_answer2); } break; case 1: let _answerArr = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer").text().trim().replace(/正确答案[::]/, "").replace(/我的答案[::]/, "").trim(); let _answerForm = $(TiMuList[i]).find(".Zy_ulTop li"); let _answer = []; if (_selfAnswerCheck == "marking_dui" || _selfAnswerCheck == "marking_bandui") { for (let i2 = 0; i2 < _answerArr.length; i2++) { let _answerIndex = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[_answerArr[i2]]; _answer.push($(_answerForm[_answerIndex]).find("a.fl").html()); } } else { break; } _a["answer"] = tidyStr(_answer.join("#")); break; case 2: let _TAnswerArr = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer"); let _TAnswer = []; for (let i2 = 0; i2 < _TAnswerArr.length; i2++) { let item = _TAnswerArr[i2]; if ($(item).find("i").attr("class") == "marking_dui") { _TAnswer.push($(item).find("p").html().replace(/[(][0-9].*?[)]/, "").replace(/第.*?空:/, "").trim()); } } if (_TAnswer.length <= 0) { break; } _a["answer"] = tidyStr(_TAnswer.join("#")); break; case 3: if (_selfAnswerCheck == "marking_dui") { let _answer2 = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer").html().replace(/正确答案[::]/, "").replace(/我的答案[::]/, "").trim(); _a["answer"] = tidyStr(_answer2); } else { if ($(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer").html()) { let _answer2 = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer").html().replace(/正确答案[::]/, "").replace(/我的答案[::]/, "").trim(); if ("对|√|正确".indexOf(tidyStr(_answer2)) != -1) { _a["answer"] = "错"; } else { _a["answer"] = "对"; } } else { break; } } break; } if (_a["answer"] != void 0) { data.push(_a); } else { continue; } } uploadAnswer(data, 0).then(() => { _mlist.splice(0, 1); _domList.splice(0, 1); setTimeout(() => { startDoCyWork(index + 1, doms); }, 3e3); }); } function filterAnswerIndex(answertext) { let result = answertext.match(/[我的|正确]答案[::]\s{1}([A-Z]+?):/); return result ? result[1] : null; } function uploadHomeWork() { logger("开始收录答案", "green"); let $_homeworktable = $(".mark_table"); let TiMuList = $_homeworktable.find(".mark_item").find(".questionLi"); let data = []; $.each(TiMuList, (i, t) => { let _a = {}; let _answer; let _answerTmpArr, _answerList = []; let TiMuFull = tidyQuestion($(t).find("h3.mark_name").html()); let TiMuType = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[TiMuFull.match(/[(](.*?)[)]|$/)[1].replace(/, .*?分/, "")]; let TiMu = TiMuFull.replace(/^[(].*?[)]|$/, "").trim(); let rightAns_path = $(t).find(".mark_answer").find(".colorGreen")[0]; switch (TiMuType) { case 0: let d_rightAns; if (rightAns_path) { d_rightAns = filterAnswerIndex($(t).find(".mark_answer").find(".colorGreen").text()); } else { let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class"); let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text(); if (_isTrue2 == "marking_dui" || _isZero != "0") { d_rightAns = filterAnswerIndex($(t).find(".mark_answer").find(".colorDeep").text()); } else { return; } } _answerTmpArr = $(t).find(".mark_letter li"); $.each(_answerTmpArr, (a, b) => { _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, "")); }); let _i = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[d_rightAns]; _answer = _answerList[_i]; _a["question"] = TiMu; _a["type"] = TiMuType; _a["answer"] = _answer; data.push(_a); break; case 1: _answer = []; let m_rightAns; if (rightAns_path) { m_rightAns = filterAnswerIndex($(t).find(".mark_answer").find(".colorGreen").text()); } else { let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class"); let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text(); if (_isTrue2 == "marking_dui" || _isTrue2 == "marking_bandui" || _isZero != "0") { m_rightAns = filterAnswerIndex($(t).find(".mark_answer").find(".colorDeep").text()); } else { break; } } _answerTmpArr = $(t).find(".mark_letter li"); $.each(_answerTmpArr, (a, b) => { _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, "")); }); $.each(m_rightAns.split(""), (c, d) => { let _i2 = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[d]; _answer.push(_answerList[_i2]); }); _a["question"] = TiMu; _a["type"] = TiMuType; _a["answer"] = _answer.join("#"); data.push(_a); break; case 2: _answerTmpArr = []; let t_rightAns; let answers = $(t).find(".mark_answer").find(".colorDeep").find("dd"); if (rightAns_path) { t_rightAns = $(rightAns_path).text().replace(/\s/g, "").replace(/[(][0-9].*?[)]/g, "#").replace(/第.*?空:/g, "#").replace(/^正确答案[::]#*/, ""); _answer = t_rightAns; } else { let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text(); if (_isZero && _isZero != 0) { $.each(answers, (i2, t2) => { t_rightAns = $(t2).find("span:eq(0)").text(); _answerTmpArr.push(t_rightAns.replace(/[(][0-9].*?[)]/, "").replace(/第.*?空:/, "").trim()); }); } else { $.each(answers, (i2, t2) => { let _isTrue2 = $(t2).find("span:eq(1)").attr("class"); if (_isTrue2 == "marking_dui") { t_rightAns = $(t2).find("span:eq(0)").text(); _answerTmpArr.push(t_rightAns.replace(/[(][0-9].*?[)]/, "").replace(/第.*?空:/, "").trim()); } else { return; } }); } _answer = _answerTmpArr.join("#"); } if (_answer.length != 0) { _a["question"] = TiMu; _a["type"] = TiMuType; _a["answer"] = _answer; data.push(_a); } break; case 3: let p_rightAns; if (rightAns_path) { p_rightAns = $(rightAns_path).text().replace(/\s/g, "").replace(/^正确答案[::]/, ""); } else { let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class"); let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text(); if (_isTrue2 == "marking_dui" || _isZero != "0") { p_rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/\s/g, "").replace(/^我的答案[::]/, ""); } else { let _true = "正确|是|对|√|T|ri"; p_rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/\s/g, "").replace(/^我的答案[::]/, ""); if (_true.indexOf(p_rightAns) != -1) { p_rightAns = "错"; } else { p_rightAns = "对"; } } } _a["question"] = TiMu; _a["type"] = TiMuType; _a["answer"] = p_rightAns; data.push(_a); break; case 4: let j_rightAns; if (rightAns_path) { j_rightAns = $(rightAns_path).text().replace(/\s/g, ""); } else { break; } _a["question"] = TiMu; _a["type"] = TiMuType; _a["answer"] = j_rightAns; data.push(_a); break; } }); setTimeout(() => { uploadAnswer(data, 0); }, 1500); } function getEnc(a, b, c, d, e, f, g) { return new Promise((resolve, reject) => { let strEnc = `[${a}][${b}][${c}][${d}][${e * 1e3}][d_yHJ!$pdA~5][${f * 1e3}][${g}]`; resolve(md5(strEnc)); }); } function getAnswer(_t, _q) { if (_GM_getValue("lemtkpro")) { logger("🎈请注意:您正在使用高级搜索功能。", "#CC33FF"); return new Promise((resolve, reject) => { AdvancedSearch(_q).then((data) => { data = data.replace("===", "#"); resolve(data); }).catch((data) => { reject(data); }); }); } else { let tkurl = _host + "/api/v1/cx"; return new Promise((resolve, reject) => { let _u = getCk("_uid") || getCk("UID"); _GM_xmlhttpRequest({ method: "POST", url: tkurl, headers: { "Content-type": "application/json", "Authorization": "Bearer " + setting.token }, data: JSON.stringify({ "v": _GM_info["script"]["version"], "question": _q, "uid": _u }), timeout: setting.time, onload: function (xhr) { if (xhr.status == 200) { let obj = JSON.parse(xhr.responseText) || {}; if (obj.code == 1e3) { let _answer = /^http/.test(obj.data.answer) ? '' : obj.data.answer; logger("题目:" + _q + "
---->答案:" + _answer, "purple"); _answer = _answer.replace("===", "#"); resolve(_answer); } else if (obj.code == 1003) { NormalSearch(_q, _t).then((data) => { resolve(data); }).catch((data) => { reject(data); }); } else { logger(obj.msg, "red"); setting.sub = 0; reject({ "c": 0 }); } } else { NormalSearch(_q, _t).then((data) => { resolve(data); }).catch((data) => { reject(data); }); } }, ontimeout: function () { NormalSearch(_q, _t).then((data) => { resolve(data); }).catch((data) => { reject(data); }); } }); }); } } function AdvancedSearch(_q, _t) { let tkurl = _host + "/api/v1/mcx"; return new Promise((resolve, reject) => { let _u = getCk("_uid") || getCk("UID"); _GM_xmlhttpRequest({ method: "POST", url: tkurl, headers: { "Content-type": "application/json", "Authorization": "Bearer " + setting.token }, data: JSON.stringify({ "v": _GM_info["script"]["version"], "question": _q, "uid": _u }), timeout: setting.time, onload: function (xhr) { if (xhr.status == 200) { let obj = JSON.parse(xhr.responseText) || {}; if (obj.code == 1e3) { let _answer = /^http/.test(obj.data.answer) ? '' : obj.data.answer; logger("题目:" + _q + "
---->答案:" + _answer, "purple"); resolve(_answer); } else if (obj.code == 5e3 || obj.code == 5001) { logger(obj.msg, "red"); setting.sub = 0; reject({ "c": 0 }); } else if (obj.code == 1003) { logger("题目:" + _q + "
---->暂无答案", "red"); setting.sub = 0; reject({ "c": 0 }); } else { logger(obj.msg, "red"); setting.sub = 0; reject({ "c": 0 }); } } else if (xhr.status == 403) { logger("请求过于频繁,请稍后再试", "red"); reject({ "c": 403 }); } else if (xhr.status == 500) { logger("题库程序异常,请过一会再试", "red"); reject({ "c": 500 }); } else if (xhr.status == 444) { logger("IP异常,已被拉入服务器黑名单,请过几个小时再试", "red"); reject({ "c": 444 }); } else if (xhr.status == 400) { let obj = JSON.parse(xhr.responseText) || {}; logger(obj.msg, "red"); reject({ "c": 400 }); } else { logger("题库异常,可能被恶意攻击了...请等待恢复", "red"); reject({ "c": 555 }); } }, ontimeout: function () { logger("题库异常,可能被恶意攻击了...请等待恢复", "red"); reject({ "c": 666 }); } }); }); } function NormalSearch(_q, _t) { let _fHost = "https://cx.icodef.com"; return new Promise((resolve, reject) => { getCk("_uid") || getCk("UID"); _GM_xmlhttpRequest({ method: "POST", url: _fHost + "/wyn-nb?v=4", headers: { "Content-type": "application/x-www-form-urlencoded" }, data: "question=" + encodeURIComponent(_q), timeout: setting.time, onload: function (xhr) { if (xhr.status == 200) { let obj2 = JSON.parse(xhr.responseText) || {}; if (obj2.code == 1 && obj2.data) { let _answer = /^http/.test(obj2.data) ? '' : obj2.data; logger("题目:" + _q + "
---->答案:" + _answer, "purple"); uploadAnswer([{ "question": _q, "type": _t, "answer": obj2.data }], 1); _answer = _answer.replace("===", "#"); resolve(_answer); } else { logger("题目:" + _q + "
---->暂无答案,试试高级搜索吧", "red"); setting.sub = 0; reject({ "c": 0 }); } } else if (xhr.status == 403) { logger("请求过于频繁,请稍后再试,或者试试高级搜索吧", "red"); reject({ "c": 403 }); } else if (xhr.status == 500) { logger("题库程序异常,请过一会再试,或者试试高级搜索吧", "red"); reject({ "c": 500 }); } else if (xhr.status == 444) { logger("IP异常,已被拉入服务器黑名单,请过几个小时再试,或者试试高级搜索吧", "red"); reject({ "c": 444 }); } else if (xhr.status == 400) { var obj = $.parseJSON(xhr.responseText) || {}; logger(obj.msg, "red"); reject({ "c": 400 }); } else { logger("题库异常,可能被恶意攻击了...请等待恢复,或者试试高级搜索吧", "red"); reject({ "c": 555 }); } }, ontimeout: function () { logger("题库异常,可能被恶意攻击了...请等待恢复,或者试试高级搜索吧", "red"); reject({ "c": 666 }); } }); }); } function doWork(index, doms, dom) { $frame_c = $(dom).contents(); let $CyHtml = $frame_c.find(".CeYan"); let TiMuList = $CyHtml.find(".TiMu"); $subBtn = $frame_c.find(".ZY_sub").find(".btnSubmit"); $saveBtn = $frame_c.find(".ZY_sub").find(".btnSave"); startDoWork(index, doms, 0, TiMuList); } function startDoWork(index, doms, c, TiMuList) { if (c == TiMuList.length) { if (setting.sub) { logger("测验处理完成,准备自动提交。", "green"); setTimeout(() => { $subBtn.click(); setTimeout(() => { let $recof = $frame_c.find(".maskDiv .popDiv .popBottom a#popok"); $recof[0].click(); logger("提交成功,准备切换下一个任务。", "green"); _mlist.splice(0, 1); _domList.splice(0, 1); setTimeout(() => { startDoCyWork(index + 1, doms); }, 3e3); }, 5e3); }, 3e3); } else if (setting.force) { logger("测验处理完成,存在无答案题目,由于用户设置了强制提交,准备自动提交。", "red"); setTimeout(() => { $subBtn.click(); setTimeout(() => { let $recof = $frame_c.find(".maskDiv .popDiv .popBottom a#popok"); $recof[0].click(); logger("提交成功,准备切换下一个任务。", "green"); _mlist.splice(0, 1); _domList.splice(0, 1); setTimeout(() => { startDoCyWork(index + 1, doms); }, 3e3); }, 3e3); }, 5e3); } else { logger("测验处理完成,存在无答案题目或者用户设置不提交。", "red"); } return; } let questionFull = $(TiMuList[c]).find(".Zy_TItle.clearfix > div").html(); questionFull = tidyQuestion(questionFull).replace("/.*?/", ""); let _question = tidyQuestion(questionFull); let _TimuType = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[questionFull.match(/^【(.*?)】|$/)[1]]; let _a = []; let _answerTmpArr; switch (_TimuType) { case 0: _answerTmpArr = $(TiMuList[c]).find(".Zy_ulTop li").find("a"); $.each(_answerTmpArr, (i, t) => { _a.push(tidyStr($(t).html())); }); getAnswer(_TimuType, _question).then((agrs) => { let _i = _a.findIndex((item) => item == agrs); if (_i == -1) { logger("未匹配到正确答案,跳过", "red"); setting.sub = 0; } else { $(_answerTmpArr[_i]).parent().click(); } setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }).catch((agrs) => { setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }); break; case 1: _answerTmpArr = $(TiMuList[c]).find(".Zy_ulTop li").find("a"); getAnswer(_TimuType, _question).then((agrs) => { $.each(_answerTmpArr, (i, t) => { if (agrs.indexOf(tidyStr($(t).html())) != -1) { $(_answerTmpArr[i]).parent().click(); _a.push(["A", "B", "C", "D", "E", "F", "G"][i]); } }); if (_a.length <= 0) { logger("未匹配到正确答案,跳过", "red"); setting.sub = 0; } setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }).catch((agrs) => { setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }); break; case 2: let _textareaList = $(TiMuList[c]).find(".Zy_ulTk .XztiHover1"); getAnswer(_TimuType, _question).then((agrs) => { let _answerList = agrs.split("#"); $.each(_textareaList, (i, t) => { setTimeout(() => { $(t).find("#ueditor_" + i).contents().find(".view p").html(_answerList[i]); $(t).find("textarea").html("

" + _answerList[i] + "

"); }, 300); }); setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }).catch((agrs) => { setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }); break; case 3: _answerTmpArr = $(TiMuList[c]).find(".Zy_ulTop li").find("a"); let _true = "正确|是|对|√|T|ri"; $.each(_answerTmpArr, (i, t) => { _a.push(tidyStr($(t).html())); }); getAnswer(_TimuType, _question).then((agrs) => { agrs = _true.indexOf(agrs) != -1 ? "对" : "错"; let _i = _a.findIndex((item) => item == agrs); if (_i == -1) { logger("未匹配到正确答案,跳过", "red"); setting.sub = 0; } else { $(_answerTmpArr[_i]).parent().click(); } setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }).catch((agrs) => { setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }); break; case 4: let _textareaLista = $(TiMuList[c]).find(".Zy_ulTk .XztiHover1"); getAnswer(_TimuType, _question).then((agrs) => { if (agrs == "暂无答案") { setting.sub = 0; } let _answerList = agrs.split("#"); $.each(_textareaLista, (i, t) => { setTimeout(() => { $(t).find("#ueditor_" + i).contents().find(".view p").html(_answerList[i]); $(t).find("textarea").html("

" + _answerList[i] + "

"); }, 300); }); setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }).catch((agrs) => { setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList); }, setting.time); }); break; } } function uploadAnswer(a, t) { a.forEach((item) => { item.type = item.type + ""; }); return new Promise((resolve, reject) => { _GM_xmlhttpRequest({ url: _host + "/api/v1/upload", data: JSON.stringify({ "v": _GM_info["script"]["version"], "data": a, "uid": "13f2f52f434d44d6e595088b8f5a4baf" }), method: "POST", headers: { "Content-Type": "application/json" }, onload: function (xhr) { try { if (t == 1) { resolve(); } else { let res = JSON.parse(xhr.responseText); if (res["code"] == 1e3) { logger("答案收录成功!已提交题库后端处理!准备处理下一个任务。", "green"); } else { logger("答案收录失败了,请向作者反馈,准备处理下一个任务。", "red"); } resolve(); } } catch { let res = xhr.responseText; if (res.indexOf("防火墙") != -1) { logger("答案收录失败了,已被防火墙拦截,请联系作者手动收录。", "red"); } else { logger("答案收录失败了,未知错误,请向作者反馈。", "red"); } resolve(); } } }); }); } function switchMission() { _mlist.splice(0, 1); _domList.splice(0, 1); setTimeout(missonStart, 5e3); } function tidyStr(s) { if (s) { let str = s.replace(/<(?!img).*?>/g, "").replace(/^【.*?】\s*/, "").replace(/\s*(\d+\.\d+分)$/, "").trim().replace(/ /g, "").replace("javascript:void(0);", "").replace(new RegExp(" ", "gm"), "").replace(/^\s+/, "").replace(/\s+$/, ""); return str; } else { return null; } } function tidyQuestion(s) { if (s) { let str = s.replace(/<(?!img).*?>/g, "").replace(/^【.*?】\s*/, "").replace(/\s*(\d+\.\d+分)$/, "").replace(/^\d+[\.、]/, "").trim().replace(/ /g, "").replace("javascript:void(0);", "").replace(new RegExp(" ", "gm"), "").replace(/^\s+/, "").replace(/\s+$/, ""); return str; } else { return null; } } function decryptFont() { var $tip = $("style:contains(font-cxsecret)"); if (!$tip.length) return; var font = $tip.text().match(/base64,([\w\W]+?)'/)[1]; font = Typr.parse(base64ToUint8Array(font))[0]; var table = JSON.parse(GM_getResourceText("Table")); var match = {}; for (var i = 19968; i < 40870; i++) { $tip = Typr.U.codeToGlyph(font, i); if (!$tip) continue; $tip = Typr.U.glyphToPath(font, $tip); $tip = md5(JSON.stringify($tip)).slice(24); match[i] = table[$tip]; } $(".font-cxsecret").html(function (index, html) { $.each(match, function (key, value) { key = String.fromCharCode(key); key = new RegExp(key, "g"); value = String.fromCharCode(value); html = html.replace(key, value); }); return html; }).removeClass("font-cxsecret"); } function base64ToUint8Array(base64) { var data = window.atob(base64); var buffer = new Uint8Array(data.length); for (var i = 0; i < data.length; ++i) { buffer[i] = data.charCodeAt(i); } return buffer; } console.log("%c别假装努力,\n结局不会陪你演戏!\n加油,同学!", "color: #E4B8D5");