// ==UserScript== // @name NeumoocStar // @namespace http://tampermonkey.net/ // @version 0.1 // @description 东软慕课+课后作业,借鉴了NeumoocBBQ // @author Aisen // @match http://mooc.neumooc.com/course/play/* // @match http://mooc.neumooc.com/personal/index // @run-at document-end // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_addStyle // @connect * // @grant GM_download // @requier https://code.jquery.com/jquery-3.1.1.min.js // @downloadURL none // ==/UserScript== var window = unsafeWindow; var $ = unsafeWindow.jQuery; var setting = { time: 5e3, // 默认响应速度为5秒,不建议小于3秒 courseUrl: '', //'http://mooc.neumooc.com/course/play/init?courseId=C67744D352EB42B199D5905E7167AB97',//课程网址,建议每次添加上去,因为学校服务器容易500 //格式:'http://mooc.neumooc.com/course/play/init?courseId=C67744D352EB42B199D5905E7167AB97' answers: {}, //如果有答案则会从服务器获取,如果没有则为空,如果自己有答案可加入 //格式为 {"outl_D247C619659A4B12987B5E5D148E8065": "B B C","outl_6C746E61867D457FAA6218C73AAF5AC3": "C C B"} doTest: true //默认开启做题 }; $(function() { // 尝试获取播放器,等待几秒钟,如果没有播放器跳转到下节课继续 // 获取到播放器,激活防暂停 is_500(); logger('info', 'Init: Neumooc injected.'); pannel() getAnswer(); if (isVideo()) { var tryInitTime = 0; var initInterval = setInterval(function() { if (isPlayerReady()) { clearInterval(initInterval); logger('info', 'Init: Success find video player.'); disableBlurPause(); waitVideo(); } else { tryInitTime++; logger('info', 'Init: Waiting video player.'); if ($(".fp-ui")) $(".fp-ui").click(); if (tryInitTime >= 6) { clearInterval(initInterval); logger('warn', 'Init: Can not find player, next outline.'); doTest(); } } }, 1000) } else { doTest(); } }) function pannel() { GM_addStyle('.mypanel {position: fixed;overflow: hidden;top: 100px;right: 10px; width: 300px;height: 200px;background-color: rgba(70, 196, 38, 0.6);z-index: 999;border-radius: 5%;}'); GM_addStyle('.answers, .askMe, .info {height: 70px;line-height: 70px;flote:left;padding-left: 10px;;border-bottom: rgba(0, 0, 0, .2) dashed 2px;font-size: 13px;color:#fff}'); GM_addStyle('.askMe {display: none; }'); GM_addStyle('.askMe a {color:#fff !important}'); var html = '
' $("body").append(html); } // Logger function logger(type, msg) { //msg = "[NeumoocBBQ] "+msg+"\n" + (new Date).toString(); $(".info").text(msg); msg = "[Nsumooc] " + msg; switch (type) { case 'warn': console.warn(msg); break; case 'log': console.log(msg); break; case 'info': console.info(msg); break; } } function getAnswer() { var courseId = window.location.href.match(/courseId=(\S*)/)[1].split("&")[0]; if (localStorage.getItem('NeumoocCourseId=' + courseId)) { setting.answers = localStorage.getItem('NeumoocCourseId=' + courseId); setting.answers = JSON.parse(setting.answers); logger('info', 'getAnswer: Success find answers form the local.'); $(".answers").text('该课程有答案。'); } else { GM_xmlhttpRequest({ method: "GET", url: "http://nsu.zhonghaitao.com/answer.php", headers: { "Content-Type": "application/json" }, onload: function(res) { if (res.status == 200) { var json = JSON.parse(res.responseText); if (json[courseId]) { setting.answers = json[courseId].answers; var strAnswer = JSON.stringify(json[courseId].answers); localStorage.setItem('NeumoocCourseId=' + courseId, strAnswer); logger('info', 'getAnswer: Success find answers form the server.'); } else { logger('info', 'getAnswer: not find answers form the server.'); $(".answers").text('暂时没有该课程的答案。'); $(".askMe").show(); } } else { logger('warn', 'getAnswer: can not find the server'); setting.answers = {}; setting.doTest = false; } } }); } } function isVideo() { if ($('.fp-player').length >= 1) { return true; } else { return false; } } function doTest() { var outlineId = $("li[class ^= 'childLi'][style = 'background-color:#eee;']")[0].classList[1]; //console.log(outlineId); var seq = $(".seq_html"); if (setting.answers[outlineId] && setting.doTest) { if (seq) { seq.click(); if (testHasPassed()) { setTimeout(function() { var answers = setting.answers[outlineId].split(' '); $(".answers").text('该课程有答案。' + answers); logger('info', 'doTest: Success find answers:' + answers); setTimeout(function() { var btn = $(".btn-primary")[0]; btn.click(); var num = 0; var timer = setInterval(function() { chooseAnswer(answers[num]); num++; var btnNext = $('.btn-primary:last'); btnNext.click() if (num == answers.length) { clearInterval(timer); var btnOk = $('.ui-dialog_art-autofocus'); var btnClose = $('.ui-dialog_art-button').children('button'); setTimeout(function() { btnOk.click(); }, setting.time); setTimeout(function() { btnClose.click(); logger('info', 'doTest: Finished, will go next Outline in 5s.'); //5s后点击下一节 setTimeout(function() { nextOutline() }, setting.time); }, setting.time + 1000); } }, setting.time); }, setting.time); }, 2000); } else { logger('info', 'doTest: the test already passed, will go next Outline in 5s.'); //5s后点击下一节 setTimeout(function() { nextOutline() }, setting.time); } } } else { logger('info', 'doTest: dotest is closed, will go next Outline in 5s.'); //5s后点击下一节 setTimeout(function() { nextOutline() }, setting.time); } } function testHasPassed() { setTimeout(function() { var maxCorrectRate = Number($('#maxCorrectRate').text().slice(0, -1)); if (maxCorrectRate >= 80) { return true; } else { return false; } }, 1000); } function chooseAnswer(answers) { var btns = $("input[name='optionSelect']"); var btn; for (var i = 0; i < answers.length; i++) { switch (answers[i]) { case 'A': btn = btns[0]; break; case 'B': btn = btns[1]; break; case 'C': btn = btns[2]; break; case 'D': btn = btns[3]; break; case 'E': btn = btns[4]; break; case 'F': btn = btns[5]; break; case 'G': btn = btns[6]; break; case 'H': btn = btns[7]; break; } btn.click(); } } function is_500() { if (window.location.href == 'http://mooc.neumooc.com/course/play/init') { if(setting.courseUrl == '') {window.history.go(-1); }else{ window.location.href == setting.courseUrl; } } } function isPlayerReady() { if (window.flowPlayerObj) { //console.log(window.flowPlayerObj); return window.flowPlayerObj } else { return false; } } //解锁暂停 function disableBlurPause() { logger('info', 'disableBlurPause: disableBlurPause service started.'); var disableBlurPauseTimer = setInterval(function() { try { window.flowPlayerObj.play(); } catch (e) { clearInterval(disableBlurPauseTimer); logger('warn', 'Can not find player.'); } }, 500) } function waitVideo() { logger('info', 'AutoNext: AutoNext service started.'); var nextInterval = setInterval(function() { //如果播放完成 if (isFinished()) { clearInterval(nextInterval); doTest(); } else { logger('info', 'waitVideo: Waiting video finish.'); } }, 1000) } // 跟进播放进度 function isFinished() { return window.flowPlayerObj.finished; } // 跳转到下节课 function nextOutline() { var outlineId = $("input#outlineId").val(); var currentOutline = $('ul li.outl_' + outlineId); // 当前课程li var nextOutline; var next = currentOutline.nextAll(); if (next.length != 0) { nextOutline = $(next[0]); } else { var nextAll = currentOutline.parent('ul').parent('li').nextAll(); if (nextAll.length != 0) { nextOutline = $($(nextAll[0]).children("ul").children('li')[0]); } } var text = nextOutline.find('font').text(); var nextOutlineUrl = nextOutline.children("a").attr('href'); nextOutlineUrl ? window.location.href = nextOutlineUrl : logger('warn', 'Can not find next Outline.'); }