✨MOOC辅助答题,暂时不支持SPOC课程脚本还在测试中···
// ==UserScript== // @name ##大学慕课mooc(辅助答题) // @namespace [email protected] // @version 1.0 // @description ✨MOOC辅助答题,暂时不支持SPOC课程脚本还在测试中··· // @author noshuang // @match *://*.icourse163.org/* // @run-at document-end // @connect fm90.cn // @grant GM_xmlhttpRequest // @require https://lib.baomitu.com/jquery/3.6.0/jquery.min.js // ==/UserScript== var conf = { title: "MOOC助手", datalist:{}, time:1 }; //cdn库 https://www.bootcdn.cn/layui/ $('head').append('<link href="https://lib.baomitu.com/layui/2.6.8/css/layui.css" rel="stylesheet" type="text/css" />'); $.getScript("https://lib.baomitu.com/layui/2.6.8/layui.js", function(data, status, jqxhr) { layui.use('element', function(){ var element = layui.element; }); layer.closeAll(); init(); window.onhashchange = function() { layer.closeAll(); init(); }; }); function answer1() { if (conf.num >= conf.inx) { var item = $(".u-questionItem").eq(conf.inx - 1); var tm = cl_text(item.find(".j-title").find(".f-richEditorText").html()); tm = cl_text(tm); // layer.msg(tm); var tminx = item.find(".position").text(); var tmtype = item.find(".qaCate>span").text(); conf.pd = 0; var da = answer_p(tm, item); var el=""; if (da != null) { if (conf.pd == 0) { conf.bad = conf.bad + 1; el = $('<tr class="layui-bg-red"><td>' + tminx + '</td><td>' + tm + '</td><td>' + da + '</td></tr>'); $("#content>table>tbody").append(el); } else { el = $('<tr><td>' + tminx + '</td><td>' + tm + '</td><td>' + da + '</td></tr>'); $("#content>table>tbody").append(el); } } else { conf.bad = conf.bad + 1; el = $('<tr class="layui-bg-red"><td>' + tminx + '</td><td>' + tm + '</td><td>暂无答案</td></tr>'); $("#content>table>tbody").append(el); } document.querySelector("#msg > blockquote").innerHTML = '共获取<span class="layui-bg-blue"> ' + conf.num + ' <\/span>道题目,正在完成第<span class="layui-bg-blue"> ' + conf.inx + ' <\/span>道题目'; } else { clearInterval(conf.f); document.querySelector("#msg > blockquote").innerHTML = '共获取<span class="layui-bg-blue"> ' + conf.num + ' <\/span>道题目,共<span class="layui-bg-red"> ' + conf.bad + ' <\/span>待完成。'; } conf.inx = conf.inx + 1; if (conf.num < conf.inx) { clearInterval(conf.f); document.querySelector("#msg > blockquote").innerHTML = '共获取<span class="layui-bg-blue"> ' + conf.num + ' <\/span>道题目,共<span class="layui-bg-red"> ' + conf.bad + ' <\/span>待完成。'; } } function answer_p(tm, item) { var da=""; tm = tm.replace(/&/g, "").replace(/http.*\/(.+)\./g,"$1").replace(/[^\u4e00-\u9fa5^\w]/g, ""); for (var i = 0; i < conf.paperdata.length; i++) { var ytm=conf.paperdata[i]['tm'].replace(/http.*\/(.+)\./g,"$1").replace(/[^\u4e00-\u9fa5^\w]/g, ""); if (tm == ytm) { var type = $.trim(item.find(".qaCate>span").text()); //题目类型 switch (conf.paperdata[i]['status']) { case -1: da = null; break; case 1: da = conf.paperdata[i]['das']; if (type == "判断"||(type==""&&conf.paperdata[i]['type']==4)) { var tstr = ["正确", "对", "√", "true"]; conf.pd = conf.pd + 1; if (tstr.indexOf(da[0]) > -1) { item.find(".choices>li").find(".u-icon-correct").parent().parent().css("border", "1px solid red"); } else { item.find(".choices>li").find(".u-icon-wrong").parent().parent().css("border", "1px solid red"); } } else { for (var j = 0; j < item.find(".choices>li").length; j++) { var xxtemp = cl_text(item.find(".choices>li").eq(j).find(".f-richEditorText").html()); xxtemp = xxtemp.replace(/&/g, "").replace(/http.*\/(.+)\./g,"$1").replace(/[^\u4e00-\u9fa5^\w]/g, ""); for (var z = 0; z < da.length; z++) { if (xxtemp == da[z].replace(/http.*\/(.+)\./g,"$1").replace(/[^\u4e00-\u9fa5^\w]/g, "")) { item.find(".choices>li").eq(j).css("border", "1px solid red"); } } conf.pd = conf.pd + 1; } } break; case 2: conf.pd = conf.pd + 1; da = conf.paperdata[i]['das'][0]; if (type == "填空"||(type==""&&conf.paperdata[i]['type']==3)) { var el = $('<div><h3>答案:<span style="color:green">' + da + '</span></h3><div>'); item.find(".j-title").find(".f-richEditorText").append(el); } break; } return da; } } return null; } function get_url_p(name) { var query = window.location.search.substring(1); var vars = query.split("&"); for (var i=0;i<vars.length;i++) { var pair = vars[i].split("="); if(pair[0] == name){return pair[1];} } return(false); } function get_answers(taskid) { return new Promise((resolve, reject) => { var courseid= window.location.href.split("?")[0].split("-")[1]; var tid=get_url_p("tid"); var datas = { id: taskid, courseid:courseid, tid:tid }; var data_form = new Deal(); // var datas = { question: question,type: quetype }; for (var value in datas) { data_form.append(value, datas[value]); } GM_xmlhttpRequest({ method: "GET", url: "http://fm90.cn/mooc/query?" + data_form.text, onload: function (r) { if (r.status == 200) { try { let data = JSON.parse(r.responseText); if (data.code == 1) { resolve(data.data); } else if (data.code == 0) { return null; } } catch (e) {console.log("error")} } }, onerror: function (e) { resolve(e); } }); }) } function cl_text(text) { text = text.replace(/<(?!\/?img.+?>)[^<>]*>/g, ""); text = text.replace(/(<img(?=\s).*?)\s+style=".*?"(.*?\/?>)/g, "$1$2"); text = text.replace(/http:\/\//g, "https:\/\/"); text = text.replace(/&#[^;]{2,};/g, ""); text = text.replace(/\t/g, ""); text = text.replace(/\n/g, ""); text = text.replace(/\r/g, ""); text = text.replace(/&.*?;/g, ""); return $.trim(text); } async function init() { var url = location.pathname; var urls = window.location.href.split("#")[1].split("?")[0]; console.log(urls); // var name = document.querySelector("#courseLearn-inner-box > div > div.u-learn-moduletitle.f-cb > h2"); layer.closeAll(); switch (urls) { case "/home/course": //个人课程主页 break; case "/learn/announce": //学习页面 break; case "/learn/testlist": //作业页面 var ids = $("a[id^='auto-id']").id; break; case "/learn/examlist": //考试页面 break; case "/learn/examObject"://旧版考试 show(); conf.id = window.location.href.split("#")[1].split("&id=")[1]; break; case "/learn/quiz"://测验 show(); conf.id = window.location.href.split("#")[1].split("?id=")[1]; break; case "/learn/content"://课件测验 var tid=get_url_p("tid"); var cid = window.location.href.split("cid=")[1]; $.ajax({ url: "/web/j/courseBean.getLastLearnedMocTermDto.rpc?csrfKey=797f430aebe845248c82344f783ca21f", data: { "termId":tid }, dataType: "json", async: false, type: "post", success: function(data) { conf.data=data['r###lt']['mocTermDto']['chapters']; conf.data.forEach((item,index,array)=>{ item['lessons'].forEach((item1,index1,array1)=>{ item1['units'].forEach((item2,index2,array2)=>{ item2['contentType']==5?conf.datalist[item2['id']]=item2['contentId']:""; }) }) }); console.log(conf.datalist); } }) conf.id = conf.datalist[cid]; console.log(cid); cid&&(cid in conf.datalist)&&show(); break; case "/learn/ojhw"://作业 case "/learn/hw": //主观题 layer.msg("别看了不支持这玩意", { icon: 5 }); break; default: console.log(123); }; } function show() { return new Promise((resolve, reject) => { layer.closeAll(); layer.open({ type: 1, area: ['500px', '300px'], offset: 'rb', id: 'msgt', closeBtn: 0, title: conf.title, success: function(layero, index){ conf.layerdom=layero[0]; conf.layerindex=index; GM_xmlhttpRequest({ method: "GET", url: "http://fm90.cn/mooc/msg", onload: function (r) { if (r.status == 200) { var data = JSON.parse(r.responseText); $(conf.layerdom).find(".layui-colla-content").html(data.msg + "<br><br><br>本脚本仅供学习参考,请勿在非法用途使用"); } }, onerror: function (e) { resolve(e); } }); }, shade: 0, maxmin: true, anim: 2, content: '<div id="msg" ><blockquote class="layui-elem-quote layui-quote-nm"><button type="button" class="layui-btn layui-btn-normal start">点我获取题库-请确保在试卷页面点击<button></blockquote>'+ '<div class="layui-collapse"><div class="layui-colla-item"><h2 class="layui-colla-title">公告</h2><div class="layui-colla-content layui-show"></div></div>' +'<div id="content"><ul></ul> <table class="layui-table"> <colgroup> <col width="50"> <col> <col> </colgroup> <thead> <tr> <th>序号</th> <th>题目</th> <th>答案</th> </tr> </thead> <tbody> </tbody> </table></div></div></div>' }); $(".start").click(function() { start(); }) }) } class Deal { constructor() { this.text = ""; this.data = []; } append(k, v) { this.data.push(encodeURIComponent(k) + "=" + encodeURIComponent(v)); this.text = this.data.join("&").replace(/%20/g, "+"); } } async function start() { conf.num = $(".u-questionItem").length; if (conf.num=="") { layer.msg("没题目是怎么回事呢,页面对了吗", { icon: 5 }); return 0; } conf.inx = 1; conf.bad = 0; conf.paperdata = await getAns(); conf.paperdata?(conf.f = setInterval(answer1, conf.time)):""; } async function getAns(){ let ansList =await get_answers(conf.id); return ansList; }