Greasy Fork

Greasy Fork is available in English.

neumooc,NeumoocStar,东软慕课视频加作业

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

当前为 2020-05-12 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         neumooc,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.');
}