Greasy Fork 支持简体中文。

NeumoocStar

东软慕课+课后作业,借鉴了NeumoocBBQ,目前有近代史,毛泽东思想,如果你有答案可联系我添加。

目前為 2020-05-12 提交的版本,檢視 最新版本

// ==UserScript==
// @name         NeumoocStar
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  东软慕课+课后作业,借鉴了NeumoocBBQ,目前有近代史,毛泽东思想,如果你有答案可联系我添加。
// @author       Aisen
// @match        http://mooc.neumooc.com/course/play/*
// @run-at       document-end
// @grant        unsafeWindow
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_download
// @connect      http://neu.aisencode.cn/*
// @requier      https://code.jquery.com/jquery-3.1.1.min.js
// @license      MIT
// ==/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,//默认开启做题
    justDoTest: false //只做题不看视频,默认关闭,开启为true

};



$(function() {
    // 尝试获取播放器,等待几秒钟,如果没有播放器跳转到下节课继续
    // 获取到播放器,激活防暂停
    is_500();
    logger('info', 'Init: Neumooc injected.');
    pannel();
    getAnswer();
    if (isVideo() && !setting.justDoTest) {
        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 {
        logger('info', 'Init: justDoTest is true or this is test.');
        doTest();
    }
})

function is_500() {

    if (window.location.href == 'http://mooc.neumooc.com/course/play/init') {
        if (setting.courseUrl != '') {
            window.location.href == setting.courseUrl;
        }


    }
}

// Logger
function logger(type, msg) {
    $(".info").text(msg);
    msg = "[NsumoocStar] " + msg;
    switch (type) {
        case 'warn':
            console.warn(msg);
            break;
        case 'log':
            console.log(msg);
            break;
        case 'info':
            console.info(msg);
            break;
    }
}
//面板
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" target="_blank">如果你有答案!点我联系作者添加。</a>'
    html += '</div>'
    html += '<div class="info">info</div>'
    html += '</div>'
    $("body").append(html);



}

//获取答案
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://neu.aisencode.cn/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 testHasPassed() {
    var maxCorrectRate = Number($('#maxCorrectRate').text().slice(0, -1));
    if (maxCorrectRate >= 80) {
        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);

                }
            }, 2000);

        }
    } else {
        logger('info', 'doTest: dotest is closed, will go next Outline in 5s.');
        //5s后点击下一节
        setTimeout(function() { nextOutline() }, setting.time);
    }



}

//选择
function chooseAnswer(answers) {
    $(".answers").text('本题答案为:' + 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 isVideo() {
    if ($('.fp-player').length >= 1) {
        return true;
    } else {
        return false;

    }

}

// 视频是否加载完成
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', 'waitVideo: waitVideo 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.');
}