// ==UserScript== // @name 超星网课助手/刷课/搜题(支持图片)/考试/all in one(fake题) // @namespace lyj // @version 3.4.3 // @description 考试版已经合并,自动答题,视频自动完成,章节测验自动答题提交,自动切换任务点等,开放自定义参数 // @author lyj // @match *://*.chaoxing.com/* // @match *://*.edu.cn/* // @connect ti.fakev.cn // @connect 127.0.0.1 // @connect baidu.com // @require https://lib.baomitu.com/jquery/3.6.0/jquery.js // @run-at document-end // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_setValue // @grant GM_getValue // @license MIT // @original-script https://greasyfork.org/scripts/369625 // @original-author wyn665817 // @original-license MIT // @antifeature tracking // @downloadURL https://update.greasyfork.icu/scripts/431514/%E8%B6%85%E6%98%9F%E7%BD%91%E8%AF%BE%E5%8A%A9%E6%89%8B%E5%88%B7%E8%AF%BE%E6%90%9C%E9%A2%98%EF%BC%88%E6%94%AF%E6%8C%81%E5%9B%BE%E7%89%87%EF%BC%89%E8%80%83%E8%AF%95all%20in%20one%28fake%E9%A2%98%29.user.js // @updateURL https://update.greasyfork.icu/scripts/431514/%E8%B6%85%E6%98%9F%E7%BD%91%E8%AF%BE%E5%8A%A9%E6%89%8B%E5%88%B7%E8%AF%BE%E6%90%9C%E9%A2%98%EF%BC%88%E6%94%AF%E6%8C%81%E5%9B%BE%E7%89%87%EF%BC%89%E8%80%83%E8%AF%95all%20in%20one%28fake%E9%A2%98%29.meta.js // ==/UserScript== GM_setValue("video_url", 0) var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?c2daa8e62b938a0869a122a0d6da4e9a"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); function getRandomInteger(min, max) { return Math.floor(Math.random() * (max - min)) + min; } // 设置修改后,需要刷新或重新打开网课页面才会生效 var setting = { // 5E3 == 5000,科学记数法,表示毫秒数 time: 3E3 // 默认响应速度为5秒,不建议小于5秒 , review: 0 // 复习模式,完整挂机视频(音频)时长,支持挂机任务点已完成的视频和音频,默认关闭 , queue: 1 // 队列模式,开启后任务点逐一完成,关闭则单页面所有任务点同时进行,默认开启 // 1代表开启,0代表关闭 , video: 1 // 视频支持后台、切换窗口不暂停,支持多视频,默认开启 , work: 1 // 自动答题功能(章节测验),作业需要手动开启查询,高准确率,默认开启 , audio: 1 // 音频自动播放,与视频功能共享vol和rate参数,默认开启 , book: 1 // 图书阅读任务点,非课程阅读任务点,默认开启 , docs: 1 // 文档阅读任务点,PPT类任务点自动完成阅读任务,默认开启 // 本区域参数,上方为任务点功能,下方为独立功能 , jump: 1 // 自动切换任务点、章节、课程(需要配置course参数),默认开启 , read: '65' // 挂机课程阅读时间,单位是分钟,'65'代表挂机65分钟,请手动打开阅读页面,默认'65'分钟 , face: 1 // 解除面部识别(不支持二维码类面部采集),此功能仅为临时解除,默认开启 , total: 1 // 显示课程进度的统计数据,在学习进度页面的上方展示,默认开启 // 仅开启video(audio)时,修改此处才会生效 , line: '公网1' // 视频播放的默认资源线路,此功能适用于系统默认线路无资源,默认'公网1' , http: '标清' // 视频播放的默认清晰度,无效参数则使用系统默认清晰度,默认'标清' // 本区域参数,上方为video功能独享,下方为audio功能共享 , vol: '0' // 默认音量的百分数,设定范围:[0,100],'0'为静音,默认'0' , rate: '1' // 视频播放默认倍率,参数范围0∪[0.0625,16],'0'为秒过,默认'1'倍 // 仅开启work时,修改此处才会生效 , auto: 1 //已放置面板,请在面板配置,默认为自动提交 // 答题完成后自动提交,默认开启 , none: 0 // 无匹配答案时执行默认操作,关闭后若题目无匹配答案则会暂时保存已作答的题目,默认开启 , scale: 0 // 富文本编辑器高度自动拉伸,用于文本类题目,答题框根据内容自动调整大小,默认关闭 // 仅开启jump时,修改此处才会生效 , course: 0 // 当前课程完成后自动切换课程,仅支持按照根目录课程顺序切换,默认开启 , lock: 1 // 跳过未开放(图标是锁)的章节,即闯关模式或定时发放的任务点,默认开启 // 自动登录功能配置区 , school: '账号为手机号可以不修改此参数' // 学校/单位/机构码,要求完整有效可查询,例如'清华大学' , username: '' // 学号/工号/借书证号(邮箱/手机号/账号),例如'2018010101',默认'' , password: '' // 密码,例如'123456',默认'' }, _self = unsafeWindow, url = location.pathname, top = _self, host = "http://ti.fakev.cn"; //host = "http://127.0.0.1:8079"; var tmpSubmit = 1; Object.defineProperty(setting, "auto", { get: function () { if (tmpSubmit >= 2) { return tmpSubmit === 3; } return GM_getValue("autosubmit"); }, set: function (value) { tmpSubmit = value + 2; } }); setting.notice = '公告栏'; const currentURL = window.location.pathname; // 获取当前网页地址 if (currentURL.slice(0, 32) == "/exam/test/reVersionTestStartNew") { (_self = unsafeWindow), ($ = _self.jQuery), (UE = _self.UE); String.prototype.toCDB = function () { return this.replace(/\s/g, "") .replace(/[\uff01-\uff5e]/g, function (str) { return String.fromCharCode(str.charCodeAt(0) - 65248); }) .replace(/[“”]/g, '"') .replace(/[‘’]/g, "'") .replace(/。/g, "."); }; setting.TiMu = [ filterImg(".Cy_TItle .clearfix") .replace(/\s*(\d+\.\d+分)$/, "") .replace("题型说明:请输入题型说明", "") .replace(/\s*/g, ""), $("[name^=type]:not([id])").val() || "-1", $(".cur a").text().trim() || "无", $("li .clearfix").map(function () { return filterImg(this); }), ]; setting.div = $( '
' + '' + '
正在搜索答案...
' + '' + '' + '' + "" + '
' + '' + "" + "" + '" + "" + "" + '' + '' + "" + "" + '' + "" + '' + "" + "" + "" + "" + '' + "" + "" + "
' + ($("#randomOptions").val() == "false" ? "" : '本次考试的选项为乱序 脚本会选择正确的选项') + "
题目(点击可复制)答案(点击可复制)
已关闭 本次自动切换
" + "
" + "
" ) .appendTo("body") .on("click", "button, td", function () { var num = setting.$btn.index(this); if (num == -1) { GM_setClipboard($(this).text()); } else if (num === 0) { if (setting.loop) { clearInterval(setting.loop); delete setting.loop; num = ["已暂停搜索", "继续答题"]; } else { setting.loop = setInterval(findTiMu, 2e3); num = ["正在搜索答案...", "暂停答题"]; } setting.$div .html(function () { return $(this).data("html") || num[0]; }) .removeData("html"); $(this).html(num[1]); } else if (num == 1) { setting.jump = 0; setting.$div.html(function () { return arguments[1].replace("即将切换下一题", "未开启自动切换"); }); setting.div.find("tfoot").add(this).toggle(); } else if (num == 2) { location.reload(); } else if (num == 3) { GM_setClipboard(setting.div.find("td:last").text()); } else if (num == 4) { ($(".leftCard .saveYl")[0] || $()).click(); } }) .detach(setting.hide ? "*" : "html"); setting.$btn = setting.div.children("button"); setting.$div = setting.div.children("div:eq(0)"); $(document).keydown(function (event) { if (event.keyCode == 38) { setting.div.detach(); } else if (event.keyCode == 40) { setting.div.appendTo("body"); } }); if (setting.scale) _self.UEDITOR_CONFIG.scaleEnabled = false; $.each(UE.instants, function () { var key = this.key; this.ready(function () { this.destroy(); UE.getEditor(key); }); }); setting.loop = setInterval(findTiMu, 2e3); function findTiMu() { GM_xmlhttpRequest({ method: "GET", url: host + '/hashTopic?question='+ encodeURIComponent(setting.TiMu[0]) + "&type=" + setting.TiMu[1], headers: { Authorization: setting.token, }, timeout: setting.time, onload: function (xhr) { if (!setting.loop) { } else if (xhr.status == 200) { var obj = $.parseJSON(xhr.responseText) || {}; if (obj.code) { var data = String(obj.data) .replace(/&/g, "&") .replace(/<(?!img)/g, "<"), que = setting.TiMu[0].match("' : obj.data; setting.div .find("tbody") .append( "" + '' + que + "" + '' + (/^http/.test(data) ? obj.data : "") + data + "" + "" ); setting.copy && GM_setClipboard(obj.data); setting.$btn.eq(3).show(); fillAnswer(obj); } else { setting.$div.html(obj.data || "服务器繁忙,正在重试..."); } setting.div.children("span").html(obj.msg || ""); } else if (xhr.status == 403) { var html = xhr.responseText.indexOf("{") ? "请求过于频繁,建议稍后再试" : $.parseJSON(xhr.responseText).data; setting.$div.data("html", html).siblings("button:eq(0)").click(); } else { setting.$div.text("服务器异常,正在重试..."); } }, ontimeout: function () { setting.loop && setting.$div.text("服务器超时,正在重试..."); }, }); } function fillAnswer(obj, tip) { var $input = $(":radio, :checkbox", ".Cy_ulBottom"), str = String(obj.data).toCDB() || new Date().toString(), data = str.split(/#|\x01|\|/), opt = obj.opt || str, btn = $(".saveYl:contains(下一题)").offset(); // $input.filter(':radio:checked').prop('checked', false); obj.code > 0 && $input .each(function (index) { if (this.value == "true") { data.join().match(/(^|,)(正确|是|对|√|T|ri)(,|$)/) && this.click(); } else if (this.value == "false") { data.join().match(/(^|,)(错误|否|错|×|F|wr)(,|$)/) && this.click(); } else { index = setting.TiMu[3][index].toCDB() || new Date().toString(); index = $.inArray(index, data) + 1 || (setting.TiMu[1] == "1" && str.indexOf(index) + 1); Boolean(index) == this.checked || this.click(); } }) .each(function () { if (!/^A?B?C?D?E?F?G?$/.test(opt)) return false; Boolean(opt.match(this.value)) == this.checked || this.click(); }); if (setting.TiMu[1].match(/^[013]$/)) { tip = $input.is(":checked") || (setting.none && (($input[Math.floor(Math.random() * $input.length)] || $()).click(), " ")); } else if (setting.TiMu[1].match(/^(2|[4-9]|1[08])$/)) { data = String(obj.data).split(/#|\x01|\|/); tip = $(".Cy_ulTk textarea").each(function (index) { index = (obj.code > 0 && data[index]) || ""; UE.getEditor(this.name).setContent(index.trim()); }).length; tip = (obj.code > 0 && data.length == tip) || (setting.none && " "); setting.len = (str.length * setting.time) / 10; } if (tip == " ") { tip = "已执行默认操作"; } else if (tip) { tip = "自动答题已完成"; } else if (tip === undefined) { tip = "该题型不支持自动答题"; } else { tip = "未找到有效答案"; } if (btn) { tip += setting.jump ? ",即将切换下一题" : ",未开启自动切换"; setInterval(function () { if (!setting.jump) return; var mouse = document.createEvent("MouseEvents"), arr = [ btn.left + Math.ceil(Math.random() * 80), btn.top + Math.ceil(Math.random() * 26), ]; mouse.initMouseEvent( "click", true, true, document.defaultView, 0, 0, 0, arr[0], arr[1], false, false, false, false, 0, null ); _self.event = $.extend(true, {}, mouse); delete _self.event.isTrusted; _self.getTheNextQuestion(1); }, setting.len || Math.ceil(setting.time * Math.random()) * 2); } else { setting.$btn.eq(1).hide(); tip = "答题已完成,请自行查看答题详情"; } setting.$div.data("html", tip).siblings("button:eq(0)").hide().click(); } function filterImg(dom) { return $(dom) .clone() .find("img[src]") .replaceWith(function () { return $("

").text(''); }) .end() .find("iframe[src]") .replaceWith(function () { return $("

").text( '