- // ==UserScript==
- // @name 优学院自动静音播放、自动做练习题、自动翻页、修改播放速率
- // @namespace [url=mailto:moriartylimitter@outlook.com]moriartylimitter@outlook.com[/url]
- // @version 1.6.1
- // @description 自动静音播放每页视频、自动作答、修改播放速率!
- // @author EliotZhang、Brush-JIM
- // @match *://*.ulearning.cn/learnCourse/*
- // @require https://code.jquery.com/jquery-3.4.1.min.js
- // @require https://code.jquery.com/ui/1.12.1/jquery-ui.js
- // @run-at document-start
- // @grant unsafeWindow
- // ==/UserScript==
-
- (function () {
- 'use strict';
- /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- * 优学院自动静音播放、自动做练习题、自动翻页、修改播放速率脚本v1.6.1由EliotZhang @ 2020/06/04 最后更新
- * 特别感谢Brush-JIM (Mail:Brush-JIM@protonmail.com) 提供的脚本改进支持!
- * 使用修改播放速率功能请谨慎!!!产生的不良后果恕某概不承担!!!
- * 请保持网课播放页面在浏览器中活动,避免长时间后台挂机(平台有挂机检测功能),以减少不必要的损失
- * 自动作答功能由于精力有限目前只支持单/多项选择、判断题、部分填空问答题,如果出现问题请尝试禁用这个功能!
- * 如果脚本无效请优先尝试刷新页面,若是无效请查看脚本最后的解决方案,如果还是不行请反馈给本人,本人将会尽快修复
- * 如果是因为网络问题,本人也无能为力
- * 如果在使用中还有什么问题请通过邮箱联系EliotZhang:moriartylimitter@outlook.com
- * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- var N = 1.50;
- var EnableAutoPlay = true;
- var EnableAutoMute = true;
- var EnableAutoChangeRate = true;
- var EnableAutoFillAnswer = true;
- var EnableAutoShowAnswer = true;
- var EnableAutoAnswerChoices = true;
- var EnableAutoAnswerJudges = true;
- var EnableAutoAnswerFills = true;
-
- // 新增函数 By Brush-JIM
- function Video(func = {}, slept = false) {
- if (!EnableAutoPlay)
- return;
- if (autoAnswering) {
- setTimeout(function () {
- Video({}, true);
- }, '1000');
- return;
- }
- if (!slept) {
- setTimeout(function () {
- Video({}, true);
- }, '3000');
- return;
- }
- var A_tmp = $('video');
- var A = [];
- for (let d = 0; d < A_tmp.length; d++) {
- if (A_tmp[d].src != "") {
- A.push(A_tmp[d]);
- }
- }
- if (A.length === 0) {
- GotoNextPage();
- return;
- }
- var B = [];
- var tmp = $('div[class="video-bottom"]');
- for (let b = 0; b < tmp.length; b++) {
- let span = tmp[b].getElementsByTagName("span")[0];
- if (span) {
- let data_bind = span.getAttribute('data-bind');
- if (data_bind == 'text: $root.i18nMessageText().finished' || data_bind == 'text: $root.i18nMessageText().viewed' || data_bind == 'text: $root.i18nMessageText().unviewed') {
- B.push(data_bind);
- }
- }
- }
-
- function video_ctrl(func) {
- for (let c = 0; c < A.length; c++) {
- if (B[c] == 'text: $root.i18nMessageText().viewed' || B[c] == 'text: $root.i18nMessageText().unviewed' || B[c] === false) {
- if (c - 1 >= 0) {
- if (A[c - 1].currentTime != 0) {
- if (A[c - 1].paused === true) {
- A[c - 1].play()
- }
- if (EnableAutoMute && A[c - 1].muted === false) {
- A[c - 1].muted = true;
- }
- if (EnableAutoChangeRate && A[c - 1].playbackRate != N) {
- A[c - 1].playbackRate = N
- }
- break;
- }
- }
- if (A[c].paused === true) {
- A[c].play();
- }
- if (EnableAutoMute && A[c].muted === false) {
- A[c].muted = true;
- }
- if (EnableAutoChangeRate && A[c].playbackRate != N) {
- A[c].playbackRate = N;
- }
- break;
- }
- }
- if (B[B.length - 1] == 'text: $root.i18nMessageText().finished' || B[B.length - 1] === true) {
- if (A[A.length - 1].currentTime != 0) {
- if (A[A.length - 1].paused === true) {
- A[A.length - 1].play()
- }
- if (EnableAutoMute && A[A.length - 1].muted === false) {
- A[A.length - 1].muted = true
- }
- if (EnableAutoChangeRate && A[A.length - 1].playbackRate != N) {
- A[A.length - 1].playbackRate = N
- }
- setTimeout(func, "2000", func);
- } else {
- GotoNextPage();
- }
- } else {
- setTimeout(func, "2000", func);
- }
- }
- if (A.length == B.length) {
- video_ctrl(Video);
- } else {
- B = [];
- for (let d = 0; d < A.length; d++) {
- B[d] = false;
- A[d].addEventListener("ended", function () {
- B[d] = true;
- }, true);
- }
- video_ctrl(video_ctrl);
- }
- }
-
- function GotoNextPage() {
- if (autoAnswering || !EnableAutoPlay || checkingModal)
- return;
- var nextPageBtn = $('.mobile-next-page-btn');
- if (nextPageBtn.length === 0)
- return;
- nextPageBtn.each((k, n) => {
- n.click();
- });
- setTimeout(Video, "1000");
- }
-
- function CheckModal(slept = false) {
- if (autoAnswering)
- return;
- if (!slept) {
- setTimeout(function () {
- CheckModal(true);
- }, '2000');
- return;
- }
- if (EnableAutoPlay) {
- CheckModal();
- }
- checkingModal = true;
- var qw = $('.question-wrapper');
- if (qw.length > 0 && EnableAutoFillAnswer) {
- ShowAndFillAnswer();
- checkingModal = false;
- return;
- }
- var statModal = $('#statModal');
- if (statModal.length > 0) {
- var ch = statModal[0];
- ch.getElementsByTagName('button');
- if (ch.length >= 2)
- ch[1].click();
- }
- var err = $('.mobile-video-error');
- if (err && err.css('display') != 'none')
- $('.try-again').click();
- var alertModal = document.getElementById("alertModal");
- if (alertModal === undefined) {
- checkingModal = false;
- return;
- }
- if (alertModal.className.match(/\sin/)) {
- var op = $('.modal-operation').children();
- if (op.length >= 2)
- op[EnableAutoFillAnswer ? 0 : 1].click();
- else {
- var continueBtn = $('.btn-submit');
- if (continueBtn.length > 0) {
- continueBtn.each((k, v) => {
- if ($(v).text() != '提交')
- $(v).click();
- });
- }
- }
- if (EnableAutoFillAnswer)
- ShowAndFillAnswer();
- }
- checkingModal = false;
- }
-
- function RemoveDuplicatedItem(arr) {
- for (var i = 0; i < arr.length - 1; i++) {
- for (var j = i + 1; j < arr.length; j++) {
- if (arr[i] == arr[j]) {
- arr.splice(j, 1);
- j--;
- }
- }
- }
- return arr;
- }
-
- function Escape2Html(str) {
- var arrEntities = {
- 'lt': '<',
- 'gt': '>',
- 'nbsp': ' ',
- 'amp': '&',
- 'quot': '"'
- };
- return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function (all, t) {
- return arrEntities[t];
- });
- }
-
- function DelHtmlTag(str) {
- return str.replace(/(<[^>]+>|\\n|\\r)/g, " ");
- }
-
- function FillAnswers() {
- if (!autoAnswering || !EnableAutoAnswerFills)
- return;
- var ansarr = [];
- var idList = [];
- var re = [];
- var txtAreas = $('textarea, .blank-input');
- $(txtAreas).each((k, v) => {
- var reg = /question\d+/;
- var fa = $(v).parent();
- while (!reg.test($(fa).attr('id'))) {
- fa = $(fa).parent();
- }
- var id = $(fa).attr('id').replace('question', '');
- idList.push(id);
- });
- idList = RemoveDuplicatedItem(idList);
- $(idList).each((k, id) => {
- $.ajax({
- url: 'https://api.ulearning.cn/questionAnswer/' + id,
- type: "GET",
- contentType: "application/json",
- dataType: 'json',
- async: false,
- data: {
- parentId: pageid,
- },
- success: function (result, status, xhr) {
- re.push(result.correctAnswerList);
- }
- });
- });
-
- $(re).each((k1, v1) => {
- if (v1.length == 1) {
- ansarr.push(DelHtmlTag(Escape2Html(v1[0])));
- } else {
- $(v1).each(function (k2, v2) {
- ansarr.push(DelHtmlTag(Escape2Html(v2)));
- });
- }
- });
- $(txtAreas).each((k, v) => {
- $(v).val(ansarr.shift());
- });
- }
-
- function ShowAndFillAnswer() {
- if (autoAnswering | !EnableAutoFillAnswer)
- return;
- autoAnswering = true;
- var sqList = [];
- var qw = $('.question-wrapper');
- var pages = $('.page-item');
- var an = [];
- qw.each(function (k, v) {
- var id = $(v).attr('id');
- sqList.push(id.replace('question', ''));
- });
- var flag = false;
- pages.each(function (k, v) {
- if (flag) return;
- var sp = $(v).find('.page-name');
- if (sp.length > 0 && sp[0].className.search('active') >= 0) {
- var pd = $(v).attr('id');
- pd = pd.slice(pd.search(/\d/g));
- pageid = pd;
- flag = true;
- }
- });
- if (!flag) {
- autoAnswering = false;
- GotoNextPage();
- return;
- }
- if (sqList.length <= 0) {
- autoAnswering = false;
- return;
- }
- $(sqList).each(function (k, id) {
- var flag = false;
- while (!flag)
- $.ajax({
- url: 'https://api.ulearning.cn/questionAnswer/' + id,
- type: "GET",
- contentType: "application/json",
- dataType: 'json',
- async: false,
- data: {
- parentId: pageid,
- },
- success: function (result, status, xhr) {
- an.push(result.correctAnswerList);
- flag = true;
- }
- });
- });
- //
- if (EnableAutoShowAnswer) {
- var t = qw.find('.question-title-html');
- t.each(function (k, v) {
- var ans = an.shift();
- $(v).after('<span style="color:red;">答案:' + ans + '</span>');
- an.push(ans);
- });
- }
- //
- var checkBox = qw.find('.checkbox');
- var choiceBox = qw.find('.choice-btn');
- var checkList = [];
- var choiceList = [];
- let lasOffsetP = '';
- checkBox.each((k, cb) => {
- if (lasOffsetP == $(cb).offsetParent().attr('id')) {
- checkList[checkList.length - 1].push(cb);
- } else {
- var l = [];
- l.push(cb);
- checkList.push(l);
- lasOffsetP = $(cb).offsetParent().attr('id');
- }
- });
- lasOffsetP = '';
- choiceBox.each((k, cb) => {
- if (lasOffsetP == $(cb).offsetParent().attr('id')) {
- choiceList[choiceList.length - 1].push(cb);
- } else {
- var l = [];
- l.push(cb);
- choiceList.push(l);
- lasOffsetP = $(cb).offsetParent().attr('id');
- }
- });
- an.forEach(a => {
- if (a == null || a == undefined || a.length <= 0) {
- return;
- }
- if (a[0].match(/[A-Z]/) && a[0].length == 1 && EnableAutoAnswerChoices) {
- var cb = checkList.shift();
- a.forEach(aa => {
- var cccb = $(cb[aa.charCodeAt() - 65]);
- if (cccb[0] === undefined || (cccb[0] != undefined && cccb[0].className.search('selected') < 0))
- cccb.click();
- });
- } else if (a[0].match(/(([tT][rR][uU][eE])|([fF][aA][lL][sS][eE]))/) && EnableAutoAnswerJudges) {
- var ccb = choiceList.shift();
- a.forEach(aa => {
- if (aa.match(/([tT][rR][uU][eE])/))
- ccb[0].click();
- else
- ccb[1].click();
- });
- }
- return;
-
- });
- if (EnableAutoAnswerFills) {
- FillAnswers();
- $.globalEval("$('textarea, .blank-input').trigger('change')");
- }
- if (EnableAutoPlay) {
- $('textarea, .blank-input').trigger('change');
- $('.btn-submit').click();
- var A_tmp = $('video');
- var A = [];
- for (let d = 0; d < A_tmp.length; d++) {
- if (A_tmp[d].src != "") {
- A.push(A_tmp[d]);
- }
- }
- if (A.length === 0) {
- autoAnswering = false;
- GotoNextPage();
- return;
- }
- }
- autoAnswering = false;
- }
-
- function LoadStyle(url) {
- var link = document.createElement('link');
- link.type = 'text/css';
- link.rel = 'stylesheet';
- link.href = url;
- var head = document.getElementsByTagName('head')[0];
- head.appendChild(link);
- }
-
- function DrawOptionPanel() {
- LoadStyle('https://eliotzhang.club/CSS/ulearning.css');
- var root = document.getElementsByTagName('body')[0];
- var panel = document.createElement('div');
- root.appendChild(panel);
- panel.setAttribute('class', 'OptionPanel');
- panel.innerHTML = "<div class='OptionPanel'><div class='DragBall'>UL</div><div class='MainPanel'><h2 class='OptionMainTitle'>优学院辅助脚本</br>by EliotZhang、BrushJIM</h2><button id='MainBtn'>隐藏设置</button><h4>视频播放</h4><ul class='OptionUL'><li>自动翻页、播放视频?<input class='OptionInput'id='AutoPlay'type='checkbox'checked='checked'></li><li>自动静音?<input class='OptionInput'id='AutoMute'type='checkbox'checked='checked'></li><li>自动调整速率(依赖自动播放视频功能)?<input class='OptionInput'id='AutoPlayRate'type='checkbox'checked='checked'></li><li>自动的速率速度<input class='OptionInput'id='AutoPlayRateChange'type='number'value='1.50'step='0.25'min='0.25'max='15.00'></li></ul><h4>自动作答</h4><ul class='OptionUL'><li>自动作答(总开关)?<input class='OptionInput'id='AutoAnswer'type='checkbox'checked='checked'></li><li>自动显示答案?<input class='OptionInput'id='AutoShowAnswer'type='checkbox'checked='checked'></li><li>自动作答选择题?<input class='OptionInput'id='AutoAnswerChoices'type='checkbox'checked='checked'></li><li>自动作答判断题?<input class='OptionInput'id='AutoAnswerJudges'type='checkbox'checked='checked'></li><li>自动作答填空、简答题?<input class='OptionInput'id='AutoAnswerFills'type='checkbox'checked='checked'></li></ul><button id='SaveOpBtn'>保存设置并刷新脚本</button><p style='color:hotpink;'>若<strong>关闭自动翻页功能</strong>导致<strong>自动作答系列功能失效</strong>请点击<strong>保存设置并刷新脚本按钮!</strong></p><p style='color:hotpink;'>若关闭自动翻页功能答完题后请<strong>手动提交!!</strong></p></div></div>";
- }
-
- function Init() {
- mainBtn = document.getElementById('MainBtn');
- dragBall = $('.DragBall');
- saveOpBtn = document.getElementById('SaveOpBtn');
- OptionPanel = $('.OptionPanel');
- MainPanel = $('.MainPanel');
- autoPlayOp = document.getElementById('AutoPlay');
- autoMuteOp = document.getElementById('AutoMute');
- autoPlayRateOp = document.getElementById('AutoPlayRate');
- autoPlayRateChangeOp = document.getElementById('AutoPlayRateChange');
- autoAnswerOp = document.getElementById('AutoAnswer');
- autoShowAnswerOp = document.getElementById('AutoShowAnswer');
- autoAnswerChoicesOp = document.getElementById('AutoAnswerChoices');
- autoAnswerJudgesOp = document.getElementById('AutoAnswerJudges');
- autoAnswerFillsOp = document.getElementById('AutoAnswerFills');
- dragBall.draggable({
- containment: ".page-scroller ps ps--theme_default",
- start: function (event, ui) {
- $(this).addClass('noclick');
- }
- });
- dragBall.hide();
- mainBtn.addEventListener('click', function () {
- MainPanel.hide();
- dragBall.show();
- }, true);
- dragBall.click(function (e) {
- if ($(this).hasClass('noclick')) {
- $(this).removeClass('noclick');
- } else if (e.target == e.currentTarget) {
- MainPanel.show();
- $(this).hide();
- }
- });
- autoPlayRateChangeOp.addEventListener('change', function () {
- let val = autoPlayRateChangeOp.value;
- if (val > 15.0)
- autoPlayRateChangeOp.value = 15;
- else if (val < 0.25)
- autoPlayRateChangeOp.value = 0.25;
- }, true);
- autoPlayOp.addEventListener('change', function () {
- if (autoPlayOp.checked === false)
- autoMuteOp.checked = autoPlayRateOp.checked = false;
- else
- autoMuteOp.checked = autoPlayRateOp.checked = true;
- });
- autoAnswerOp.addEventListener('change', function () {
- if (autoAnswerOp.checked === false)
- autoAnswerChoicesOp.checked = autoAnswerJudgesOp.checked = autoAnswerFillsOp.checked = autoShowAnswerOp.checked = false;
- else
- autoAnswerChoicesOp.checked = autoAnswerJudgesOp.checked = autoAnswerFillsOp.checked = autoShowAnswerOp.checked = true;
- });
- saveOpBtn.addEventListener('click', function () {
- EnableAutoMute = autoMuteOp.checked;
- EnableAutoChangeRate = autoPlayRateOp.checked;
- EnableAutoPlay = autoPlayOp.checked;
- EnableAutoShowAnswer = autoShowAnswerOp.checked;
- EnableAutoAnswerChoices = autoAnswerChoicesOp.checked;
- EnableAutoAnswerJudges = autoAnswerJudgesOp.checked;
- EnableAutoAnswerFills = autoAnswerFillsOp.checked;
- if (!EnableAutoShowAnswer && !EnableAutoAnswerChoices && !EnableAutoAnswerJudges && !EnableAutoAnswerFills)
- autoAnswerOp.checked = false;
- EnableAutoFillAnswer = autoAnswerOp.checked;
- N = autoPlayRateChangeOp.value;
- // Save
- window.localStorage.EZUL = 'EliotZhang、BrushJIM';
- window.localStorage.EAM = EnableAutoMute ? 't' : 'f';
- window.localStorage.EACR = EnableAutoChangeRate ? 't' : 'f';
- window.localStorage.EAP = EnableAutoPlay ? 't' : 'f';
- window.localStorage.EASA = EnableAutoShowAnswer ? 't' : 'f';
- window.localStorage.EAAC = EnableAutoAnswerChoices ? 't' : 'f';
- window.localStorage.EAAJ = EnableAutoAnswerJudges ? 't' : 'f';
- window.localStorage.EAAF = EnableAutoAnswerFills ? 't' : 'f';
- window.localStorage.EAFA = EnableAutoFillAnswer ? 't' : 'f';
- window.localStorage.APRC = autoPlayRateChangeOp.value.toString();
- Video({}, true);
- CheckModal(true);
- }, true);
- // Load
- if (window.localStorage.getItem('EZUL') === 'EliotZhang、BrushJIM') {
- autoMuteOp.checked = EnableAutoMute = window.localStorage.EAM == 't';
- autoPlayRateOp.checked = EnableAutoChangeRate = window.localStorage.EACR == 't';
- autoPlayOp.checked = EnableAutoPlay = window.localStorage.EAP == 't';
- autoShowAnswerOp.checked = EnableAutoShowAnswer = window.localStorage.EASA == 't';
- autoAnswerChoicesOp.checked = EnableAutoAnswerChoices = window.localStorage.EAAC == 't';
- autoAnswerJudgesOp.checked = EnableAutoAnswerJudges = window.localStorage.EAAJ == 't';
- autoAnswerFillsOp.checked = EnableAutoAnswerFills = window.localStorage.EAAF == 't';
- autoAnswerOp.checked = EnableAutoFillAnswer = window.localStorage.EAFA == 't';
- autoPlayRateChangeOp.value = N = parseFloat(window.localStorage.APRC);
- }
- }
-
- function Main() {
- DrawOptionPanel();
- Init();
- Video();
- CheckModal();
- }
-
- var autoAnswering = false;
- var checkingModal = false;
- var mainBtn;
- var dragBall;
- var saveOpBtn;
- var OptionPanel;
- var MainPanel;
- var autoPlayOp;
- var autoMuteOp;
- var autoPlayRateOp;
- var autoPlayRateChangeOp;
- var autoAnswerOp;
- var autoShowAnswerOp;
- var autoAnswerChoicesOp;
- var autoAnswerJudgesOp;
- var autoAnswerFillsOp;
- var pageid = '';
-
- setInterval(function () { unsafeWindow.document.dispatchEvent(new Event('mousemove')) }, 1000);
-
- setTimeout(Main, '3000');
-
- })();