SuperStar小助手-支持作业、考试、视频、章节测验全自动处理

【🥇操作简单】SuperStar小助手,无需任何配置,安装即可使用。【🔊功能齐全】支持视频、音频倍速秒过;文档、图书自动完成;字体解密;章节测验、课后作业、考试自动答题、自动提交、自动收录答案;支持自动切换任务点、自动登录(不可用)等。【📔丰富题库】免费题库、自建题库、第三方独家题库,每日更新,精准识别,答案全对。【✨功能扩展】开放自定义参数,功能控制更简单

  1. // ==UserScript==
  2. // @name SuperStar小助手-支持作业、考试、视频、章节测验全自动处理
  3. // @namespace Trprr
  4. // @version 2.5.6
  5. // @author Trprr
  6. // @description 【🥇操作简单】SuperStar小助手,无需任何配置,安装即可使用。【🔊功能齐全】支持视频、音频倍速秒过;文档、图书自动完成;字体解密;章节测验、课后作业、考试自动答题、自动提交、自动收录答案;支持自动切换任务点、自动登录(不可用)等。【📔丰富题库】免费题库、自建题库、第三方独家题库,每日更新,精准识别,答案全对。【✨功能扩展】开放自定义参数,功能控制更简单
  7. // @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=
  8. // @match *://*.edu.cn/*
  9. // @match *://*.org.cn/*
  10. // @match *://*.hnsyu.net/*
  11. // @match *://*.qutjxjy.cn/*
  12. // @match *://*.ynny.cn/*
  13. // @match *://*.hnvist.cn/*
  14. // @match *://*.fjlecb.cn/*
  15. // @match *://*.gdhkmooc.com/*
  16. // @match *://*.chaoxing.com/*
  17. // @match *://*.zjelib.cn/*
  18. // @match *://*.cqrspx.cn/*
  19. // @match *://*.webtrn.cn/*
  20. // @connect scriptcat.org
  21. // @connect lemtk.xyz
  22. // @connect ioscx.com
  23. // @connect icodef.com
  24. // @connect enncy.cn
  25. // @connect localhost
  26. // @connect 127.0.0.1
  27. // @connect vanse.top
  28. // @grant GM_getResourceText
  29. // @grant GM_getValue
  30. // @grant GM_info
  31. // @grant GM_setClipboard
  32. // @grant GM_setValue
  33. // @grant GM_xmlhttpRequest
  34. // @grant unsafeWindow
  35. // @run-at document-end
  36. // @require https://update.gf.qytechs.cn/scripts/474385/1535220/GF_ElementGetter.js
  37. // @require https://update.gf.qytechs.cn/scripts/445293/1052390/TyprMd5.js
  38. // @require https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/limonte-sweetalert2/11.4.4/sweetalert2.all.min.js
  39. // @require https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.6.0/jquery.min.js
  40. // @resource Table https://www.forestpolice.org/ttf/2.0/table.json
  41. // @license GPL-3.0-or-later
  42. // @antifeature payment
  43. // ==/UserScript==
  44.  
  45. var setting = {
  46. tikuAdapter: {
  47. use: 0,
  48. url: "http://localhost:8060/adapter-service/search?use=local,icodef,buguake,wanneng,lemon&icodefToken=UafYcHViJMGzSVNh&wannengToken=E196FD8B49"
  49. },
  50. // tikuAdapter 配置详见 https://github.com/DokiDoki1103/tikuAdapter
  51. showBox: 1,
  52. // 显示脚本浮窗,0为关闭,1为开启,不建议关闭
  53. tiku: 1,
  54. // 柠檬题库服务器切换,0为主线路,1为备用线路
  55. task: 0,
  56. // 只处理任务点任务,0为关闭,1为开启
  57. video: 1,
  58. // 处理视频,0为关闭,1为开启
  59. audio: 1,
  60. // 处理音频,0为关闭,1为开启
  61. rate: 1,
  62. // 视频/音频倍速,0为秒过,1为正常速率,最高16倍
  63. review: 0,
  64. // 复习模式,0为关闭,1为开启可以补挂视频时长
  65. work: 1,
  66. // 测验自动处理,0为关闭,1为开启,开启将会处理测验,关闭会跳过测验
  67. time: 5e3,
  68. // 答题时间间隔,默认5s=5000
  69. sub: 1,
  70. // 测验自动提交,0为关闭,1为开启,当没答案时测验将不会提交,如需提交请设置force:1
  71. force: 0,
  72. // 测验强制提交,0为关闭,1为开启,开启此功能将会强制提交测验(无论作答与否)
  73. share: 1,
  74. // 自动收录答案,0为关闭,1为开启,推荐开启,会在相应页面自动收录答案
  75. decrypt: 1,
  76. // 字体解密,0为关闭,1为开启,推荐开启,方法来自wyn665817大佬
  77. examTurn: 1,
  78. // 考试自动跳转下一题,0为关闭,1为开启
  79. examTurnTime: 0,
  80. // 考试自动跳转下一题随机间隔时间(3-7s)之间,0为关闭,1为开启
  81. examAutoClick: 1,
  82. // 考试自动点击答案,0为关闭,1为开启
  83. autoLogin: 0,
  84. // 自动登录(不可用),0为关闭,1为开启,开启此功能请配置登陆配置项
  85. phone: "",
  86. // 登录(不可用)配置项:登录(不可用)手机号/SuperStar号
  87. password: ""
  88. // 登录(不可用)配置项:登录(不可用)密码
  89. };
  90. var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
  91. var _GM_info = /* @__PURE__ */ (() => typeof GM_info != "undefined" ? GM_info : void 0)();
  92. var _GM_setClipboard = /* @__PURE__ */ (() => typeof GM_setClipboard != "undefined" ? GM_setClipboard : void 0)();
  93. var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
  94. var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
  95. var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)();
  96. var _w = _unsafeWindow, _l = location, _d = _w.document, $ = _w.jQuery || top.jQuery, md5 = md5 || window.md5, UE = _w.UE, Swal = Swal || window.Swal, _host = ["aHR0cHM6Ly9hcGkubGVtdGsueHl6", "aHR0cHM6Ly9hcGkudmFuc2UudG9w", "aHR0cHM6Ly9hcGkuaW9zY3guY29t"][setting.tiku];
  97. var _mlist, _defaults, _domList, $subBtn, $saveBtn, $frame_c;
  98. var reportUrlChange = 0;
  99. var isUpdate = 0;
  100. const tikuAdapter = (_t, _q, _o) => {
  101. return new Promise(resolve => {
  102. _GM_xmlhttpRequest({
  103. method: "POST",
  104. url: setting.tikuAdapter.url,
  105. headers: {
  106. "Content-Type": "application/json;charset=utf-8"
  107. },
  108. data: JSON.stringify({
  109. question: _q,
  110. options: _o,
  111. type: _t
  112. }),
  113. onload: function (r) {
  114. try {
  115. const res = JSON.parse(r.responseText);
  116. resolve(res.answer.answerText);
  117. } catch (e) {
  118. resolve("");
  119. }
  120. },
  121. onerror: function (e) {
  122. console.log(e);
  123. resolve("");
  124. }
  125. });
  126. });
  127. };
  128. Object.defineProperty(setting, "token", {
  129. get() {
  130. return _GM_getValue("lemtk_token") ? _GM_getValue("lemtk_token").trim() : "";
  131. },
  132. set(val) {
  133. _GM_setValue("lemtk_token", val.trim())
  134. }
  135. });
  136. $(document).keydown(function (e) {
  137. if (e.keyCode == 75 && $("#ne-21notice")[0] != void 0) {
  138. let show = $("#ne-21box").css("display");
  139. $("#ne-21box").css("display", show == "block" ? "none" : "block");
  140. }
  141. });
  142. $(".navshow").find("a:contains(体验新版)")[0] ? $(".navshow").find("a:contains(体验新版)")[0].click() : "";
  143. setting.decrypt ? decryptFont() : "";
  144. if (btoa(_l.hostname) == "aS5tb29jLmNoYW94aW5nLmNvbQ==" || btoa(_l.hostname) == "aS5jaGFveGluZy5jb20=") {
  145. showTips();
  146. } else if (_l.pathname == "/login" && setting.autoLogin) {
  147. showBox();
  148. setTimeout(() => {
  149. autoLogin();
  150. }, 3e3);
  151. } else if (_l.pathname.includes("/mycourse/studentstudy")) {
  152. showBox();
  153. $("#ne-21log", window.parent.document).html("<hr />🎉🎉🎉脚本已加载,初始化完毕!🎉🎉🎉");
  154. } else if (_l.pathname.includes("/knowledge/cards")) {
  155. if (top.location.href != _GM_getValue("curUrl")) {
  156. _GM_setValue("curUrl", top.location.href);
  157. setTimeout(() => {
  158. top.location.replace(top.location.href);
  159. }, 1e3);
  160. } else {
  161. check_update().then(() => {
  162. console.log("update...")
  163. }).catch(() => {
  164. var params = getTaskParams();
  165. if (params == null || params == "$mArg" || $.parseJSON(params)["attachments"].length <= 0) {
  166. logger("无任务点可处理,即将跳转页面", "red");
  167. toNext();
  168. } else {
  169. setTimeout(() => {
  170. top.checkJob ? top.checkJob = () => false : true;
  171. _domList = [];
  172. _mlist = $.parseJSON(params)["attachments"];
  173. _defaults = $.parseJSON(params)["defaults"];
  174. $.each($(".wrap .ans-cc .ans-attach-ct"), (i, t) => {
  175. _domList.push($(t).find("iframe"));
  176. });
  177. logger("共计" + _mlist.length + "个任务,即将开始逐个处理~", "#ed4845");
  178. missonStart();
  179. }, 3e3);
  180. }
  181. })
  182. }
  183. } else if (_l.pathname.includes("/exam/test/reVersionTestStartNew")) {
  184. showBox();
  185. setTimeout(() => {
  186. missonExam();
  187. }, 3e3);
  188. } else if (_l.pathname.includes("/exam/test/reVersionPaperMarkContentNew")) {
  189. setting.share && (() => {
  190. showBox();
  191. setTimeout(() => {
  192. uploadExam();
  193. }, 3e3);
  194. })();
  195. } else if (_l.pathname.includes("/mooc2/work/dowork")) {
  196. showBox();
  197. setTimeout(() => {
  198. missonHomeWork();
  199. }, 3e3);
  200. } else if (_l.pathname.includes("/mooc2/work/view")) {
  201. setting.share && (() => {
  202. showBox();
  203. setTimeout(() => {
  204. uploadHomeWork();
  205. }, 3e3);
  206. })();
  207. } else if (_l.pathname.includes("/work/phone/doHomeWork")) {
  208. _oldal = _w.alert;
  209. _w.alert = function (msg) {
  210. if (msg == "保存成功") {
  211. return;
  212. }
  213. return _oldal(msg);
  214. };
  215. _w.workPop = function (content, okTent, okcallback, cancelCallback) {
  216. okcallback && okcallback();
  217. };
  218. _w.workPop2 = function (content, okTent, cancelTent, okcallback, cancelCallback) {
  219. okcallback && okcallback();
  220. };
  221. if (top.workPop2) {
  222. top.workPop2 = _w.workPop2;
  223. }
  224. } else if (_l.pathname.includes("/mooc2/exam/exam-list")) {
  225. Swal.fire("SuperStar学习小助手提示", "注意:专业课可能会存在答案不全或无答案,请谨慎使用脚本考试,一切后果由您自己承担。", "info");
  226. } else if (_l.pathname.includes("/mycourse/studentcourse")) {
  227. let texts = `<div style="font-size: x-small;">注意:请勿在非正常学习时间段(凌晨、通宵)运行脚本,以免造成学习进度被重置。<hr />此项目作为开源的用户脚本,遵循用户脚本的编写规范,并且使用纯粹的 javascript 执行代码,不对页面进行任何源码的修改,不附加任何等非法入侵计算机系统的功能,不对客户端计算机进行任何破坏越权控制等行为。</div>`;
  228. Swal.fire(texts);
  229. } else {
  230. };
  231. function http2https(url) {
  232. let _url = url.replace(/^http:/, "https:");
  233. return _url;
  234. }
  235. function parseUrlParams() {
  236. let query = window.location.search.substring(1);
  237. let vars = query.split("&");
  238. let _p = {};
  239. for (let i = 0; i < vars.length; i++) {
  240. let pair = vars[i].split("=");
  241. _p[pair[0]] = pair[1];
  242. }
  243. return _p;
  244. }
  245. function showTips() {
  246. var _msg = `<div style="font-size: x-small;"><span style='color: red;'>题库为第三方题库,与本脚本无任何关系,有能力者可自行更换。</span> <br> 脚本失效问题请直接GreasyFork私信或油猴中文网私信。<br> 脚本基于Ne-21修改且供自己使用,感谢Ne-21大佬的源码!</div>`;
  247. Swal.fire(_msg);
  248. }
  249. function switchLemtkPro() {
  250. if (_GM_getValue("lemtkpro") == 1) {
  251. $("#lemtkpro").text("关闭题库高级搜索");
  252. } else if (_GM_getValue("lemtkpro") == 0) {
  253. $("#lemtkpro").text("开启题库高级搜索");
  254. } else {
  255. _GM_setValue("lemtkpro", 0);
  256. switchLemtkPro();
  257. }
  258. }
  259. function switchLemtkToken() {
  260. if (setting.token) {
  261. $("#lemtktoken").val(setting.token);
  262. $("#lemtkbtn").text("清空Token");
  263. $("#lemtksq").text("重置Token");
  264. } else {
  265. $("#lemtktoken").val("");
  266. $("#lemtkbtn").text("保存Token");
  267. $("#lemtksq").text("获取Token");
  268. }
  269. }
  270. function showBox() {
  271. if (setting.showBox && top.document.querySelector("#ne-21notice") == void 0) {
  272. var box_html = `<div style="font-family: fangsong;font-weight: bold;"><div id="ne-21box" style="border: 2px dashed rgb(0, 85, 68); width: 380px; position: fixed; top: 6%; right: 20%; z-index: 99999; background-color: rgba(184, 247, 255, 0.7); overflow-x: auto;">
  273. <div style="display: flex;justify-content: space-between;margin: 0 5%;" title="按k键即可恢复面板"><h3 style="text-align: center;">🌸SuperStar学习小助手v` + _GM_info["script"]["version"] + `</h3><h3 id="ne-21close" style="color: red;">[K键关闭面板]</h3></div>
  274. <div id="ne-21notice" style="border-top: 1px solid #000;border-bottom: 1px solid #000;margin: 4px 0px;overflow: hidden;"></div>
  275. <div style="padding-bottom: 5px;"><div style="display: flex;padding: 2px 5px; justify-content: space-around;"><div>柠檬题库Token:<input type="password" id="lemtktoken" placeholder="请输入Token" /></div><button style="width: 25%;" id="lemtkcopy">复制Token</button></div><div style="display: flex;justify-content: space-evenly;align-items: center;"><button id="lemtkpro">开启/关闭高级搜索</button> - <button id="lemtkbtn">保存Token</button> - <button id="lemtksq">获取/重置Token</button></div></div>
  276. <div id="ne-21log" style="max-height:200px;"></div>
  277. </div></div>`;
  278. $(box_html).appendTo("body");
  279. $("#ne-21close").click(function () {
  280. let show = $("#ne-21box").css("display");
  281. $("#ne-21box").css("display", show == "block" ? "none" : "block");
  282. });
  283. $(`<div id='tips21'>
  284. <p style="text-align: center;">
  285. 🔈脚本所有的功能均没有向用户收取费用,题库配置如果不设置仍然可以使用脚本的其他功能。如果题库配置需要收费,那么最终解释权归题库配置的提供者所有。
  286. </p>
  287. <hr />
  288. <p style="text-align: center;">
  289. 🎉脚本集成柠檬题库,可免费搜索,题库支持自主上传题目,推荐使用高级搜索,提高题库命中率~<br />👉<a href="https://www.lemtk.xyz/#/" target="_blank" style="color: #ee2746;text-decoration: underline;">点此前往柠檬题库</a>👈
  290. </p>
  291. </div>`).appendTo("#ne-21notice");
  292. $("#lemtkbtn").click(function () {
  293. if (setting.token) {
  294. setting.token = "";
  295. logger("Token清除成功!", "green");
  296. } else {
  297. if ($("#lemtktoken").val().length != 32) {
  298. logger("Token格式不正确!", "red");
  299. return;
  300. }
  301. setting.token = $("#lemtktoken").val();
  302. logger("Token保存成功!", "green");
  303. }
  304. switchLemtkToken();
  305. });
  306. $("#lemtksq").click(function () {
  307. window.open("https://www.lemtk.xyz/#/", "_blank");
  308. });
  309. $("#lemtkpro").click(function () {
  310. if (_GM_getValue("lemtkpro")) {
  311. _GM_setValue("lemtkpro", 0);
  312. logger("已关闭高级搜索功能!", "red");
  313. } else {
  314. _GM_setValue("lemtkpro", 1);
  315. logger("已开启高级搜索功能!搜题需配置柠檬题库TOKEN。", "red");
  316. }
  317. switchLemtkPro();
  318. });
  319. $("#lemtkcopy").click(function () {
  320. _GM_setClipboard($("#lemtktoken").val());
  321. logger("已复制Token到剪贴板!", "green");
  322. });
  323. } else {
  324. $("#ne-21log", window.parent.document).html("");
  325. }
  326. switchLemtkPro();
  327. switchLemtkToken();
  328. }
  329. function logger(str, color) {
  330. let logSelector = $("#ne-21log", window.parent.document);
  331. let _time = (/* @__PURE__ */ new Date()).toLocaleTimeString();
  332. $('<hr /><p style="color: ' + color + ';">[' + _time + "]" + str + "</p>").prependTo(logSelector).on("click", function () {
  333. if ("题目".indexOf($(this).html()) != -1) {
  334. _GM_setClipboard(getStr($(this).html(), "题目:", "<br>----&gt;"));
  335. Swal.fire({
  336. text: "已复制",
  337. position: "top-end",
  338. width: 150,
  339. timer: 1500,
  340. showConfirmButton: false
  341. });
  342. }
  343. });
  344. }
  345. function getStr(str, start, end) {
  346. let res = str.match(new RegExp(`${start}(.*?)${end}`));
  347. return res ? res[1] : null;
  348. }
  349. function getTaskParams() {
  350. try {
  351. var _iframeScripts = _d.scripts, _p = null;
  352. for (let i = 0; i < _iframeScripts.length; i++) {
  353. if (_iframeScripts[i].innerHTML.indexOf('mArg = "";') != -1 && _iframeScripts[i].innerHTML.indexOf("==UserScript==") == -1) {
  354. _p = getStr(_iframeScripts[i].innerHTML.replace(/\s/g, ""), "try{mArg=", ";}catch");
  355. return _p;
  356. }
  357. }
  358. return _p;
  359. } catch (e) {
  360. return null;
  361. }
  362. }
  363. function getCk(name) {
  364. let _a;
  365. return (_a = document.cookie.match(`[;s+]?${name}=([^;]*)`)) == null ? void 0 : _a.pop();
  366. }
  367. function check_update() {
  368. return new Promise((reslove, reject) => {
  369. try {
  370. _GM_xmlhttpRequest({
  371. url: "https://scriptcat.org/api/v2/scripts/942",
  372. method: "GET",
  373. timeout: 3e3,
  374. onload: function (xhr) {
  375. let { code, data, msg } = JSON.parse(xhr.response)
  376. version_old = _GM_info["script"]["version"]
  377. version_new = data.script.version
  378. if (version_old != version_new) {
  379. logger("⚠检测到SuperStar最新版本为v" + version_new + ",请进入以上托管地址安装更新。", "red")
  380. logger("⚠ScriptCat托管地址:https://scriptcat.org/zh-CN/script-show-page/942", "red")
  381. logger("⚠Greasyfork托管地址:https://gf.qytechs.cn/scripts/454801", "red")
  382. reslove()
  383. } else {
  384. logger("脚本更新检测成功,当前为最新版本", "green")
  385. reject()
  386. }
  387. },
  388. ontimeout: () => {
  389. logger("脚本更新检测链接超时,请手动检查脚本是否为最新版本。", "red")
  390. logger("ScriptCat托管地址:https://scriptcat.org/zh-CN/script-show-page/942", "red")
  391. logger("Greasyfork托管地址:https://gf.qytechs.cn/scripts/454801", "red")
  392. reject()
  393. },
  394. onerror: (e) => {
  395. console.log(e)
  396. logger("脚本更新检测失败,请手动检查脚本是否为最新版本。", "red")
  397. logger("ScriptCat托管地址:https://scriptcat.org/zh-CN/script-show-page/942", "red")
  398. logger("Greasyfork托管地址:https://gf.qytechs.cn/scripts/454801", "red")
  399. reject()
  400. }
  401. });
  402. } catch (e) {
  403. console.log(e)
  404. logger("脚本更新检测失败,请手动检查脚本是否为最新版本。", "red")
  405. logger("ScriptCat托管地址:https://scriptcat.org/zh-CN/script-show-page/942", "red")
  406. logger("Greasyfork托管地址:https://gf.qytechs.cn/scripts/454801", "red")
  407. reject()
  408. }
  409. })
  410. }
  411. function autoLogin() {
  412. logger("用户已设置自动登录(不可用)", "green");
  413. if (setting.phone.length <= 0 || setting.password.length <= 0) {
  414. logger("用户未设置登录(不可用)信息", "red");
  415. return;
  416. }
  417. setTimeout(() => {
  418. $("#phone").val(setting.phone);
  419. $("#pwd").val(setting.password);
  420. $("#loginBtn").click();
  421. }, 3e3);
  422. }
  423. function toNext() {
  424. refreshCourseList().then((res) => {
  425. if (setting.review || !setting.work) {
  426. setTimeout(() => {
  427. $("#ne-21log", window.parent.document).html("");
  428. if (top.document.querySelector("#mainid > .prev_next.next") == void 0) {
  429. top.document.querySelector("#prevNextFocusNext").click();
  430. return;
  431. }
  432. top.document.querySelector("#mainid > .prev_next.next").click();
  433. }, 5e3);
  434. return;
  435. }
  436. let _t = [];
  437. $.each($(res).find("li"), (_, t) => {
  438. let curid = $(t).find(".posCatalog_select").attr("id"), status = $(t).find(".prevHoverTips").text(), name = $(t).find(".posCatalog_name").attr("title");
  439. if (curid.indexOf("cur") != -1) {
  440. _t.push({ "curid": curid, "status": status, "name": name });
  441. }
  442. });
  443. let _curChaterId = $("#coursetree", window.parent.document).find(".posCatalog_active").attr("id");
  444. let _curIndex = _t.findIndex((item) => item["curid"] == _curChaterId);
  445. for (_curIndex; _curIndex < _t.length - 1; _curIndex++) {
  446. if (_t[_curIndex]["status"].indexOf("待完成") != -1) {
  447. let c_tabs = top.document.querySelectorAll("#prev_tab li");
  448. let c_active_tab = top.document.querySelector("#prev_tab li.active");
  449. if (c_tabs && c_active_tab) {
  450. let c_active_tab_id = c_active_tab.getAttribute("id").replace(/dct/, "");
  451. if (c_active_tab_id != c_tabs.length) {
  452. setTimeout(() => {
  453. $("#ne-21log", window.parent.document).html("");
  454. if (top.document.querySelector("#mainid > .prev_next.next") == void 0) {
  455. top.document.querySelector("#prevNextFocusNext").click();
  456. return;
  457. }
  458. top.document.querySelector("#mainid > .prev_next.next").click();
  459. }, 5e3);
  460. return;
  461. }
  462. }
  463. }
  464. let t = _t[_curIndex + 1];
  465. if (t["status"].indexOf("待完成") != -1) {
  466. setTimeout(() => {
  467. $("#ne-21log", window.parent.document).html("");
  468. if (top.document.querySelector("#mainid > .prev_next.next") == void 0) {
  469. top.document.querySelector("#prevNextFocusNext").click();
  470. return;
  471. }
  472. top.document.querySelector("#mainid > .prev_next.next").click();
  473. showBox();
  474. }, 5e3);
  475. return;
  476. } else if (t["status"].indexOf("闯关") != -1) {
  477. logger("当前为闯关模式,存在未完成任务点,脚本已暂停运行,请手动完成并点击下一章节", "red");
  478. return;
  479. } else if (t["status"].indexOf("开放") != -1) {
  480. logger("章节未开放", "red");
  481. return;
  482. } else {
  483. // console.log();
  484. };
  485. }
  486. logger("此课程处理完毕", "green");
  487. return;
  488. });
  489. }
  490. function missonStart() {
  491. if (_mlist.length <= 0) {
  492. logger("此页面任务处理完毕,准备跳转页面", "green");
  493. return toNext();
  494. }
  495. let _type = _mlist[0]["type"], _dom = _domList[0], _task = _mlist[0];
  496. if (_type == void 0) {
  497. _type = _mlist[0]["property"]["module"];
  498. }
  499. switch (_type) {
  500. case "video":
  501. if (_mlist[0]["property"]["module"] == "insertvideo") {
  502. logger("开始处理视频", "purple");
  503. missonVideo(_dom, _task);
  504. break;
  505. } else if (_mlist[0]["property"]["module"] == "insertaudio") {
  506. logger("开始处理音频", "purple");
  507. missonAudio(_dom, _task);
  508. break;
  509. } else {
  510. logger("未知类型任务,请联系作者,跳过", "red");
  511. switchMission();
  512. break;
  513. }
  514. case "workid":
  515. logger("开始处理测验", "purple");
  516. missonWork(_dom, _task);
  517. break;
  518. case "document":
  519. logger("开始处理文档", "purple");
  520. missonDoucument(_dom, _task);
  521. break;
  522. case "read":
  523. logger("开始处理阅读", "purple");
  524. missonRead(_dom, _task);
  525. break;
  526. case "insertbook":
  527. logger("开始处理读书", "purple");
  528. missonBook(_dom, _task);
  529. break;
  530. default:
  531. let GarbageTasks = ["insertimage"];
  532. if (GarbageTasks.indexOf(_type) != -1) {
  533. logger("发现无需处理任务,跳过。", "red");
  534. switchMission();
  535. } else {
  536. logger("暂不支持处理此类型:" + _type + ",跳过。", "red");
  537. switchMission();
  538. }
  539. }
  540. }
  541. function missonAudio(dom, obj) {
  542. if (!setting.audio) {
  543. logger("用户设置不处理音频任务,准备开始下一个任务。", "red");
  544. setTimeout(() => {
  545. switchMission();
  546. }, 3e3);
  547. return;
  548. }
  549. let isDo;
  550. if (setting.task) {
  551. logger("当前只处理任务点任务", "red");
  552. if (obj["jobid"] == void 0 ? false : true) {
  553. isDo = true;
  554. } else {
  555. isDo = false;
  556. }
  557. } else {
  558. logger("当前默认处理所有任务(包括非任务点任务)", "red");
  559. isDo = true;
  560. }
  561. if (isDo) {
  562. 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"];
  563. if (!setting.review && isPassed == true) {
  564. logger("音频:" + name + "检测已完成,准备处理下一个任务", "green");
  565. switchMission();
  566. return;
  567. } else if (setting.review) {
  568. logger("已开启复习模式,开始处理音频:" + name, "pink");
  569. }
  570. $.ajax({
  571. url: _l.protocol + "//" + _l.host + "/ananas/status/" + objectId + "?k=" + fid + "&flag=normal&_dc=" + String(Math.round(/* @__PURE__ */ new Date())),
  572. type: "GET",
  573. success: function (res) {
  574. try {
  575. let duration = res["duration"], dtoken = res["dtoken"], clipTime = "0_" + duration, playingTime = 0, isdrag = "3", _rt = "0.9";
  576. if (setting.rate == 0) {
  577. logger("已开启音频秒过,99.9%会导致进度重置、挂科等问题。", "red");
  578. logger("已开启音频秒过,请等待5秒!!!", "red");
  579. } else if (setting.rate > 1 && setting.rate <= 16) {
  580. logger("已开启音频倍速,当前倍速:" + setting.rate + ",99.9%会导致进度重置、挂科等问题。", "red");
  581. logger("已开启音频倍速,进度40秒更新一次,请等待!", "red");
  582. } else if (setting.rate > 16) {
  583. setting.rate = 1;
  584. logger("超过允许设置的最大倍数,已重置为1倍速。", "red");
  585. } else {
  586. logger("音频进度每隔40秒更新一次,请等待耐心等待...", "blue");
  587. }
  588. logger("音频:" + name + "开始播放");
  589. updateAudio(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt).then((status) => {
  590. switch (status) {
  591. case 1:
  592. logger("音频:" + name + "已播放" + String(playingTime / duration * 100).slice(0, 4) + "%", "purple");
  593. isdrag = "0";
  594. break;
  595. case 3:
  596. _rt = _rt === "1" ? "0.9" : "1";
  597. break;
  598. default:
  599. console.log(status);
  600. }
  601. });
  602. let _loop = setInterval(() => {
  603. playingTime += 40 * setting.rate;
  604. if (playingTime >= duration || setting.rate == 0) {
  605. clearInterval(_loop);
  606. playingTime = duration;
  607. isdrag = "4";
  608. } else if (_rt === "1" && playingTime == 40 * setting.rate) {
  609. isdrag = "3";
  610. } else {
  611. isdrag = "0";
  612. }
  613. updateAudio(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt).then((status) => {
  614. switch (status) {
  615. case 0:
  616. playingTime -= 40;
  617. break;
  618. case 1:
  619. logger("音频:" + name + "已播放" + String(playingTime / duration * 100).slice(0, 4) + "%", "purple");
  620. break;
  621. case 2:
  622. clearInterval(_loop);
  623. logger("音频:" + name + "检测播放完毕,准备处理下一个任务。", "green");
  624. switchMission();
  625. break;
  626. case 3:
  627. playingTime -= 40;
  628. _rt = _rt === "1" ? "0.9" : "1";
  629. break;
  630. default:
  631. console.log(status);
  632. }
  633. });
  634. }, setting.rate == 0 ? 5e3 : 4e4);
  635. } catch (e) {
  636. logger("发生错误:" + e, "red");
  637. }
  638. }
  639. });
  640. } else {
  641. logger("用户设置只处理属于任务点的任务,准备处理下一个任务", "green");
  642. switchMission();
  643. return;
  644. }
  645. }
  646. function missonVideo(dom, obj) {
  647. if (!setting.video) {
  648. logger("用户设置不处理视频任务,准备开始下一个任务。", "red");
  649. setTimeout(() => {
  650. switchMission();
  651. }, 3e3);
  652. return;
  653. }
  654. let ifs = $(dom).attr("style");
  655. $(dom).contents().find("body").find(".main").attr("style", "visibility:hidden;");
  656. $(dom).contents().find("body").prepend(`
  657. <div id="ne21_mask" style="` + ifs + `display: flex;flex-wrap: wrap;justify-content: center;align-content: center;flex-direction: column;">
  658. <h1>🌸 SuperStar 提醒您:</h1>
  659. <br />
  660. <h3>视频正在后台播放,具体进度参看右侧浮窗。</h3>
  661. <br />
  662. <button id="ne21_button">显示原视频</button>
  663. </div>
  664. `);
  665. $(dom).contents().find("body").find("#ne21_button").click(() => {
  666. $(dom).contents().find("body").find("#ne21_mask").attr("style", "display:none;");
  667. $(dom).contents().find("body").find(".main").attr("style", "visibility:none;");
  668. });
  669. let isDo;
  670. if (setting.task) {
  671. logger("当前只处理任务点任务", "red");
  672. if (obj["jobid"] == void 0 ? false : true) {
  673. isDo = true;
  674. } else {
  675. isDo = false;
  676. }
  677. } else {
  678. logger("当前默认处理所有任务(包括非任务点任务)", "red");
  679. isDo = true;
  680. }
  681. if (isDo) {
  682. 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"];
  683. if (!setting.review && isPassed == true) {
  684. logger("视频:" + name + "检测已完成,准备处理下一个任务", "green");
  685. switchMission();
  686. return;
  687. } else if (setting.review) {
  688. logger("已开启复习模式,开始处理视频:" + name, "pink");
  689. }
  690. $.ajax({
  691. url: _l.protocol + "//" + _l.host + "/ananas/status/" + objectId + "?k=" + fid + "&flag=normal&_dc=" + String(Math.round(/* @__PURE__ */ new Date())),
  692. type: "GET",
  693. success: function (res) {
  694. try {
  695. let duration = res["duration"], dtoken = res["dtoken"], clipTime = "0_" + duration, playingTime = 0, isdrag = "3", _rt = "0.9";
  696. if (setting.rate == 0) {
  697. logger("已开启视频秒过,99.9%会导致进度重置、挂科等问题。", "red");
  698. logger("已开启视频秒过,请等待5秒!!!", "red");
  699. } else if (setting.rate > 1 && setting.rate <= 16) {
  700. logger("已开启视频倍速,当前倍速:" + setting.rate + ",99.9%会导致进度重置、挂科等问题。", "red");
  701. logger("已开启视频倍速,进度40秒更新一次,请等待!", "red");
  702. } else if (setting.rate > 16) {
  703. setting.rate = 1;
  704. logger("超过允许设置的最大倍数,已重置为1倍速。", "red");
  705. } else {
  706. logger("视频进度每隔40秒更新一次,请等待耐心等待...", "blue");
  707. }
  708. logger("视频:" + name + "开始播放");
  709. updateVideo(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt).then((status) => {
  710. switch (status) {
  711. case 1:
  712. logger("视频:" + name + "已播放" + String(playingTime / duration * 100).slice(0, 4) + "%", "purple");
  713. isdrag = "0";
  714. break;
  715. case 3:
  716. _rt = _rt === "1" ? "0.9" : "1";
  717. break;
  718. default:
  719. console.log(status);
  720. }
  721. });
  722. let _loop = setInterval(() => {
  723. playingTime += 40 * setting.rate;
  724. if (playingTime >= duration || setting.rate == 0) {
  725. clearInterval(_loop);
  726. playingTime = duration;
  727. isdrag = "4";
  728. } else if (_rt === "1" && playingTime == 40 * setting.rate) {
  729. isdrag = "3";
  730. } else {
  731. isdrag = "0";
  732. }
  733. updateVideo(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt).then((status) => {
  734. switch (status) {
  735. case 0:
  736. playingTime -= 40;
  737. break;
  738. case 1:
  739. logger("视频:" + name + "已播放" + String(playingTime / duration * 100).slice(0, 4) + "%", "purple");
  740. break;
  741. case 2:
  742. clearInterval(_loop);
  743. logger("视频:" + name + "检测播放完毕,准备处理下一个任务。", "green");
  744. switchMission();
  745. break;
  746. case 3:
  747. playingTime -= 40;
  748. _rt = _rt === "1" ? "0.9" : "1";
  749. break;
  750. default:
  751. console.log(status);
  752. }
  753. });
  754. }, setting.rate == 0 ? 5e3 : 4e4);
  755. } catch (e) {
  756. logger("发生错误:" + e, "red");
  757. }
  758. }
  759. });
  760. } else {
  761. logger("用户设置只处理属于任务点的任务,准备处理下一个任务", "green");
  762. switchMission();
  763. return;
  764. }
  765. }
  766. function missonBook(dom, obj) {
  767. if (setting.task) {
  768. if (obj["jobid"] == void 0) {
  769. logger("当前只处理任务点任务,跳过", "red");
  770. switchMission();
  771. return;
  772. }
  773. }
  774. let jobId = obj["property"]["jobid"], name = obj["property"]["bookname"], jtoken = obj["jtoken"], knowledgeId = _defaults["knowledgeid"], courseId = _defaults["courseid"], clazzId = _defaults["clazzId"];
  775. if (obj["job"] == void 0) {
  776. logger("读书:" + name + "检测已完成,准备执行下一个任务。", "green");
  777. switchMission();
  778. return;
  779. }
  780. $.ajax({
  781. url: _l.protocol + "//" + _l.host + "/ananas/job?jobid=" + jobId + "&knowledgeid=" + knowledgeId + "&courseid=" + courseId + "&clazzid=" + clazzId + "&jtoken=" + jtoken + "&_dc=" + String(Math.round(/* @__PURE__ */ new Date())),
  782. method: "GET",
  783. success: function (res) {
  784. if (res.status) {
  785. logger("读书:" + name + res.msg + ",准备执行下一个任务。", "green");
  786. } else {
  787. logger("读书:" + name + "处理异常,跳过。", "red");
  788. }
  789. switchMission();
  790. return;
  791. }
  792. });
  793. }
  794. function missonDoucument(dom, obj) {
  795. if (setting.task) {
  796. if (obj["jobid"] == void 0) {
  797. logger("当前只处理任务点任务,跳过", "red");
  798. switchMission();
  799. return;
  800. }
  801. }
  802. let jobId = obj["property"]["jobid"], name = obj["property"]["name"], jtoken = obj["jtoken"], knowledgeId = _defaults["knowledgeid"], courseId = _defaults["courseid"], clazzId = _defaults["clazzId"];
  803. if (obj["job"] == void 0) {
  804. logger("文档:" + name + "检测已完成,准备执行下一个任务。", "green");
  805. switchMission();
  806. return;
  807. }
  808. $.ajax({
  809. 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())),
  810. method: "GET",
  811. success: function (res) {
  812. if (res.status) {
  813. logger("文档:" + name + res.msg + ",准备执行下一个任务。", "green");
  814. } else {
  815. logger("文档:" + name + "处理异常,跳过。", "red");
  816. }
  817. switchMission();
  818. return;
  819. }
  820. });
  821. }
  822. function missonRead(dom, obj) {
  823. if (setting.task) {
  824. if (obj["jobid"] == void 0) {
  825. logger("当前只处理任务点任务,跳过", "red");
  826. switchMission();
  827. return;
  828. }
  829. }
  830. let jobId = obj["property"]["jobid"], name = obj["property"]["title"], jtoken = obj["jtoken"], knowledgeId = _defaults["knowledgeid"], courseId = _defaults["courseid"], clazzId = _defaults["clazzId"];
  831. if (obj["job"] == void 0) {
  832. logger("阅读:" + name + ",检测已完成,准备执行下一个任务。", "green");
  833. switchMission();
  834. return;
  835. }
  836. $.ajax({
  837. 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())),
  838. method: "GET",
  839. success: function (res) {
  840. if (res.status) {
  841. logger("阅读:" + name + res.msg + ",准备执行下一个任务。", "green");
  842. } else {
  843. logger("阅读:" + name + "处理异常,跳过。", "red");
  844. }
  845. switchMission();
  846. return;
  847. }
  848. });
  849. }
  850. function missonWork(dom, obj) {
  851. if (!setting.work) {
  852. logger("用户设置不自动处理测验,准备处理下一个任务", "green");
  853. switchMission();
  854. return;
  855. }
  856. let isDo;
  857. if (setting.task) {
  858. logger("当前只处理任务点任务", "red");
  859. if (obj["jobid"] == void 0 ? false : true) {
  860. isDo = true;
  861. } else {
  862. isDo = false;
  863. }
  864. } else {
  865. logger("当前默认处理所有任务(包括非任务点任务)", "red");
  866. isDo = true;
  867. }
  868. if (isDo) {
  869. if (obj["jobid"] !== void 0) {
  870. 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"];
  871. setTimeout(() => {
  872. startDoPhoneCyWork(0, dom, phoneWeb);
  873. }, 3e3);
  874. } else {
  875. setTimeout(() => {
  876. startDoCyWork(0, dom);
  877. }, 3e3);
  878. }
  879. } else {
  880. logger("用户设置只处理属于任务点的任务,准备处理下一个任务", "green");
  881. switchMission();
  882. return;
  883. }
  884. }
  885. function doPhoneWork($dom) {
  886. let $cy = $dom.find(".Wrappadding form");
  887. $subBtn = $cy.find(".zquestions .zsubmit .btn-ok-bottom");
  888. $saveBtn = $cy.find(".zquestions .zsubmit .btn-save");
  889. let TimuList = $cy.find(".zquestions .Py-mian1");
  890. startDoPhoneTimu(0, TimuList);
  891. }
  892. function startDoPhoneTimu(index, TimuList) {
  893. if (index == TimuList.length) {
  894. if (setting.sub) {
  895. logger("测验处理完成,准备自动提交。", "green");
  896. setTimeout(() => {
  897. $subBtn.click();
  898. setTimeout(() => {
  899. logger("提交成功,准备切换下一个任务。", "green");
  900. _mlist.splice(0, 1);
  901. _domList.splice(0, 1);
  902. setTimeout(() => {
  903. switchMission();
  904. }, 3e3);
  905. }, 3e3);
  906. }, 5e3);
  907. } else if (setting.force) {
  908. logger("测验处理完成,存在无答案题目,由于用户设置了强制提交,准备自动提交。", "red");
  909. setTimeout(() => {
  910. $subBtn.click();
  911. setTimeout(() => {
  912. logger("提交成功,准备切换下一个任务。", "green");
  913. _mlist.splice(0, 1);
  914. _domList.splice(0, 1);
  915. setTimeout(() => {
  916. switchMission();
  917. }, 3e3);
  918. }, 3e3);
  919. }, 5e3);
  920. } else {
  921. logger("测验处理完成,存在无答案题目或用户设置不自动提交,自动保存!", "green");
  922. setTimeout(() => {
  923. $saveBtn.click();
  924. setTimeout(() => {
  925. logger("保存成功,准备切换下一个任务。", "green");
  926. _mlist.splice(0, 1);
  927. _domList.splice(0, 1);
  928. setTimeout(() => {
  929. switchMission();
  930. }, 3e3);
  931. }, 3e3);
  932. }, 5e3);
  933. }
  934. return;
  935. }
  936. let questionFull = $(TimuList[index]).find(".Py-m1-title").html();
  937. let _question = tidyQuestion(questionFull).replace(/.*?\[.*?题\]\s*\n\s*/, "").trim();
  938. let _type = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4, 选择题: 5 }[questionFull.match(/.*?\[(.*?)]|$/)[1]];
  939. let _a = [];
  940. let _answerTmpArr, _options;
  941. switch (_type) {
  942. case 0:
  943. // singleChoice
  944. _answerTmpArr = $(TimuList[index]).find(".answerList.singleChoice li");
  945. $.each(_answerTmpArr, (i, t) => {
  946. _a.push(tidyStr($(t).html()).replace(/^[A-Z]\s*\n\s*/, "").trim());
  947. });
  948. _options = _a.join("|");
  949. getAnswer(_type, _question, _options).then((agrs) => {
  950. let _i = _a.findIndex((item) => item == agrs);
  951. if (_i == -1) {
  952. logger("未匹配到正确答案,跳过此题", "red");
  953. setting.sub = 0;
  954. setTimeout(() => {
  955. startDoPhoneTimu(index + 1, TimuList);
  956. }, setting.time);
  957. } else {
  958. $(_answerTmpArr[_i]).click();
  959. logger("自动答题成功,准备切换下一题", "green");
  960. setTimeout(() => {
  961. startDoPhoneTimu(index + 1, TimuList);
  962. }, setting.time);
  963. }
  964. }).catch((agrs) => {
  965. if (agrs["c"] == 0) {
  966. setTimeout(() => {
  967. startDoPhoneTimu(index + 1, TimuList);
  968. }, setting.time);
  969. }
  970. });
  971. break;
  972. case 1:
  973. // multiChoice
  974. _answerTmpArr = $(TimuList[index]).find('.answerList.multiChoice li')
  975. _answerTmpArr.each(function () {
  976. let answerText = tidyStr($(this).html()).replace(/^[A-Z]\s*\n\s*/, "").trim();
  977. _a.push(answerText);
  978. });
  979. _options = _a.join("|");
  980. getAnswer(_type, _question, _options).then((agrs) => {
  981. if (agrs == "暂无答案") {
  982. logger("未匹配到正确答案,跳过此题", "red");
  983. setting.sub = 0;
  984. setTimeout(() => {
  985. startDoPhoneTimu(index + 1, TimuList);
  986. }, setting.time);
  987. } else {
  988. $.each(_answerTmpArr, (i, t) => {
  989. let _tt = tidyStr($(t).html()).replace(/^[A-Z]\s*\n\s*/, "").trim();
  990. if (agrs.indexOf(_tt) != -1) {
  991. setTimeout(() => {
  992. $(_answerTmpArr[i]).click();
  993. }, 300);
  994. }
  995. });
  996. let check = 0;
  997. setTimeout(() => {
  998. $.each(_answerTmpArr, (i, t) => {
  999. if ($(t).attr("class").indexOf("cur") != -1) {
  1000. check = 1;
  1001. }
  1002. });
  1003. if (check) {
  1004. logger("自动答题成功,准备切换下一题", "green");
  1005. } else {
  1006. logger("未能正确选择答案,请手动选择,跳过此题", "red");
  1007. setting.sub = 0;
  1008. }
  1009. setTimeout(() => {
  1010. startDoPhoneTimu(index + 1, TimuList);
  1011. }, setting.time);
  1012. }, 1e3);
  1013. }
  1014. }).catch((agrs) => {
  1015. if (agrs["c"] == 0) {
  1016. setTimeout(() => {
  1017. startDoPhoneTimu(index + 1, TimuList);
  1018. }, setting.time);
  1019. }
  1020. });
  1021. break;
  1022. case 2:
  1023. // fillBlank
  1024. _options = "";
  1025. getAnswer(_type, _question, _options).then((agrs) => {
  1026. if (agrs == "暂无答案") {
  1027. logger("未匹配到正确答案,跳过此题", "red");
  1028. setting.sub = 0;
  1029. setTimeout(() => {
  1030. startDoPhoneTimu(index + 1, TimuList);
  1031. }, setting.time);
  1032. return;
  1033. }
  1034. let answers = agrs.split("#");
  1035. let tkList = $(TimuList[index]).find(".blankList2 input");
  1036. $.each(tkList, (i, t) => {
  1037. setTimeout(() => {
  1038. $(t).val(answers[i]);
  1039. }, 200);
  1040. });
  1041. setTimeout(() => {
  1042. startDoPhoneTimu(index + 1, TimuList);
  1043. }, setting.time);
  1044. }).catch((agrs) => {
  1045. if (agrs["c"] == 0) {
  1046. setTimeout(() => {
  1047. startDoPhoneTimu(index + 1, TimuList);
  1048. }, setting.time);
  1049. }
  1050. });
  1051. break;
  1052. case 3:
  1053. // judge
  1054. _options = "对|错";
  1055. getAnswer(_type, _question, _options).then((agrs) => {
  1056. if (agrs == "暂无答案") {
  1057. logger("未匹配到正确答案,跳过此题", "red");
  1058. setting.sub = 0;
  1059. setTimeout(() => {
  1060. startDoPhoneTimu(index + 1, TimuList);
  1061. }, setting.time);
  1062. } else {
  1063. let _true = "正确|是|对|√|T|ri";
  1064. _answerTmpArr = $(TimuList[index]).find(".answerList.panduan li");
  1065. if (_true.indexOf(agrs) != -1) {
  1066. $.each(_answerTmpArr, (i, t) => {
  1067. if ($(t).attr("val-param") == "true") {
  1068. $(t).click();
  1069. }
  1070. });
  1071. } else {
  1072. $.each(_answerTmpArr, (i, t) => {
  1073. if ($(t).attr("val-param") == "false") {
  1074. $(t).click();
  1075. }
  1076. });
  1077. }
  1078. logger("自动答题成功,准备切换下一题", "green");
  1079. setTimeout(() => {
  1080. startDoPhoneTimu(index + 1, TimuList);
  1081. }, setting.time);
  1082. }
  1083. }).catch((agrs) => {
  1084. if (agrs["c"] == 0) {
  1085. setTimeout(() => {
  1086. startDoPhoneTimu(index + 1, TimuList);
  1087. }, setting.time);
  1088. }
  1089. });
  1090. break;
  1091. case 4:
  1092. // shortAnswer
  1093. _options = "";
  1094. getAnswer(_type, _question, _options).then((agrs) => {
  1095. if (agrs == '暂无答案') {
  1096. logger("未匹配到正确答案,跳过此题", "red")
  1097. setting.sub = 0
  1098. setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
  1099. return
  1100. }
  1101. logger("简答题不支持自动填入,请参考修改答案,手动完成。", "purple");
  1102. setting.sub = 0
  1103. setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
  1104. }).catch((agrs) => {
  1105. if (agrs['c'] == 0) {
  1106. setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
  1107. }
  1108. })
  1109. break
  1110. case 5:
  1111. // choice
  1112. _answerTmpArr = $(TimuList[index]).find(".answerList.singleChoice li");
  1113. $.each(_answerTmpArr, (i, t) => {
  1114. _a.push(tidyStr($(t).html()).replace(/^[A-Z]\s*\n\s*/, "").trim());
  1115. });
  1116. _options = _a.join("|");
  1117. getAnswer(_type, _question, _options).then((agrs) => {
  1118. setting.sub = 0;
  1119. logger("此类型题目无法区分单/多选,请手动选择答案", "red");
  1120. setTimeout(() => {
  1121. startDoPhoneTimu(index + 1, TimuList);
  1122. }, setting.time);
  1123. }).catch((agrs) => {
  1124. if (agrs["c"] == 0) {
  1125. setTimeout(() => {
  1126. startDoPhoneTimu(index + 1, TimuList);
  1127. }, setting.time);
  1128. }
  1129. });
  1130. break;
  1131. default:
  1132. logger("暂不支持处理此类型题目:" + questionFull.match(/.*?\[(.*?)]|$/)[1] + ",跳过!请手动作答。", "red");
  1133. setting.sub = 0;
  1134. setTimeout(() => {
  1135. startDoPhoneTimu(index + 1, TimuList);
  1136. }, setting.time);
  1137. break;
  1138. }
  1139. }
  1140. function startDoPhoneCyWork(index, doms, phoneWeb) {
  1141. if (index == doms.length) {
  1142. logger("此页面全部测验已处理完毕!准备进行下一项任务");
  1143. setTimeout(missonStart, 5e3);
  1144. return;
  1145. }
  1146. logger("等待测验框架加载...", "purple");
  1147. elmGetter.get("iframe", $(doms[index]).contents()[0]).then((element) => {
  1148. let workIframe = element;
  1149. if (workIframe.length == 0) {
  1150. setTimeout(() => {
  1151. startDoPhoneCyWork(index, doms);
  1152. }, 5e3);
  1153. }
  1154. let workStatus = $(workIframe).contents().find(".newTestCon .newTestTitle .testTit_status").text().trim();
  1155. if (!workStatus) {
  1156. logger("获取测验状态失败,请联系作者修复!", "red");
  1157. _domList.splice(0, 1);
  1158. setTimeout(missonStart, 2e3);
  1159. return;
  1160. }
  1161. if (setting.share && workStatus.indexOf("已完成") != -1) {
  1162. logger("测验:" + (index + 1) + ",检测到此测验已完成,准备收录答案。", "green");
  1163. setTimeout(() => {
  1164. upLoadWork(index, doms, workIframe);
  1165. }, 2e3);
  1166. } else if (workStatus.indexOf("待做") != -1 || workStatus.indexOf("待完成") != -1) {
  1167. logger("测验:" + (index + 1) + ",准备处理此测验...", "purple");
  1168. $(workIframe).attr("src", phoneWeb);
  1169. elmGetter.get('iframe[src="' + phoneWeb + '"]', $(doms[index]).contents()[0]).then((element2) => {
  1170. setTimeout(() => {
  1171. doPhoneWork($(element2).contents());
  1172. }, 3e3);
  1173. });
  1174. } else if (workStatus.indexOf("待批阅") != -1) {
  1175. _mlist.splice(0, 1);
  1176. _domList.splice(0, 1);
  1177. logger("测验:" + (index + 1) + ",测验待批阅,跳过", "red");
  1178. setTimeout(() => {
  1179. startDoPhoneCyWork(index + 1, doms, phoneWeb);
  1180. }, 5e3);
  1181. } else {
  1182. _mlist.splice(0, 1);
  1183. _domList.splice(0, 1);
  1184. logger("测验:" + (index + 1) + ",未知状态或用户选择不收录答案,跳过", "red");
  1185. setTimeout(() => {
  1186. startDoPhoneCyWork(index + 1, doms, phoneWeb);
  1187. }, 5e3);
  1188. }
  1189. });
  1190. }
  1191. function startDoCyWork(index, doms) {
  1192. if (index == doms.length) {
  1193. logger("此页面全部测验已处理完毕!准备进行下一项任务");
  1194. setTimeout(missonStart, 5e3);
  1195. return;
  1196. }
  1197. logger("等待测验框架加载...", "purple");
  1198. elmGetter.get("iframe", $(doms[index]).contents()[0]).then((element) => {
  1199. let workIframe = element;
  1200. if (workIframe.length == 0) {
  1201. setTimeout(() => {
  1202. startDoCyWork(index, doms);
  1203. }, 5e3);
  1204. }
  1205. let workStatus = $(workIframe).contents().find(".newTestCon .newTestTitle .testTit_status").text().trim();
  1206. if (!workStatus) {
  1207. logger("获取测验状态失败,请联系作者修复!", "red");
  1208. _domList.splice(0, 1);
  1209. setTimeout(missonStart, 2e3);
  1210. return;
  1211. }
  1212. if (setting.share && workStatus.indexOf("已完成") != -1) {
  1213. logger("测验:" + (index + 1) + ",检测到此测验已完成,准备收录答案。", "green");
  1214. setTimeout(() => {
  1215. upLoadWork(index, doms, workIframe);
  1216. }, 2e3);
  1217. } else if (workStatus.indexOf("待做") != -1 || workStatus.indexOf("待完成") != -1) {
  1218. logger("测验:" + (index + 1) + ",准备处理此测验...", "purple");
  1219. setTimeout(() => {
  1220. doWork(index, doms, workIframe);
  1221. }, 5e3);
  1222. } else if (workStatus.indexOf("待批阅") != -1) {
  1223. _mlist.splice(0, 1);
  1224. _domList.splice(0, 1);
  1225. logger("测验:" + (index + 1) + ",测验待批阅,跳过", "red");
  1226. setTimeout(() => {
  1227. startDoCyWork(index + 1, doms);
  1228. }, 5e3);
  1229. } else {
  1230. _mlist.splice(0, 1);
  1231. _domList.splice(0, 1);
  1232. logger("测验:" + (index + 1) + ",未知状态或用户选择不收录答案,跳过", "red");
  1233. setTimeout(() => {
  1234. startDoCyWork(index + 1, doms);
  1235. }, 5e3);
  1236. }
  1237. });
  1238. }
  1239. function missonHomeWork() {
  1240. logger("开始处理作业", "green");
  1241. let $_homeworktable = $(".mark_table").find("form");
  1242. let TimuList = $_homeworktable.find(".questionLi");
  1243. doHomeWork(0, TimuList);
  1244. }
  1245. function doHomeWork(index, TiMuList) {
  1246. if (index == TiMuList.length) {
  1247. logger("作业题目已全部完成", "green");
  1248. return;
  1249. }
  1250. let _type = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[$(TiMuList[index]).attr("typename")];
  1251. let _questionFull = $(TiMuList[index]).find(".mark_name").html();
  1252. let _question = tidyQuestion(_questionFull).replace(/^[(].*?[)]/, "").trim();
  1253. let _a = [];
  1254. let _answerTmpArr, _textareaList, _options;
  1255. switch (_type) {
  1256. case 0:
  1257. // singleChoice
  1258. _answerTmpArr = $(TiMuList[index]).find(".stem_answer").find(".answer_p");
  1259. _answerTmpArr.each(function () {
  1260. let answerText = tidyStr($(this).text()).replace(/[ABCD]/g, '').trim();
  1261. _a.push(answerText);
  1262. });
  1263. _options = _a.join("|");
  1264. getAnswer(_type, _question, _options).then((agrs) => {
  1265. $.each(_answerTmpArr, (i, t) => {
  1266. _a.push(tidyStr($(t).html()));
  1267. });
  1268. let _i2 = _a.findIndex((item) => item == agrs);
  1269. if (_i2 == -1) {
  1270. logger("未匹配到正确答案,跳过此题", "red");
  1271. setTimeout(() => {
  1272. doHomeWork(index + 1, TiMuList);
  1273. }, setting.time);
  1274. } else {
  1275. setTimeout(() => {
  1276. let check = $(_answerTmpArr[_i2]).parent().find("span").attr("class");
  1277. if (check.indexOf("check_answer") == -1) {
  1278. $(_answerTmpArr[_i2]).parent().click();
  1279. }
  1280. logger("自动答题成功,准备切换下一题", "green");
  1281. setTimeout(() => {
  1282. doHomeWork(index + 1, TiMuList);
  1283. }, setting.time);
  1284. }, 300);
  1285. }
  1286. }).catch((agrs) => {
  1287. if (agrs["c"] == 0) {
  1288. setTimeout(() => {
  1289. doHomeWork(index + 1, TiMuList);
  1290. }, setting.time);
  1291. }
  1292. });
  1293. break;
  1294. case 1:
  1295. // multiChoice
  1296. _answerTmpArr = $(TiMuList[index]).find(".stem_answer").find(".answer_p");
  1297. _answerTmpArr.each(function () {
  1298. let answerText = tidyStr($(this).text()).replace(/[ABCD]/g, '').trim();
  1299. _a.push(answerText);
  1300. });
  1301. _options = _a.join("|");
  1302. getAnswer(_type, _question, _options).then((agrs) => {
  1303. $.each(_answerTmpArr, (i, t) => {
  1304. if (agrs.indexOf(tidyStr($(t).html())) != -1) {
  1305. setTimeout(() => {
  1306. let check = $(_answerTmpArr[i]).parent().find("span").attr("class");
  1307. if (check.indexOf("check_answer_dx") == -1) {
  1308. $(_answerTmpArr[i]).parent().click();
  1309. }
  1310. }, 300);
  1311. }
  1312. });
  1313. logger("自动答题成功,准备切换下一题", "green");
  1314. setTimeout(() => {
  1315. doHomeWork(index + 1, TiMuList);
  1316. }, setting.time);
  1317. }).catch((agrs) => {
  1318. if (agrs["c"] == 0) {
  1319. setTimeout(() => {
  1320. doHomeWork(index + 1, TiMuList);
  1321. }, setting.time);
  1322. }
  1323. });
  1324. break;
  1325. case 2:
  1326. // fillBlank
  1327. _options = "";
  1328. _textareaList = $(TiMuList[index]).find(".stem_answer").find(".Answer .divText .textDIV textarea");
  1329. getAnswer(_type, _question, _options).then((agrs) => {
  1330. let _answerTmpArr2 = agrs.split("#");
  1331. $.each(_textareaList, (i, t) => {
  1332. let _id = $(t).attr("id");
  1333. setTimeout(() => {
  1334. UE.getEditor(_id).setContent(_answerTmpArr2[i]);
  1335. }, 300);
  1336. });
  1337. logger("自动答题成功,准备切换下一题", "green");
  1338. setTimeout(() => {
  1339. doHomeWork(index + 1, TiMuList);
  1340. }, setting.time);
  1341. }).catch((agrs) => {
  1342. if (agrs["c"] == 0) {
  1343. setTimeout(() => {
  1344. doHomeWork(index + 1, TiMuList);
  1345. }, setting.time);
  1346. }
  1347. });
  1348. break;
  1349. case 3:
  1350. // judge
  1351. _options = "对|错";
  1352. let _true = "正确|是|对|√|T|ri";
  1353. let _false = "错误|否|错|×|F|wr";
  1354. let _i = 0;
  1355. _answerTmpArr = $(TiMuList[index]).find(".stem_answer").find(".answer_p");
  1356. $.each(_answerTmpArr, (i, t) => {
  1357. _a.push($(t).text().trim());
  1358. });
  1359. getAnswer(_type, _question, _options).then((agrs) => {
  1360. if (_true.indexOf(agrs) != -1) {
  1361. _i = _a.findIndex((item) => _true.indexOf(item) != -1);
  1362. } else if (_false.indexOf(agrs) != -1) {
  1363. _i = _a.findIndex((item) => _false.indexOf(item) != -1);
  1364. } else {
  1365. logger("答案匹配出错,准备切换下一题", "green");
  1366. setTimeout(() => {
  1367. doHomeWork(index + 1, TiMuList);
  1368. }, setting.time);
  1369. return;
  1370. }
  1371. setTimeout(() => {
  1372. let check = $(_answerTmpArr[_i]).parent().find("span").attr("class");
  1373. if (check.indexOf("check_answer") == -1) {
  1374. $(_answerTmpArr[_i]).parent().click();
  1375. }
  1376. }, 300);
  1377. logger("自动答题成功,准备切换下一题", "green");
  1378. setTimeout(() => {
  1379. doHomeWork(index + 1, TiMuList);
  1380. }, setting.time);
  1381. }).catch((agrs) => {
  1382. if (agrs["c"] == 0) {
  1383. setTimeout(() => {
  1384. doHomeWork(index + 1, TiMuList);
  1385. }, setting.time);
  1386. }
  1387. });
  1388. break;
  1389. case 4:
  1390. // shortAnswer
  1391. _options = "";
  1392. _textareaList = $(TiMuList[index]).find(".stem_answer").find(".eidtDiv textarea");
  1393. getAnswer(_type, _question, _options).then((agrs) => {
  1394. $.each(_textareaList, (i, t) => {
  1395. let _id = $(t).attr("id");
  1396. setTimeout(() => {
  1397. UE.getEditor(_id).setContent(agrs);
  1398. }, 300);
  1399. });
  1400. logger("自动答题成功,准备切换下一题", "green");
  1401. setTimeout(() => {
  1402. doHomeWork(index + 1, TiMuList);
  1403. }, setting.time);
  1404. }).catch((agrs) => {
  1405. if (agrs["c"] == 0) {
  1406. setTimeout(() => {
  1407. doHomeWork(index + 1, TiMuList);
  1408. }, setting.time);
  1409. }
  1410. });
  1411. break;
  1412. default:
  1413. logger("暂不支持处理此题型:" + $(TiMuList[index]).attr("typename") + ",跳过。", "red");
  1414. setTimeout(() => {
  1415. doHomeWork(index + 1, TiMuList);
  1416. }, setting.time);
  1417. }
  1418. }
  1419. function missonExam() {
  1420. let $_examtable = $(".mark_table").find(".whiteDiv");
  1421. let _questionFull = tidyStr($_examtable.find("h3.mark_name").html().trim());
  1422. let _qType = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4, 论述题: 4, 写作题: 5, 翻译题: 6 }[_questionFull.match(/[(](.*?),.*?分[)]|$/)[1]];
  1423. let _question = tidyQuestion(_questionFull.replace(/[(].*?分[)]/, "").replace(/^\s*/, ""));
  1424. let $_ansdom = $_examtable.find("#submitTest").find(".stem_answer");
  1425. let _answerTmpArr, _options;
  1426. let _a = [];
  1427. switch (_qType) {
  1428. case 0:
  1429. _answerTmpArr = $_ansdom.find(".clearfix.answerBg .fl.answer_p");
  1430. $.each(_answerTmpArr, (i, t) => {
  1431. _a.push(tidyStr($(t).html()));
  1432. });
  1433. _options = _a.join("|");
  1434. getAnswer(_qType, _question, _options).then((agrs) => {
  1435. let _i2 = _a.findIndex((item) => item == agrs);
  1436. if (_i2 == -1) {
  1437. logger("未匹配到正确答案,跳过此题", "red");
  1438. setTimeout(toNextExam, 5e3);
  1439. } else {
  1440. setTimeout(() => {
  1441. if ($(_answerTmpArr[_i2]).parent().find("span").attr("class").indexOf("check_answer") == -1) {
  1442. $(_answerTmpArr[_i2]).parent().click();
  1443. logger("自动答题成功,准备切换下一题", "green");
  1444. toNextExam();
  1445. } else {
  1446. logger("此题已作答,准备切换下一题", "green");
  1447. toNextExam();
  1448. }
  1449. }, 300);
  1450. }
  1451. }).catch((agrs) => {
  1452. if (agrs["c"] == 0) {
  1453. toNextExam();
  1454. }
  1455. });
  1456. break;
  1457. case 1:
  1458. // multiChoice
  1459. _answerTmpArr = $_ansdom.find(".clearfix.answerBg .fl.answer_p");
  1460. $.each(_answerTmpArr, (i, t) => {
  1461. _a.push(tidyStr($(t).html()))
  1462. });
  1463. _options = _a.join("|");
  1464. getAnswer(_qType, _question, _options).then((agrs) => {
  1465. if ($_ansdom.find(".clearfix.answerBg span.check_answer_dx").length > 0) {
  1466. logger("此题已作答,准备切换下一题", "green");
  1467. toNextExam();
  1468. } else {
  1469. $.each(_answerTmpArr, (i, t) => {
  1470. if (agrs.indexOf(tidyStr($(t).html())) != -1) {
  1471. setTimeout(() => {
  1472. $(_answerTmpArr[i]).parent().click();
  1473. }, 300);
  1474. }
  1475. });
  1476. logger("自动答题成功,准备切换下一题", "green");
  1477. toNextExam();
  1478. }
  1479. }).catch((agrs) => {
  1480. if (agrs["c"] == 0) {
  1481. toNextExam();
  1482. }
  1483. });
  1484. break;
  1485. case 2:
  1486. // fillBlank
  1487. _options = "";
  1488. let _textareaList = $_ansdom.find(".Answer .divText .subEditor textarea");
  1489. getAnswer(_qType, _question, _options).then((agrs) => {
  1490. let _answerTmpArr2 = agrs.split("#");
  1491. $.each(_textareaList, (i, t) => {
  1492. let _id = $(t).attr("id");
  1493. setTimeout(() => {
  1494. UE.getEditor(_id).setContent(_answerTmpArr2[i]);
  1495. }, 300);
  1496. });
  1497. logger("自动答题成功,准备切换下一题", "green");
  1498. toNextExam();
  1499. }).catch((agrs) => {
  1500. if (agrs["c"] = 0) {
  1501. toNextExam();
  1502. }
  1503. });
  1504. break;
  1505. case 3:
  1506. _options = "对|错";
  1507. let _true = "正确|是|对|√|T|ri";
  1508. let _false = "错误|否|错|×|F|wr";
  1509. let _i = 0;
  1510. _answerTmpArr = $_ansdom.find(".clearfix.answerBg .fl.answer_p");
  1511. $.each(_answerTmpArr, (i, t) => {
  1512. _a.push($(t).text().trim());
  1513. });
  1514. getAnswer(_qType, _question, _options).then((agrs) => {
  1515. if (_true.indexOf(agrs) != -1) {
  1516. _i = _a.findIndex((item) => _true.indexOf(item) != -1);
  1517. } else if (_false.indexOf(agrs) != -1) {
  1518. _i = _a.findIndex((item) => _false.indexOf(item) != -1);
  1519. } else {
  1520. logger("答案匹配出错,准备切换下一题", "green");
  1521. toNextExam();
  1522. return;
  1523. }
  1524. if ($(_answerTmpArr[_i]).parent().find("span").attr("class").indexOf("check_answer") == -1) {
  1525. setTimeout(() => {
  1526. $(_answerTmpArr[_i]).parent().click();
  1527. }, 300);
  1528. logger("自动答题成功,准备切换下一题", "green");
  1529. toNextExam();
  1530. } else {
  1531. logger("此题已作答,准备切换下一题", "green");
  1532. toNextExam();
  1533. }
  1534. }).catch((agrs) => {
  1535. if (agrs["c"] == 0) {
  1536. toNextExam();
  1537. }
  1538. });
  1539. break;
  1540. case 4:
  1541. // shortAnswer
  1542. _options = "";
  1543. _answerEle = $_ansdom.find('.subEditor textarea')
  1544. $.each(_answerEle, (i, t) => {
  1545. getAnswer(_qType, _question, _options).then((agrs) => {
  1546. let _id = $(t).attr('name')
  1547. setTimeout(() => { UE.getEditor(_id).setContent(agrs) }, 300);
  1548. toNextExam()
  1549. });
  1550. });
  1551. break;
  1552. case 5:
  1553. // write
  1554. _answerEle = $_ansdom.find('.subEditor textarea')
  1555. _options = "";
  1556. $.each(_answerEle, (i, t) => {
  1557. getAnswer(_qType, _question, _options).then((agrs) => {
  1558. let _id = $(t).attr('name')
  1559. setTimeout(() => { UE.getEditor(_id).setContent(agrs) }, 300);
  1560. toNextExam()
  1561. });
  1562. });
  1563. break;
  1564. case 6:
  1565. // translate
  1566. _answerEle = $_ansdom.find('.subEditor textarea')
  1567. _options
  1568. $.each(_answerEle, (i, t) => {
  1569. getAnswer(_qType, _question, _options).then((agrs) => {
  1570. let _id = $(t).attr('name')
  1571. setTimeout(() => { UE.getEditor(_id).setContent(agrs) }, 300);
  1572. toNextExam()
  1573. });
  1574. });
  1575. break;
  1576. default:
  1577. logger('暂不支持处理此题型:' + $(TiMuList[index]).attr('typename') + ',跳过。', 'red')
  1578. setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
  1579. }
  1580. }
  1581. function toNextExam() {
  1582. if (setting.examTurn) {
  1583. let $_examtable = $(".mark_table").find(".whiteDiv");
  1584. let $nextbtn = $_examtable.find(".nextDiv a.jb_btn");
  1585. setTimeout(() => {
  1586. $nextbtn.click();
  1587. }, setting.examTurnTime ? 2e3 + Math.floor(Math.random() * 5 + 1) * 1e3 : 2e3);
  1588. } else {
  1589. logger("用户设置不自动跳转下一题,请手动点击", "blue");
  1590. }
  1591. }
  1592. function uploadExam() {
  1593. logger("考试答案收录功能处于bate阶段,遇到bug请及时反馈!!", "red");
  1594. logger("开始收录考试答案", "green");
  1595. let TimuList = $(".mark_table .mark_item .questionLi");
  1596. let data = [];
  1597. $.each(TimuList, (i, t) => {
  1598. let _a = {};
  1599. let _answer;
  1600. let _answerTmpArr, _answerList = [];
  1601. let TiMuFull = tidyQuestion($(t).find("h3").html());
  1602. let _type = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[TiMuFull.match(/[(](.*?)[)]|$/)[1].replace(/,.*?分/, "")];
  1603. let _question = TiMuFull.replace(/^[(].*?[)]|$/, "").trim();
  1604. let _rightAns = $(t).find(".mark_answer").find(".colorGreen").text().replace(/正确答案[::]/, "").trim();
  1605. switch (_type) {
  1606. case 0:
  1607. if (_rightAns.length <= 0) {
  1608. let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class");
  1609. let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text();
  1610. if (_isTrue2 == "marking_dui" || _isZero != "0") {
  1611. _rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/我的答案[::]/, "").trim();
  1612. } else {
  1613. break;
  1614. }
  1615. }
  1616. _answerTmpArr = $(t).find(".mark_letter li");
  1617. $.each(_answerTmpArr, (a, b) => {
  1618. _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, ""));
  1619. });
  1620. let _i = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[_rightAns];
  1621. _answer = _answerList[_i];
  1622. _a["question"] = _question;
  1623. _a["type"] = _type;
  1624. _a["answer"] = _answer;
  1625. data.push(_a);
  1626. break;
  1627. case 1:
  1628. _answer = [];
  1629. if (_rightAns.length <= 0) {
  1630. let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class");
  1631. let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text();
  1632. if (_isTrue2 == "marking_dui" || _isTrue2 == "marking_bandui" || _isZero != "0") {
  1633. _rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/我的答案[::]/, "").trim();
  1634. } else {
  1635. break;
  1636. }
  1637. }
  1638. _answerTmpArr = $(t).find(".mark_letter li");
  1639. $.each(_answerTmpArr, (a, b) => {
  1640. _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, ""));
  1641. });
  1642. $.each(_rightAns.split(""), (c, d) => {
  1643. let _i2 = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[d];
  1644. _answer.push(_answerList[_i2]);
  1645. });
  1646. _a["question"] = _question;
  1647. _a["type"] = _type;
  1648. _a["answer"] = _answer.join("#");
  1649. data.push(_a);
  1650. break;
  1651. case 2:
  1652. _answerTmpArr = [];
  1653. let answers = $(t).find(".mark_answer").find(".colorDeep").find("dd");
  1654. if (_rightAns.length <= 0) {
  1655. $.each(answers, (i2, t2) => {
  1656. _isTrue = $(t2).find("span:eq(1)").attr("class");
  1657. if (_isTrue == "marking_dui") {
  1658. _rightAns = $(t2).find("span:eq(0)").html();
  1659. _answerTmpArr.push(_rightAns.replace(/[(][0-9].*?[)]/, "").replace(/第.*?空:/, "").trim());
  1660. } else {
  1661. return;
  1662. }
  1663. });
  1664. _answer = _answerTmpArr.join("#");
  1665. } else {
  1666. _answer = _rightAns.replace(/\s/g, "").replace(/[(][0-9].*?[)]/g, "#").replace(/第.*?空:/g, "#").replace(/^#*/, "");
  1667. }
  1668. if (_answer.length != 0) {
  1669. _a["question"] = _question;
  1670. _a["type"] = _type;
  1671. _a["answer"] = _answer;
  1672. data.push(_a);
  1673. }
  1674. break;
  1675. case 3:
  1676. if (_rightAns.length <= 0) {
  1677. let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class");
  1678. let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text();
  1679. if (_isTrue2 == "marking_dui" || _isZero != "0") {
  1680. _rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/我的答案[::]/, "").trim();
  1681. } else {
  1682. let _true = "正确|是|对|√|T|ri";
  1683. _rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/我的答案[::]/, "").trim();
  1684. if (_true.indexOf(_rightAns) != -1) {
  1685. _rightAns = "错";
  1686. } else {
  1687. _rightAns = "对";
  1688. }
  1689. }
  1690. }
  1691. _a["question"] = _question;
  1692. _a["type"] = _type;
  1693. _a["answer"] = _rightAns;
  1694. data.push(_a);
  1695. break;
  1696. case 4:
  1697. if (_rightAns.length <= 0) {
  1698. break;
  1699. }
  1700. _a["question"] = _question;
  1701. _a["type"] = _type;
  1702. _a["answer"] = _rightAns;
  1703. data.push(_a);
  1704. break;
  1705. }
  1706. });
  1707. setTimeout(() => {
  1708. uploadAnswer(data, 0);
  1709. }, 1500);
  1710. }
  1711. function refreshCourseList() {
  1712. let _p = parseUrlParams();
  1713. return new Promise((resolve, reject) => {
  1714. $.ajax({
  1715. url: _l.protocol + "//" + _l.host + "/mycourse/studentstudycourselist?courseId=" + _p["courseid"] + "&chapterId=" + _p["knowledgeid"] + "&clazzid=" + _p["clazzid"] + "&mooc2=1",
  1716. type: "GET",
  1717. dateType: "html",
  1718. success: function (res) {
  1719. resolve(res);
  1720. }
  1721. });
  1722. });
  1723. }
  1724. function updateAudio(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt) {
  1725. return new Promise((resolve, reject) => {
  1726. getEnc(classId, userId, jobId, objectId, playingTime, duration, clipTime).then((enc) => {
  1727. if (reportUrlChange) {
  1728. reportUrl = http2https(reportUrl);
  1729. }
  1730. $.ajax({
  1731. 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())),
  1732. type: "GET",
  1733. success: function (res) {
  1734. try {
  1735. if (res["isPassed"]) {
  1736. if (setting.review && playingTime != duration) {
  1737. resolve(1);
  1738. } else {
  1739. resolve(2);
  1740. }
  1741. } else {
  1742. if (setting.rate == 0 && playingTime == duration) {
  1743. resolve(2);
  1744. } else {
  1745. resolve(1);
  1746. }
  1747. }
  1748. } catch (e) {
  1749. logger("发生错误:" + e, "red");
  1750. resolve(0);
  1751. }
  1752. },
  1753. error: function (xhr) {
  1754. if (xhr.status == 403) {
  1755. logger("SuperStar返回错误信息,尝试更换参数,40s后将重试,请等待...", "red");
  1756. resolve(3);
  1757. } else {
  1758. reportUrlChange = 1;
  1759. logger("SuperStar返回错误信息,如果持续出现,请联系作者", "red");
  1760. }
  1761. }
  1762. });
  1763. });
  1764. });
  1765. }
  1766. function updateVideo(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt) {
  1767. return new Promise((resolve, reject) => {
  1768. getEnc(classId, userId, jobId, objectId, playingTime, duration, clipTime).then((enc) => {
  1769. if (reportUrlChange) {
  1770. reportUrl = http2https(reportUrl);
  1771. }
  1772. $.ajax({
  1773. 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())),
  1774. type: "GET",
  1775. success: function (res) {
  1776. try {
  1777. if (res["isPassed"]) {
  1778. if (setting.review && playingTime != duration) {
  1779. resolve(1);
  1780. } else {
  1781. resolve(2);
  1782. }
  1783. } else {
  1784. if (setting.rate == 0 && playingTime == duration) {
  1785. resolve(2);
  1786. } else {
  1787. resolve(1);
  1788. }
  1789. }
  1790. } catch (e) {
  1791. logger("发生错误:" + e, "red");
  1792. resolve(0);
  1793. }
  1794. },
  1795. error: function (xhr) {
  1796. if (xhr.status == 403) {
  1797. logger("SuperStar返回错误信息,尝试更换参数,40s后将重试,请等待...", "red");
  1798. resolve(3);
  1799. } else {
  1800. reportUrlChange = 1;
  1801. logger("SuperStar返回错误信息,如果持续出现,请联系作者", "red");
  1802. }
  1803. }
  1804. });
  1805. });
  1806. });
  1807. }
  1808. function upLoadWork(index, doms, dom) {
  1809. let $CyHtml = $(dom).contents().find(".CeYan");
  1810. let TiMuList = $CyHtml.find(".TiMu");
  1811. let data = [];
  1812. for (let i = 0; i < TiMuList.length; i++) {
  1813. let _a = {};
  1814. let questionFull = $(TiMuList[i]).find(".Zy_TItle.clearfix > div.clearfix").html().trim();
  1815. let _question = tidyQuestion(questionFull);
  1816. let _TimuType = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[questionFull.match(/^<span.*?newZy_TItle.*?【(.*?)】<\/span>|$/)[1]];
  1817. _a["question"] = _question;
  1818. _a["type"] = _TimuType;
  1819. let _selfAnswerCheck = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .answerScore .CorrectOrNot span").attr("class");
  1820. switch (_TimuType) {
  1821. case 0:
  1822. if (_selfAnswerCheck == "marking_dui") {
  1823. 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()];
  1824. let _answerForm2 = $(TiMuList[i]).find(".Zy_ulTop li");
  1825. let _answer2 = $(_answerForm2[_selfAnswer]).find("a.fl").html();
  1826. _a["answer"] = tidyStr(_answer2);
  1827. }
  1828. break;
  1829. case 1:
  1830. let _answerArr = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer").text().trim().replace(/正确答案[::]/, "").replace(/我的答案[::]/, "").trim();
  1831. let _answerForm = $(TiMuList[i]).find(".Zy_ulTop li");
  1832. let _answer = [];
  1833. if (_selfAnswerCheck == "marking_dui" || _selfAnswerCheck == "marking_bandui") {
  1834. for (let i2 = 0; i2 < _answerArr.length; i2++) {
  1835. let _answerIndex = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[_answerArr[i2]];
  1836. _answer.push($(_answerForm[_answerIndex]).find("a.fl").html());
  1837. }
  1838. } else {
  1839. break;
  1840. }
  1841. _a["answer"] = tidyStr(_answer.join("#"));
  1842. break;
  1843. case 2:
  1844. let _TAnswerArr = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer");
  1845. let _TAnswer = [];
  1846. for (let i2 = 0; i2 < _TAnswerArr.length; i2++) {
  1847. let item = _TAnswerArr[i2];
  1848. if ($(item).find("i").attr("class") == "marking_dui") {
  1849. _TAnswer.push($(item).find("p").html().replace(/[(][0-9].*?[)]/, "").replace(/第.*?空:/, "").trim());
  1850. }
  1851. }
  1852. if (_TAnswer.length <= 0) {
  1853. break;
  1854. }
  1855. _a["answer"] = tidyStr(_TAnswer.join("#"));
  1856. break;
  1857. case 3:
  1858. if (_selfAnswerCheck == "marking_dui") {
  1859. let _answer2 = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer").html().replace(/正确答案[::]/, "").replace(/我的答案[::]/, "").trim();
  1860. _a["answer"] = tidyStr(_answer2);
  1861. } else {
  1862. if ($(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer").html()) {
  1863. let _answer2 = $(TiMuList[i]).find(".newAnswerBx > .myAnswerBx > .myAnswer").html().replace(/正确答案[::]/, "").replace(/我的答案[::]/, "").trim();
  1864. if ("对|√|正确".indexOf(tidyStr(_answer2)) != -1) {
  1865. _a["answer"] = "错";
  1866. } else {
  1867. _a["answer"] = "对";
  1868. }
  1869. } else {
  1870. break;
  1871. }
  1872. }
  1873. break;
  1874. }
  1875. if (_a["answer"] != void 0) {
  1876. data.push(_a);
  1877. } else {
  1878. continue;
  1879. }
  1880. }
  1881. uploadAnswer(data, 0).then(() => {
  1882. _mlist.splice(0, 1);
  1883. _domList.splice(0, 1);
  1884. setTimeout(() => {
  1885. startDoCyWork(index + 1, doms);
  1886. }, 3e3);
  1887. });
  1888. }
  1889. function filterAnswerIndex(answertext) {
  1890. let result = answertext.match(/[我的|正确]答案[::]\s{1}([A-Z]+?):/);
  1891. return result ? result[1] : null;
  1892. }
  1893. function uploadHomeWork() {
  1894. logger("开始收录答案", "green");
  1895. let $_homeworktable = $(".mark_table");
  1896. let TiMuList = $_homeworktable.find(".mark_item").find(".questionLi");
  1897. let data = [];
  1898. $.each(TiMuList, (i, t) => {
  1899. let _a = {};
  1900. let _answer;
  1901. let _answerTmpArr, _answerList = [];
  1902. let TiMuFull = tidyQuestion($(t).find("h3.mark_name").html());
  1903. let TiMuType = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[TiMuFull.match(/[(](.*?)[)]|$/)[1].replace(/, .*?分/, "")];
  1904. let TiMu = TiMuFull.replace(/^[(].*?[)]|$/, "").trim();
  1905. let rightAns_path = $(t).find(".mark_answer").find(".colorGreen")[0];
  1906. switch (TiMuType) {
  1907. case 0:
  1908. let d_rightAns;
  1909. if (rightAns_path) {
  1910. d_rightAns = filterAnswerIndex($(t).find(".mark_answer").find(".colorGreen").text());
  1911. } else {
  1912. let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class");
  1913. let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text();
  1914. if (_isTrue2 == "marking_dui" || _isZero != "0") {
  1915. d_rightAns = filterAnswerIndex($(t).find(".mark_answer").find(".colorDeep").text());
  1916. } else {
  1917. return;
  1918. }
  1919. }
  1920. _answerTmpArr = $(t).find(".mark_letter li");
  1921. $.each(_answerTmpArr, (a, b) => {
  1922. _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, ""));
  1923. });
  1924. let _i = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[d_rightAns];
  1925. _answer = _answerList[_i];
  1926. _a["question"] = TiMu;
  1927. _a["type"] = TiMuType;
  1928. _a["answer"] = _answer;
  1929. data.push(_a);
  1930. break;
  1931. case 1:
  1932. _answer = [];
  1933. let m_rightAns;
  1934. if (rightAns_path) {
  1935. m_rightAns = filterAnswerIndex($(t).find(".mark_answer").find(".colorGreen").text());
  1936. } else {
  1937. let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class");
  1938. let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text();
  1939. if (_isTrue2 == "marking_dui" || _isTrue2 == "marking_bandui" || _isZero != "0") {
  1940. m_rightAns = filterAnswerIndex($(t).find(".mark_answer").find(".colorDeep").text());
  1941. } else {
  1942. break;
  1943. }
  1944. }
  1945. _answerTmpArr = $(t).find(".mark_letter li");
  1946. $.each(_answerTmpArr, (a, b) => {
  1947. _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, ""));
  1948. });
  1949. $.each(m_rightAns.split(""), (c, d) => {
  1950. let _i2 = { A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 }[d];
  1951. _answer.push(_answerList[_i2]);
  1952. });
  1953. _a["question"] = TiMu;
  1954. _a["type"] = TiMuType;
  1955. _a["answer"] = _answer.join("#");
  1956. data.push(_a);
  1957. break;
  1958. case 2:
  1959. _answerTmpArr = [];
  1960. let t_rightAns;
  1961. let answers = $(t).find(".mark_answer").find(".colorDeep").find("dd");
  1962. if (rightAns_path) {
  1963. t_rightAns = $(rightAns_path).text().replace(/\s/g, "").replace(/[(][0-9].*?[)]/g, "#").replace(/第.*?空:/g, "#").replace(/^正确答案[::]#*/, "");
  1964. _answer = t_rightAns;
  1965. } else {
  1966. let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text();
  1967. if (_isZero && _isZero != 0) {
  1968. $.each(answers, (i2, t2) => {
  1969. t_rightAns = $(t2).find("span:eq(0)").text();
  1970. _answerTmpArr.push(t_rightAns.replace(/[(][0-9].*?[)]/, "").replace(/第.*?空:/, "").trim());
  1971. });
  1972. } else {
  1973. $.each(answers, (i2, t2) => {
  1974. let _isTrue2 = $(t2).find("span:eq(1)").attr("class");
  1975. if (_isTrue2 == "marking_dui") {
  1976. t_rightAns = $(t2).find("span:eq(0)").text();
  1977. _answerTmpArr.push(t_rightAns.replace(/[(][0-9].*?[)]/, "").replace(/第.*?空:/, "").trim());
  1978. } else {
  1979. return;
  1980. }
  1981. });
  1982. }
  1983. _answer = _answerTmpArr.join("#");
  1984. }
  1985. if (_answer.length != 0) {
  1986. _a["question"] = TiMu;
  1987. _a["type"] = TiMuType;
  1988. _a["answer"] = _answer;
  1989. data.push(_a);
  1990. }
  1991. break;
  1992. case 3:
  1993. let p_rightAns;
  1994. if (rightAns_path) {
  1995. p_rightAns = $(rightAns_path).text().replace(/\s/g, "").replace(/^正确答案[::]/, "");
  1996. } else {
  1997. let _isTrue2 = $(t).find(".mark_answer").find(".mark_score span").attr("class");
  1998. let _isZero = $(t).find(".mark_answer").find(".mark_score .totalScore.fr i").text();
  1999. if (_isTrue2 == "marking_dui" || _isZero != "0") {
  2000. p_rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/\s/g, "").replace(/^我的答案[::]/, "");
  2001. } else {
  2002. let _true = "正确|是|对|√|T|ri";
  2003. p_rightAns = $(t).find(".mark_answer").find(".colorDeep").text().replace(/\s/g, "").replace(/^我的答案[::]/, "");
  2004. if (_true.indexOf(p_rightAns) != -1) {
  2005. p_rightAns = "错";
  2006. } else {
  2007. p_rightAns = "对";
  2008. }
  2009. }
  2010. }
  2011. _a["question"] = TiMu;
  2012. _a["type"] = TiMuType;
  2013. _a["answer"] = p_rightAns;
  2014. data.push(_a);
  2015. break;
  2016. case 4:
  2017. let j_rightAns;
  2018. if (rightAns_path) {
  2019. j_rightAns = $(rightAns_path).text().replace(/\s/g, "");
  2020. } else {
  2021. break;
  2022. }
  2023. _a["question"] = TiMu;
  2024. _a["type"] = TiMuType;
  2025. _a["answer"] = j_rightAns;
  2026. data.push(_a);
  2027. break;
  2028. }
  2029. });
  2030. setTimeout(() => {
  2031. uploadAnswer(data, 0);
  2032. }, 1500);
  2033. }
  2034. function getEnc(a, b, c, d, e, f, g) {
  2035. return new Promise((resolve, reject) => {
  2036. let strEnc = `[${a}][${b}][${c}][${d}][${e * 1e3}][d_yHJ!$pdA~5][${f * 1e3}][${g}]`;
  2037. resolve(md5(strEnc));
  2038. });
  2039. }
  2040. function getAnswer(_t, _q, _o) {
  2041. _t = _t+"";
  2042. _q = _q+"";
  2043. _o = _o+"";
  2044. if (setting.tikuAdapter.use) {
  2045. return new Promise((resolve, reject) => {
  2046. tikuAdapter(_t, _q, _o).then((data) => {
  2047. if (data.length == 0) {
  2048. reject(data);
  2049. } else {
  2050. resolve(data);
  2051. }
  2052. });
  2053. });
  2054. } else if (_GM_getValue("lemtkpro")) {
  2055. logger("🎈请注意:您正在使用高级搜索功能。", "#CC33FF");
  2056. return new Promise((resolve, reject) => {
  2057. advancedSearch(_t, _q, _o).then((data) => {
  2058. data = data.replace("===", "#");
  2059. resolve(data);
  2060. }).catch((data) => {
  2061. reject(data);
  2062. });
  2063. });
  2064. } else {
  2065. let tkurl = atob(_host) + "/api/v1/cx";
  2066. return new Promise((resolve, reject) => {
  2067. let _u = getCk("_uid") || getCk("UID");
  2068. _GM_xmlhttpRequest({
  2069. method: "POST",
  2070. url: tkurl,
  2071. headers: {
  2072. "Content-type": "application/json",
  2073. "Authorization": "Bearer " + setting.token
  2074. },
  2075. data: JSON.stringify({
  2076. "v": _GM_info["script"]["version"],
  2077. "question": _q,
  2078. "type": _t,
  2079. "options": _o,
  2080. "uid": _u,
  2081. }),
  2082. timeout: setting.time,
  2083. onload: function (xhr) {
  2084. if (xhr.status == 200) {
  2085. let obj = JSON.parse(xhr.responseText) || {};
  2086. if (obj.code == 1e3) {
  2087. let _answer = /^http/.test(obj.data.answer) ? '<img src="' + obj.data.answer + '">' : obj.data.answer;
  2088. logger("题目:" + _q + "<br />---->答案:" + _answer, "purple");
  2089. _answer = _answer.replace("===", "#");
  2090. resolve(_answer);
  2091. } else if (obj.code == 1003) {
  2092. normalSearch(_t, _q, _o).then((data) => {
  2093. resolve(data);
  2094. }).catch((data) => {
  2095. reject(data);
  2096. });
  2097. } else {
  2098. logger(obj.msg, "red");
  2099. setting.sub = 0;
  2100. reject({ "c": 0 });
  2101. }
  2102. } else {
  2103. normalSearch(_t, _q, _o).then((data) => {
  2104. resolve(data);
  2105. }).catch((data) => {
  2106. reject(data);
  2107. });
  2108. }
  2109. },
  2110. ontimeout: function () {
  2111. normalSearch(_t, _q, _o).then((data) => {
  2112. resolve(data);
  2113. }).catch((data) => {
  2114. reject(data);
  2115. });
  2116. }
  2117. });
  2118. });
  2119. }
  2120. }
  2121. function advancedSearch(_t, _q, _o) {
  2122. let tkurl = atob(_host) + "/api/v1/mcx";
  2123. return new Promise((resolve, reject) => {
  2124. let _u = getCk("_uid") || getCk("UID");
  2125. _GM_xmlhttpRequest({
  2126. method: "POST",
  2127. url: tkurl,
  2128. headers: {
  2129. "Content-type": "application/json",
  2130. "Authorization": "Bearer " + setting.token
  2131. },
  2132. data: JSON.stringify({
  2133. "v": _GM_info["script"]["version"],
  2134. "question": _q,
  2135. "type": _t,
  2136. "options": _o,
  2137. "uid": _u
  2138. }),
  2139. timeout: setting.time,
  2140. onload: function (xhr) {
  2141. if (xhr.status == 200) {
  2142. let obj = JSON.parse(xhr.responseText) || {};
  2143. if (obj.code == 1e3) {
  2144. let _answer = /^http/.test(obj.data.answer) ? '<img src="' + obj.data.answer + '">' : obj.data.answer;
  2145. logger("题目:" + _q + "<br />---->答案:" + _answer, "purple");
  2146. resolve(_answer);
  2147. } else if (obj.code == 5e3 || obj.code == 5001) {
  2148. logger(obj.msg, "red");
  2149. setting.sub = 0;
  2150. reject({ "c": 0 });
  2151. } else if (obj.code == 1003) {
  2152. logger("题目:" + _q + "<br />---->暂无答案", "red");
  2153. setting.sub = 0;
  2154. reject({ "c": 0 });
  2155. } else {
  2156. logger(obj.msg, "red");
  2157. setting.sub = 0;
  2158. reject({ "c": 0 });
  2159. }
  2160. } else if (xhr.status == 403) {
  2161. logger("请求过于频繁,请稍后再试", "red");
  2162. reject({ "c": 403 });
  2163. } else if (xhr.status == 500) {
  2164. logger("题库程序异常,请过一会再试", "red");
  2165. reject({ "c": 500 });
  2166. } else if (xhr.status == 444) {
  2167. logger("IP异常,已被拉入服务器黑名单,请过几个小时再试", "red");
  2168. reject({ "c": 444 });
  2169. } else if (xhr.status == 400) {
  2170. let obj = JSON.parse(xhr.responseText) || {};
  2171. logger(obj.msg, "red");
  2172. reject({ "c": 400 });
  2173. } else {
  2174. logger("题库异常,可能被恶意攻击了...请等待恢复", "red");
  2175. reject({ "c": 555 });
  2176. }
  2177. },
  2178. ontimeout: function () {
  2179. logger("题库异常,可能被恶意攻击了...请等待恢复", "red");
  2180. reject({ "c": 666 });
  2181. }
  2182. });
  2183. });
  2184. }
  2185. function normalSearch(_t, _q, _o) {
  2186. let _fHost = "aHR0cHM6Ly9jeC5pY29kZWYuY29t";
  2187. return new Promise((resolve, reject) => {
  2188. getCk("_uid") || getCk("UID");
  2189. _GM_xmlhttpRequest({
  2190. method: "POST",
  2191. url: atob(_fHost) + "/wyn-nb?v=4",
  2192. headers: {
  2193. "Content-type": "application/x-www-form-urlencoded"
  2194. },
  2195. data: "question=" + encodeURIComponent(_q),
  2196. timeout: setting.time,
  2197. onload: function (xhr) {
  2198. if (xhr.status == 200) {
  2199. let obj2 = JSON.parse(xhr.responseText) || {};
  2200. if (obj2.code == 1 && obj2.data) {
  2201. let _answer = /^http/.test(obj2.data) ? '<img src="' + obj2.data + '">' : obj2.data;
  2202. logger("题目:" + _q + "<br />---->答案:" + _answer, "purple");
  2203. uploadAnswer([{ "question": _q, "type": _t, "answer": obj2.data }], 1);
  2204. _answer = _answer.replace("===", "#");
  2205. resolve(_answer);
  2206. } else {
  2207. logger("题目:" + _q + "<br />---->暂无答案,试试高级搜索吧", "red");
  2208. setting.sub = 0;
  2209. reject({ "c": 0 });
  2210. }
  2211. } else if (xhr.status == 403) {
  2212. logger("请求过于频繁,请稍后再试,或者试试高级搜索吧", "red");
  2213. reject({ "c": 403 });
  2214. } else if (xhr.status == 500) {
  2215. logger("题库程序异常,请过一会再试,或者试试高级搜索吧", "red");
  2216. reject({ "c": 500 });
  2217. } else if (xhr.status == 444) {
  2218. logger("IP异常,已被拉入服务器黑名单,请过几个小时再试,或者试试高级搜索吧", "red");
  2219. reject({ "c": 444 });
  2220. } else if (xhr.status == 400) {
  2221. var obj = $.parseJSON(xhr.responseText) || {};
  2222. logger(obj.msg, "red");
  2223. reject({ "c": 400 });
  2224. } else {
  2225. logger("题库异常,可能被恶意攻击了...请等待恢复,或者试试高级搜索吧", "red");
  2226. reject({ "c": 555 });
  2227. }
  2228. },
  2229. ontimeout: function () {
  2230. logger("题库异常,可能被恶意攻击了...请等待恢复,或者试试高级搜索吧", "red");
  2231. reject({ "c": 666 });
  2232. }
  2233. });
  2234. });
  2235. }
  2236. function doWork(index, doms, dom) {
  2237. $frame_c = $(dom).contents();
  2238. let $CyHtml = $frame_c.find(".CeYan");
  2239. let TiMuList = $CyHtml.find(".TiMu");
  2240. $subBtn = $frame_c.find(".ZY_sub").find(".btnSubmit");
  2241. $saveBtn = $frame_c.find(".ZY_sub").find(".btnSave");
  2242. startDoWork(index, doms, 0, TiMuList);
  2243. }
  2244. function startDoWork(index, doms, c, TiMuList) {
  2245. if (c == TiMuList.length) {
  2246. if (setting.sub) {
  2247. logger("测验处理完成,准备自动提交。", "green");
  2248. setTimeout(() => {
  2249. $subBtn.click();
  2250. setTimeout(() => {
  2251. let $recof = $frame_c.find(".maskDiv .popDiv .popBottom a#popok");
  2252. $recof[0].click();
  2253. logger("提交成功,准备切换下一个任务。", "green");
  2254. _mlist.splice(0, 1);
  2255. _domList.splice(0, 1);
  2256. setTimeout(() => {
  2257. startDoCyWork(index + 1, doms);
  2258. }, 3e3);
  2259. }, 5e3);
  2260. }, 3e3);
  2261. } else if (setting.force) {
  2262. logger("测验处理完成,存在无答案题目,由于用户设置了强制提交,准备自动提交。", "red");
  2263. setTimeout(() => {
  2264. $subBtn.click();
  2265. setTimeout(() => {
  2266. let $recof = $frame_c.find(".maskDiv .popDiv .popBottom a#popok");
  2267. $recof[0].click();
  2268. logger("提交成功,准备切换下一个任务。", "green");
  2269. _mlist.splice(0, 1);
  2270. _domList.splice(0, 1);
  2271. setTimeout(() => {
  2272. startDoCyWork(index + 1, doms);
  2273. }, 3e3);
  2274. }, 3e3);
  2275. }, 5e3);
  2276. } else {
  2277. logger("测验处理完成,存在无答案题目或者用户设置不提交。", "red");
  2278. }
  2279. return;
  2280. }
  2281. let questionFull = $(TiMuList[c]).find(".Zy_TItle.clearfix > div").html();
  2282. questionFull = tidyQuestion(questionFull).replace("/<span.*?>.*?</span>/", "");
  2283. let _question = tidyQuestion(questionFull);
  2284. let _TimuType = { 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 }[questionFull.match(/^【(.*?)】|$/)[1]];
  2285. let _a = [];
  2286. let _answerTmpArr, _options;
  2287. switch (_TimuType) {
  2288. case 0:
  2289. // single
  2290. _answerTmpArr = $(TiMuList[c]).find(".Zy_ulTop li").find("a");
  2291. $.each(_answerTmpArr, (i, t) => {
  2292. _a.push(tidyStr($(t).html()));
  2293. });
  2294. _options = _a.join("#");
  2295. getAnswer(_TimuType, _question, _options).then((agrs) => {
  2296. let _i = _a.findIndex((item) => item == agrs);
  2297. if (_i == -1) {
  2298. logger("未匹配到正确答案,跳过", "red");
  2299. setting.sub = 0;
  2300. } else {
  2301. $(_answerTmpArr[_i]).parent().click();
  2302. }
  2303. setTimeout(() => {
  2304. startDoWork(index, doms, c + 1, TiMuList);
  2305. }, setting.time);
  2306. }).catch((agrs) => {
  2307. setTimeout(() => {
  2308. startDoWork(index, doms, c + 1, TiMuList);
  2309. }, setting.time);
  2310. });
  2311. break;
  2312. case 1:
  2313. // multiple
  2314. _answerTmpArr = $(TiMuList[c]).find(".Zy_ulTop li").find("a");
  2315. _answerTmpArr.each(function () {
  2316. let answerText = tidyStr($(this).text()).replace(/[ABCD]/g, '').trim();
  2317. _a.push(answerText);
  2318. });
  2319. _options = _a.join("|");
  2320. _a = [];
  2321. getAnswer(_TimuType, _question, _options).then((agrs) => {
  2322. $.each(_answerTmpArr, (i, t) => {
  2323. if (agrs.indexOf(tidyStr($(t).html())) != -1) {
  2324. $(_answerTmpArr[i]).parent().click();
  2325. _a.push(["A", "B", "C", "D", "E", "F", "G"][i]);
  2326. }
  2327. });
  2328. if (_a.length <= 0) {
  2329. logger("未匹配到正确答案,跳过", "red");
  2330. setting.sub = 0;
  2331. }
  2332. setTimeout(() => {
  2333. startDoWork(index, doms, c + 1, TiMuList);
  2334. }, setting.time);
  2335. }).catch((agrs) => {
  2336. setTimeout(() => {
  2337. startDoWork(index, doms, c + 1, TiMuList);
  2338. }, setting.time);
  2339. });
  2340. break;
  2341. case 2:
  2342. // fill
  2343. _options = "";
  2344. let _textareaList = $(TiMuList[c]).find(".Zy_ulTk .XztiHover1");
  2345. getAnswer(_TimuType, _question, _options).then((agrs) => {
  2346. let _answerList = agrs.split("#");
  2347. $.each(_textareaList, (i, t) => {
  2348. setTimeout(() => {
  2349. $(t).find("#ueditor_" + i).contents().find(".view p").html(_answerList[i]);
  2350. $(t).find("textarea").html("<p>" + _answerList[i] + "</p>");
  2351. }, 300);
  2352. });
  2353. setTimeout(() => {
  2354. startDoWork(index, doms, c + 1, TiMuList);
  2355. }, setting.time);
  2356. }).catch((agrs) => {
  2357. setTimeout(() => {
  2358. startDoWork(index, doms, c + 1, TiMuList);
  2359. }, setting.time);
  2360. });
  2361. break;
  2362. case 3:
  2363. // judge
  2364. _options = "对|错";
  2365. _answerTmpArr = $(TiMuList[c]).find(".Zy_ulTop li").find("a");
  2366. let _true = "正确|是|对|√|T|ri";
  2367. $.each(_answerTmpArr, (i, t) => {
  2368. _a.push(tidyStr($(t).html()));
  2369. });
  2370. getAnswer(_TimuType, _question, _options).then((agrs) => {
  2371. agrs = _true.indexOf(agrs) != -1 ? "对" : "错";
  2372. let _i = _a.findIndex((item) => item == agrs);
  2373. if (_i == -1) {
  2374. logger("未匹配到正确答案,跳过", "red");
  2375. setting.sub = 0;
  2376. } else {
  2377. $(_answerTmpArr[_i]).parent().click();
  2378. }
  2379. setTimeout(() => {
  2380. startDoWork(index, doms, c + 1, TiMuList);
  2381. }, setting.time);
  2382. }).catch((agrs) => {
  2383. setTimeout(() => {
  2384. startDoWork(index, doms, c + 1, TiMuList);
  2385. }, setting.time);
  2386. });
  2387. break;
  2388. case 4:
  2389. // short
  2390. _options = "";
  2391. let _textareaLista = $(TiMuList[c]).find(".Zy_ulTk .XztiHover1");
  2392. getAnswer(_TimuType, _question, _options).then((agrs) => {
  2393. if (agrs == "暂无答案") {
  2394. setting.sub = 0;
  2395. }
  2396. let _answerList = agrs.split("#");
  2397. $.each(_textareaLista, (i, t) => {
  2398. setTimeout(() => {
  2399. $(t).find("#ueditor_" + i).contents().find(".view p").html(_answerList[i]);
  2400. $(t).find("textarea").html("<p>" + _answerList[i] + "</p>");
  2401. }, 300);
  2402. });
  2403. setTimeout(() => {
  2404. startDoWork(index, doms, c + 1, TiMuList);
  2405. }, setting.time);
  2406. }).catch((agrs) => {
  2407. setTimeout(() => {
  2408. startDoWork(index, doms, c + 1, TiMuList);
  2409. }, setting.time);
  2410. });
  2411. break;
  2412. default:
  2413. logger("未知题型,跳过", "red");
  2414. setTimeout(() => {
  2415. startDoWork(index, doms, c + 1, TiMuList);
  2416. }, setting.time);
  2417. }
  2418. }
  2419. function uploadAnswer(a, t) {
  2420. a.forEach((item) => {
  2421. item.type = item.type + "";
  2422. });
  2423. return new Promise((resolve, reject) => {
  2424. _GM_xmlhttpRequest({
  2425. url: atob(_host) + "/api/v1/upload",
  2426. data: JSON.stringify({
  2427. "v": _GM_info["script"]["version"],
  2428. "data": a,
  2429. "uid": "13f2f52f434d44d6e595088b8f5a4baf"
  2430. }),
  2431. method: "POST",
  2432. headers: {
  2433. "Content-Type": "application/json"
  2434. },
  2435. onload: function (xhr) {
  2436. try {
  2437. if (t == 1) {
  2438. resolve();
  2439. } else {
  2440. let res = JSON.parse(xhr.responseText);
  2441. if (res["code"] == 1e3) {
  2442. logger("Upload Success.", "green");
  2443. } else {
  2444. logger("Upload Error. Next Part.", "red");
  2445. }
  2446. resolve();
  2447. }
  2448. } catch {
  2449. let res = xhr.responseText;
  2450. if (res.indexOf("防火墙") != -1) {
  2451. logger("Upload Error. Please contact the author.", "red");
  2452. } else {
  2453. logger("Upload Unknow Error. Please contact the author.", "red");
  2454. }
  2455. resolve();
  2456. }
  2457. }
  2458. });
  2459. });
  2460. }
  2461. function switchMission() {
  2462. _mlist.splice(0, 1);
  2463. _domList.splice(0, 1);
  2464. setTimeout(missonStart, 5e3);
  2465. }
  2466. function tidyStr(s) {
  2467. if (s) {
  2468. let str = s.replace(/<(?!img).*?>/g, "").replace(/^【.*?】\s*/, "").replace(/\s*(\d+\.\d+分)$/, "").trim().replace(/&nbsp;/g, "").replace("javascript:void(0);", "").replace(new RegExp("&nbsp;", "gm"), "").replace(/^\s+/, "").replace(/\s+$/, "");
  2469. return str;
  2470. } else {
  2471. return null;
  2472. }
  2473. }
  2474. function tidyQuestion(s) {
  2475. if (s) {
  2476. let str = s.replace(/<(?!img).*?>/g, "").replace(/^【.*?】\s*/, "").replace(/\s*(\d+\.\d+分)$/, "").replace(/^\d+[\.、]/, "").trim().replace(/&nbsp;/g, "").replace("javascript:void(0);", "").replace(new RegExp("&nbsp;", "gm"), "").replace(/^\s+/, "").replace(/\s+$/, "");
  2477. return str;
  2478. } else {
  2479. return null;
  2480. }
  2481. }
  2482. function decryptFont() {
  2483. var $tip = $("style:contains(font-cxsecret)");
  2484. if (!$tip.length)
  2485. return;
  2486. var font = $tip.text().match(/base64,([\w\W]+?)'/)[1];
  2487. font = Typr.parse(base64ToUint8Array(font))[0];
  2488. var table = JSON.parse(GM_getResourceText("Table"));
  2489. var match = {};
  2490. for (var i = 19968; i < 40870; i++) {
  2491. $tip = Typr.U.codeToGlyph(font, i);
  2492. if (!$tip)
  2493. continue;
  2494. $tip = Typr.U.glyphToPath(font, $tip);
  2495. $tip = md5(JSON.stringify($tip)).slice(24);
  2496. match[i] = table[$tip];
  2497. }
  2498. $(".font-cxsecret").html(function (index, html) {
  2499. $.each(match, function (key, value) {
  2500. key = String.fromCharCode(key);
  2501. key = new RegExp(key, "g");
  2502. value = String.fromCharCode(value);
  2503. html = html.replace(key, value);
  2504. });
  2505. return html;
  2506. }).removeClass("font-cxsecret");
  2507. }
  2508. function base64ToUint8Array(base64) {
  2509. var data = window.atob(base64);
  2510. var buffer = new Uint8Array(data.length);
  2511. for (var i = 0; i < data.length; ++i) {
  2512. buffer[i] = data.charCodeAt(i);
  2513. }
  2514. return buffer;
  2515. }
  2516. console.log("%c别假装努力,结局不会陪你演戏!", "color: #E4B8D5");

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址