UOOC assistant优课联盟刷课软件脚本
UOOC优课联盟助手(UOOC assistant):视频自动连播,可选自动二倍速播放(因为超过二倍速可能无法记录任务点),可选是否静音,离开页面能够继续播放,能够自动回答视频中途弹出问题;如果视频一开始处于停止状态,可以手动点击播放;如果视频标题下面出现倍速/静音选项说明脚本正常启动运行。
功能:
【UOOC优课联盟助手 (UOOC assistant)
视频自动连播
可选是否自动二倍速播放(因为超过二倍速可能无法记录任务点)
可选是否静音
离开页面能够继续播放
能够自动回答视频中途弹出问题
可能遇到的问题:
如果视频一开始没有自动播放,请手动点击播放
如果视频标题下面出现"倍速/静音选项",说明脚本正常启动运行,否则请尝试刷新页面
如果多次刷新仍未出现"倍速/静音选项",可能是因为登录了另一个UOOC网址,请使用该UOOC网址进行观看
如果经过上述步骤后,出现了"倍速/静音选项",但是仍然无法连播,可能是未适配当前慕课,请留言告知该慕课名称和无法连播的视频章节数
如果经过上述步骤后,仍未出现"倍速/静音选项",
脚本:
// ==UserScript==
// @name UOOC assistant
// @name:en UOOC assistant
// @namespace http://tampermonkey.net/
// @version 0.7.3
// @description 【使用前先看介绍/有问题可反馈】【欢迎一键三连(好评+打赏+收藏),你的支持是作者维护下去的最大动力!】UOOC优课联盟助手(UOOC assistant):视频自动连播,可选自动二倍速播放(因为超过二倍速可能无法记录任务点),可选是否静音,离开页面能够继续播放,能够自动回答视频中途弹出问题;如果视频一开始处于停止状态,可以手动点击播放;如果视频标题下面出现倍速/静音选项说明脚本正常启动运行。
// @description:en 【使用前先看介绍/有问题可反馈】【欢迎一键三连(好评+打赏+收藏),你的支持是作者维护下去的最大动力!】UOOC优课联盟助手(UOOC assistant):视频自动连播,可选自动二倍速播放(因为超过二倍速可能无法记录任务点),可选是否静音,离开页面能够继续播放,能够自动回答视频中途弹出问题;如果视频一开始处于停止状态,可以手动点击播放;如果视频标题下面出现倍速/静音选项说明脚本正常启动运行。
// @author cc
// @include http://www.uooc.net.cn/*
// @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 = '25px';
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 = '5px';
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();
}
})();
打赏采用二维码方式。
