- // ==UserScript==
- // @name 中国大学慕课mooc(辅助答题)
- // @namespace ns@qq.com
- // @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['result']['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;
- }