Greasy Fork

Greasy Fork is available in English.

UOOC assistant

UOOC优课联盟小助手:视频自动连播,可选自动二倍速播放(因为超过二倍速可能无法记录任务点),可选是否静音,离开页面能够继续播放,能够自动回答视频中途弹出问题;如果视频一开始处于停止状态,可以手动点击播放;如果视频标题下面出现倍速/静音选项,说明脚本正常启动运行;【有问题可以进行反馈,如果觉得不错,欢迎收藏或在反馈留下好评;如果愿意打赏一穷二白的作者,作者将感激不尽!】

当前为 2020-10-23 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         UOOC assistant
// @namespace    http://tampermonkey.net/
// @version      0.7.2
// @description  UOOC优课联盟小助手:视频自动连播,可选自动二倍速播放(因为超过二倍速可能无法记录任务点),可选是否静音,离开页面能够继续播放,能够自动回答视频中途弹出问题;如果视频一开始处于停止状态,可以手动点击播放;如果视频标题下面出现倍速/静音选项,说明脚本正常启动运行;【有问题可以进行反馈,如果觉得不错,欢迎收藏或在反馈留下好评;如果愿意打赏一穷二白的作者,作者将感激不尽!】
// @author       cc
// @include      *
// @grant        none
// ==/UserScript==

(function () {
    'use strict';
    const jsName = 'UOOCassistant.js';
    const host = window.location.host;
    if (host == 'www.uooc.net.cn') {
        console.log(`excute ${jsName}`);
        let recursive = () => {
            let extraTime = 0;
            try {
                let done = false;
                let video = document.querySelector('#player_html5_api');
                if (video) {
                    if (document.getElementById('rate').checked)
                        video.playbackRate = 2;
                    else
                        video.playbackRate = 1;
                    if (document.getElementById('volume').checked)
                        video.muted = true;
                    else
                        video.muted = false;
                    video.autoplay = true;
                    if (video.ended) {
                        done = true;
                    };
                    let quizLayer = document.querySelector('#quizLayer');
                    if (quizLayer && quizLayer.style.display != 'none') {
                        if (done) {
                            setTimeout(() => {
                                document.querySelectorAll('.layui-layer-shade').forEach(e => e.style.display = 'none');
                            }, 1000);
                        };
                        let source = JSON.parse(document.querySelector('div[uooc-video]').getAttribute('source'));
                        let quizList = source.quiz;
                        let quizIndex = 0;
                        let currentTime = video.currentTime;
                        let quizQuestion = document.querySelector('.smallTest-view .ti-q-c').innerHTML;
                        for (let i = 0; i < quizList.length; i++) {
                            if (quizList[i].question == quizQuestion) {
                                quizIndex = i;
                                break;
                            };
                        };
                        let quizAnswer = eval(quizList[quizIndex].answer);
                        let quizOptions = quizLayer.querySelector('div.ti-alist');
                        for (let ans of quizAnswer) {
                            let labelIndex = ans.charCodeAt() - 'A'.charCodeAt();
                            quizOptions.children[labelIndex].click();
                        }; // end for
                        quizLayer.querySelector('button').click();
                        extraTime = 1000;
                    }; // end if
                    if (!done) {
                        if (video.paused) {
                            video.play();
                        } else {
                            document.querySelectorAll('.layui-layer-shade, #quizLayer').forEach(e => e.style.display = 'none');
                        };
                    };
                }; // end if (video)
                if (!done) {
                    console.log('continue recursive function...');
                    setTimeout(recursive, 250 + extraTime);
                } else {
                    console.log('done!');
                    if (video) {
                        console.log('found video exists.');
                        let current_video = document.querySelector('.basic.active');
                        let next_video = current_video.nextElementSibling;
                        while (next_video && !next_video.querySelector('span.icon-video')) {
                            next_video = next_video.nextElementSibling;
                        };
                        if (next_video && next_video.querySelector('span.icon-video')) {
                            console.log('found next_video.');
                            next_video.click();
                            setTimeout(recursive, 500);
                        } else {
                            console.log('not found next_video.');
                            let uncomplete_video = document.querySelector(`li[ng-repeat='pointItem in sectionItem.children'] div.uncomplete`);
                            if (!uncomplete_video) {
                                uncomplete_video = document.querySelector(`li[ng-repeat='sectionItem in chapterItem.children'] div.uncomplete`);
                            };
                            if (uncomplete_video) {
                                console.log(uncomplete_video);
                                console.log('found uncomplete video, ready to click...');
                                uncomplete_video.click();
                                setTimeout(() => {
                                    let ul = uncomplete_video.parentNode.querySelector('ul');
                                    if (ul && ul.querySelector('.basic')) {
                                        console.log('found useful ul.');
                                        let next_video = uncomplete_video.parentNode.querySelector('ul').querySelector('.basic');
                                        next_video.click();
                                        setTimeout(() => {
                                            next_video.nextElementSibling.querySelector('.basic').click();
                                            setTimeout(recursive, 1000);
                                        }, 500);
                                    } else {
                                        console.log('not found useful ul.');
                                        uncomplete_video.nextElementSibling.firstElementChild.click();
                                        setTimeout(recursive, 1000);
                                    }
                                }, 500);
                            } else {
                                let next_section = document.querySelector('li div.basic.active').parentNode.parentNode.parentNode.parentNode.nextElementSibling.firstChild;
                                console.log('next_section as follows:');
                                console.log(next_section);
                                if (next_section) {
                                    console.log('found uncomplete section, ready to click...');
                                    next_section.click();
                                    setTimeout(() => {
                                        let next_video = next_section.nextElementSibling.firstElementChild;
                                        if (next_video.firstElementChild) {
                                            console.log('found next video, ready to click...');
                                            next_video.firstElementChild.click();
                                            setTimeout(() => {
                                                next_video.querySelector('div:nth-child(2) > div.basic').click();
                                                setTimeout(recursive, 500);
                                            }, 500);
                                        } else {
                                            console.log('not found next video, end recursive function.');
                                        };
                                    }, 500);
                                } else {
                                    let complete_items = document.querySelectorAll('.complete');
                                    let complete_video = complete_items.item(complete_items.length - 1);
                                    let uncomplete_video = complete_video.nextElementSibling;
                                    if (uncomplete_video) {
                                        console.log('found next video in the list.')
                                        uncomplete_video.click();
                                        setTimeout(recursive, 1000);
                                    } else {
                                        console.log('not found next video in the list.');
                                        complete_video = document.querySelector('.basic.active');
                                        let next_chapter = complete_video.parentNode.parentNode.nextElementSibling;
                                        if (next_chapter) {
                                            console.log('found next chapter of next chapter in the list.');
                                            next_chapter.firstElementChild.click();
                                            setTimeout(() => {
                                                let next_sub_chapter = next_chapter.querySelector('ul').querySelector('.basic.uncomplete');
                                                if (next_sub_chapter) {
                                                    console.log('found next chapter of next sub chapter in the list.');
                                                    next_sub_chapter.click();
                                                    setTimeout(() => {
                                                        let next_video = next_sub_chapter.nextElementSibling.querySelector('div');
                                                        if (next_video) {
                                                            console.log('found next video in next chapter of next sub chapter in the list.');
                                                            next_video.click();
                                                            setTimeout(recursive, 500);
                                                        } else {
                                                            console.log('not found next video in next chapter of next sub chapter in the list, end recursive function.');
                                                        };
                                                    }, 500);
                                                } else {
                                                    console.log('not found next chapter of next sub chapter in the list, end recursive function.');
                                                };
                                            }, 500);
                                        } else {
                                            console.log('not found next video of next chapter in the list.');
                                        };
                                    };
                                    console.log('not found uncomplete video, end recursive function.');
                                };
                            };
                        };
                    } else {
                        console.log('video not found.');
                    };
                };
            } catch (e) {
                // do nothing
            };
        }; // end recursive
        let wait = () => {
            if (document.readyState == 'complete') {
                console.log('ready to set checkboxes.');
                let getCheckbox = (name, text) => {
                    let p = document.createElement('p');
                    p.style.color = '#cccccc';
                    let checkbox = document.createElement('input');
                    checkbox.id = name;
                    checkbox.type = 'checkbox';
                    checkbox.checked = true;
                    checkbox.name = name;
                    checkbox.value = name;
                    checkbox.style.marginLeft = '20px';
                    p.append(checkbox);
                    let label = document.createElement('label');
                    label.setAttribute('for', name);
                    label.innerText = text;
                    label.style.marginLeft = '15px';
                    p.append(label);
                    p.style.margin = '10px';
                    return p;
                };
                let rateCheckbox = getCheckbox('rate', '倍速');
                let volumeCheckbox = getCheckbox('volume', '静音');
                let head = document.querySelector('.learn-head');
                let container = document.createElement('div');
                container.style.display = 'flex';
                container.style.flexDirection = 'row';
                container.append(rateCheckbox);
                container.append(volumeCheckbox);
                head.append(container);
                console.log('checkboxes have been set.');
                recursive();
            } else {
                setTimeout(wait, 200);
            };
        }; // end wait
        wait();
    }
})();