// ==UserScript==
// @name NeumoocStar
// @namespace http://tampermonkey.net/
// @version 0.3
// @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
// ==/UserScript==
var window = unsafeWindow;
var $ = unsafeWindow.jQuery;
var setting = {
time: 5e3, // 默认响应速度为5秒,不建议小于3秒
courseUrl: '', //课程网址,若为空脚本可能会暂停,建议每次添加上去,因为学校服务器容易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: 999999;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 = '<div class="mypanel">'
html += '<div class="answers">answers</div>'
html += '<div class="askMe">'
html += '<a href="http://wpa.qq.com/msgrd?v=3&uin=201826658&site=qq&menu=yes">如果你有答案!可以联系作者添加。</a>'
html += '</div>'
html += '<div class="info">info</div>'
html += '</div>'
$("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();
setTimeout(function() {
if (!testHasPassed()) {
var answers = setting.answers[outlineId].split(' ');
$(".answers").text('该课程有答案。');
logger('info', 'doTest: Success find 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);
} else {
logger('info', 'doTest: the test already passed, will go next Outline in 5s.');
//5s后点击下一节
setTimeout(function() { nextOutline() }, setting.time);
}
}, 1000);
}
} else {
logger('info', 'doTest: dotest is closed, will go next Outline in 5s.');
//5s后点击下一节
setTimeout(function() { nextOutline() }, setting.time);
}
}
//测试是否通过
function testHasPassed() {
var maxCorrectRate = Number($('#maxCorrectRate').text().slice(0, -1));
if (maxCorrectRate >= 80) {
return true;
} else {
return false;
}
}
//选择
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.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.');
}