中国大学慕课mooc(辅助答题)

✨MOOC辅助答题,暂时不支持SPOC课程脚本还在测试中···

  1. // ==UserScript==
  2. // @name 中国大学慕课mooc(辅助答题)
  3. // @namespace ns@qq.com
  4. // @version 1.0
  5. // @description ✨MOOC辅助答题,暂时不支持SPOC课程脚本还在测试中···
  6. // @author noshuang
  7. // @match *://*.icourse163.org/*
  8. // @run-at document-end
  9. // @connect fm90.cn
  10. // @grant GM_xmlhttpRequest
  11. // @require https://lib.baomitu.com/jquery/3.6.0/jquery.min.js
  12. // ==/UserScript==
  13.  
  14. var conf = {
  15. title: "MOOC助手",
  16. datalist:{},
  17. time:1
  18. };
  19. //cdn库 https://www.bootcdn.cn/layui/
  20. $('head').append('<link href="https://lib.baomitu.com/layui/2.6.8/css/layui.css" rel="stylesheet" type="text/css" />');
  21. $.getScript("https://lib.baomitu.com/layui/2.6.8/layui.js", function(data, status, jqxhr) {
  22. layui.use('element', function(){
  23. var element = layui.element;
  24. });
  25. layer.closeAll();
  26. init();
  27. window.onhashchange = function() {
  28. layer.closeAll();
  29. init();
  30. };
  31. });
  32.  
  33. function answer1() {
  34. if (conf.num >= conf.inx) {
  35. var item = $(".u-questionItem").eq(conf.inx - 1);
  36. var tm = cl_text(item.find(".j-title").find(".f-richEditorText").html());
  37. tm = cl_text(tm);
  38. // layer.msg(tm);
  39. var tminx = item.find(".position").text();
  40. var tmtype = item.find(".qaCate>span").text();
  41. conf.pd = 0;
  42.  
  43. var da = answer_p(tm, item);
  44. var el="";
  45. if (da != null) {
  46.  
  47. if (conf.pd == 0) {
  48. conf.bad = conf.bad + 1;
  49. el = $('<tr class="layui-bg-red"><td>' + tminx + '</td><td>' + tm + '</td><td>' + da +
  50. '</td></tr>');
  51. $("#content>table>tbody").append(el);
  52. } else {
  53. el = $('<tr><td>' + tminx + '</td><td>' + tm + '</td><td>' + da + '</td></tr>');
  54. $("#content>table>tbody").append(el);
  55. }
  56.  
  57. } else {
  58. conf.bad = conf.bad + 1;
  59. el = $('<tr class="layui-bg-red"><td>' + tminx + '</td><td>' + tm + '</td><td>暂无答案</td></tr>');
  60. $("#content>table>tbody").append(el);
  61. }
  62. document.querySelector("#msg > blockquote").innerHTML = '共获取<span class="layui-bg-blue">&nbsp;' + conf.num +
  63. '&nbsp;<\/span>道题目,正在完成第<span class="layui-bg-blue">&nbsp;' + conf.inx + '&nbsp;<\/span>道题目';
  64. } else {
  65. clearInterval(conf.f);
  66. document.querySelector("#msg > blockquote").innerHTML = '共获取<span class="layui-bg-blue">&nbsp;' + conf.num +
  67. '&nbsp;<\/span>道题目,共<span class="layui-bg-red">&nbsp;' + conf.bad + '&nbsp;<\/span>待完成。';
  68.  
  69. }
  70. conf.inx = conf.inx + 1;
  71. if (conf.num < conf.inx) {
  72. clearInterval(conf.f);
  73. document.querySelector("#msg > blockquote").innerHTML = '共获取<span class="layui-bg-blue">&nbsp;' + conf.num +
  74. '&nbsp;<\/span>道题目,共<span class="layui-bg-red">&nbsp;' + conf.bad + '&nbsp;<\/span>待完成。';
  75.  
  76. }
  77. }
  78.  
  79. function answer_p(tm, item) {
  80. var da="";
  81. tm = tm.replace(/&amp;/g, "").replace(/http.*\/(.+)\./g,"$1").replace(/[^\u4e00-\u9fa5^\w]/g, "");
  82. for (var i = 0; i < conf.paperdata.length; i++) {
  83. var ytm=conf.paperdata[i]['tm'].replace(/http.*\/(.+)\./g,"$1").replace(/[^\u4e00-\u9fa5^\w]/g, "");
  84. if (tm == ytm) {
  85. var type = $.trim(item.find(".qaCate>span").text()); //题目类型
  86. switch (conf.paperdata[i]['status']) {
  87. case -1:
  88. da = null;
  89. break;
  90. case 1:
  91. da = conf.paperdata[i]['das'];
  92. if (type == "判断"||(type==""&&conf.paperdata[i]['type']==4)) {
  93. var tstr = ["正确", "对", "√", "true"];
  94. conf.pd = conf.pd + 1;
  95. if (tstr.indexOf(da[0]) > -1) {
  96. item.find(".choices>li").find(".u-icon-correct").parent().parent().css("border",
  97. "1px solid red");
  98. } else {
  99. item.find(".choices>li").find(".u-icon-wrong").parent().parent().css("border",
  100. "1px solid red");
  101. }
  102.  
  103. } else {
  104.  
  105. for (var j = 0; j < item.find(".choices>li").length; j++) {
  106. var xxtemp = cl_text(item.find(".choices>li").eq(j).find(".f-richEditorText").html());
  107. xxtemp = xxtemp.replace(/&amp;/g, "").replace(/http.*\/(.+)\./g,"$1").replace(/[^\u4e00-\u9fa5^\w]/g, "");
  108. for (var z = 0; z < da.length; z++) {
  109. if (xxtemp == da[z].replace(/http.*\/(.+)\./g,"$1").replace(/[^\u4e00-\u9fa5^\w]/g, "")) {
  110. item.find(".choices>li").eq(j).css("border", "1px solid red");
  111. }
  112. }
  113.  
  114. conf.pd = conf.pd + 1;
  115. }
  116. }
  117.  
  118.  
  119.  
  120.  
  121. break;
  122. case 2:
  123. conf.pd = conf.pd + 1;
  124. da = conf.paperdata[i]['das'][0];
  125. if (type == "填空"||(type==""&&conf.paperdata[i]['type']==3)) {
  126.  
  127. var el = $('<div><h3>答案:<span style="color:green">' + da + '</span></h3><div>');
  128.  
  129. item.find(".j-title").find(".f-richEditorText").append(el);
  130. }
  131. break;
  132. }
  133.  
  134. return da;
  135. }
  136. }
  137. return null;
  138. }
  139. function get_url_p(name)
  140. {
  141. var query = window.location.search.substring(1);
  142. var vars = query.split("&");
  143. for (var i=0;i<vars.length;i++) {
  144. var pair = vars[i].split("=");
  145. if(pair[0] == name){return pair[1];}
  146. }
  147. return(false);
  148. }
  149. function get_answers(taskid) {
  150. return new Promise((resolve, reject) => {
  151. var courseid= window.location.href.split("?")[0].split("-")[1];
  152. var tid=get_url_p("tid");
  153. var datas = {
  154. id: taskid,
  155. courseid:courseid,
  156. tid:tid
  157. };
  158. var data_form = new Deal();
  159. // var datas = { question: question,type: quetype };
  160. for (var value in datas) {
  161. data_form.append(value, datas[value]);
  162. }
  163. GM_xmlhttpRequest({
  164. method: "GET",
  165. url: "http://fm90.cn/mooc/query?" + data_form.text,
  166. onload: function (r) {
  167. if (r.status == 200) {
  168. try {
  169. let data = JSON.parse(r.responseText);
  170. if (data.code == 1) {
  171. resolve(data.data);
  172. }
  173. else if (data.code == 0) {
  174. return null;
  175. }
  176. }
  177. catch (e) {console.log("error")}
  178. }
  179. },
  180. onerror: function (e) {
  181. resolve(e);
  182. }
  183. });
  184. })
  185. }
  186.  
  187. function cl_text(text) {
  188. text = text.replace(/<(?!\/?img.+?>)[^<>]*>/g, "");
  189. text = text.replace(/(<img(?=\s).*?)\s+style=".*?"(.*?\/?>)/g, "$1$2");
  190. text = text.replace(/http:\/\//g, "https:\/\/");
  191. text = text.replace(/&#[^;]{2,};/g, "");
  192. text = text.replace(/\t/g, "");
  193. text = text.replace(/\n/g, "");
  194. text = text.replace(/\r/g, "");
  195. text = text.replace(/&.*?;/g, "");
  196. return $.trim(text);
  197.  
  198. }
  199.  
  200. async function init() {
  201. var url = location.pathname;
  202. var urls = window.location.href.split("#")[1].split("?")[0];
  203. console.log(urls);
  204. // var name = document.querySelector("#courseLearn-inner-box > div > div.u-learn-moduletitle.f-cb > h2");
  205. layer.closeAll();
  206. switch (urls) {
  207. case "/home/course":
  208. //个人课程主页
  209. break;
  210. case "/learn/announce":
  211. //学习页面
  212. break;
  213. case "/learn/testlist":
  214. //作业页面
  215. var ids = $("a[id^='auto-id']").id;
  216. break;
  217. case "/learn/examlist":
  218. //考试页面
  219. break;
  220. case "/learn/examObject"://旧版考试
  221. show();
  222. conf.id = window.location.href.split("#")[1].split("&id=")[1];
  223. break;
  224. case "/learn/quiz"://测验
  225. show();
  226. conf.id = window.location.href.split("#")[1].split("?id=")[1];
  227. break;
  228. case "/learn/content"://课件测验
  229. var tid=get_url_p("tid");
  230. var cid = window.location.href.split("cid=")[1];
  231. $.ajax({
  232. url: "/web/j/courseBean.getLastLearnedMocTermDto.rpc?csrfKey=797f430aebe845248c82344f783ca21f",
  233. data: {
  234. "termId":tid
  235. },
  236. dataType: "json",
  237. async: false,
  238. type: "post",
  239. success: function(data) {
  240. conf.data=data['result']['mocTermDto']['chapters'];
  241. conf.data.forEach((item,index,array)=>{
  242. item['lessons'].forEach((item1,index1,array1)=>{
  243. item1['units'].forEach((item2,index2,array2)=>{
  244.  
  245. item2['contentType']==5?conf.datalist[item2['id']]=item2['contentId']:"";
  246. })
  247. })
  248. });
  249. console.log(conf.datalist);
  250. }
  251.  
  252. })
  253. conf.id = conf.datalist[cid];
  254. console.log(cid);
  255. cid&&(cid in conf.datalist)&&show();
  256.  
  257. break;
  258. case "/learn/ojhw"://作业
  259. case "/learn/hw": //主观题
  260. layer.msg("别看了不支持这玩意", {
  261. icon: 5
  262. });
  263. break;
  264.  
  265. default:
  266. console.log(123);
  267.  
  268. };
  269.  
  270. }
  271.  
  272. function show() {
  273. return new Promise((resolve, reject) => {
  274. layer.closeAll();
  275. layer.open({
  276. type: 1,
  277. area: ['500px', '300px'],
  278. offset: 'rb',
  279. id: 'msgt',
  280. closeBtn: 0,
  281. title: conf.title,
  282. success: function(layero, index){
  283. conf.layerdom=layero[0];
  284. conf.layerindex=index;
  285. GM_xmlhttpRequest({
  286. method: "GET",
  287. url: "http://fm90.cn/mooc/msg",
  288. onload: function (r) {
  289. if (r.status == 200) {
  290. var data = JSON.parse(r.responseText);
  291. $(conf.layerdom).find(".layui-colla-content").html(data.msg + "<br><br><br>本脚本仅供学习参考,请勿在非法用途使用");
  292. }
  293. },
  294. onerror: function (e) {
  295. resolve(e);
  296. }
  297. });
  298. },
  299. shade: 0,
  300. maxmin: true,
  301. anim: 2,
  302. content: '<div id="msg" ><blockquote class="layui-elem-quote layui-quote-nm"><button type="button" class="layui-btn layui-btn-normal start">点我获取题库-请确保在试卷页面点击<button></blockquote>'+
  303. '<div class="layui-collapse"><div class="layui-colla-item"><h2 class="layui-colla-title">公告</h2><div class="layui-colla-content layui-show"></div></div>'
  304. +'<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>'
  305. });
  306. $(".start").click(function() {
  307. start();
  308. })
  309. })
  310. }
  311. class Deal {
  312. constructor() {
  313. this.text = "";
  314. this.data = [];
  315. }
  316. append(k, v) {
  317. this.data.push(encodeURIComponent(k) + "=" + encodeURIComponent(v));
  318. this.text = this.data.join("&").replace(/%20/g, "+");
  319. }
  320.  
  321. }
  322.  
  323. async function start() {
  324. conf.num = $(".u-questionItem").length;
  325. if (conf.num=="") {
  326. layer.msg("没题目是怎么回事呢,页面对了吗", {
  327. icon: 5
  328. });
  329. return 0;
  330. }
  331. conf.inx = 1;
  332. conf.bad = 0;
  333. conf.paperdata = await getAns();
  334. conf.paperdata?(conf.f = setInterval(answer1, conf.time)):"";
  335.  
  336. }
  337. async function getAns(){
  338. let ansList =await get_answers(conf.id);
  339. return ansList;
  340. }

QingJ © 2025

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