// ==UserScript== // @name 智慧树网课助手【MCD】 // @namespace MCDream // @version 4.0.3.6 // @description 【无需TOKEN】自动挂机看知到MOOC,支持屏蔽弹窗题目、自动切换下一节,章测试和考试支持自动答题,视频自动倍速播放、线路选择、默认静音等,解除各类功能限制,开放自定义参数 仅作接口更换,稳定性未知!!建议夜深人静时悄悄食用 // @author wyn665817 & MCDream // @match *://*.zhihuishu.com/* // @connect api.902000.xyz // @connect report.902000.xyz // @run-at document-end // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @license MIT // @original-script https://greasyfork.org/en/scripts/380506 // @original-author wyn665817 // @original-license MIT // @downloadURL https://update.greasyfork.icu/scripts/416806/%E6%99%BA%E6%85%A7%E6%A0%91%E7%BD%91%E8%AF%BE%E5%8A%A9%E6%89%8B%E3%80%90MCD%E3%80%91.user.js // @updateURL https://update.greasyfork.icu/scripts/416806/%E6%99%BA%E6%85%A7%E6%A0%91%E7%BD%91%E8%AF%BE%E5%8A%A9%E6%89%8B%E3%80%90MCD%E3%80%91.meta.js // ==/UserScript== // 设置修改后,需要刷新或重新打开网课页面才会生效 var setting = { // 8E3 == 8000,科学记数法,表示毫秒数 time: 8E3 // 默认响应速度为8秒,不建议小于5秒,减轻服务器响应压力 // 1代表开启,0代表关闭 , video: 1 // 视频支持课程、见面课,默认开启 , work: 1 // 自动答题功能,支持章测试、考试,高准确率,默认开启 , jump: 1 // 自动切换视频,支持课程、见面课,默认开启 // 仅开启video时,修改此处才会生效 , line: '流畅' // 视频播放的默认线路,可选参数:['高清', '流畅', '校内'],默认'流畅' , vol: '0' // 默认音量的百分数,设定范围:[0,100],'0'为静音,默认'0' , speed: '1.5' // 进度统计速率,高倍率可以快速完成任务点,设定范围:(0,+∞),默认'1.5'倍 // 上方参数支持在页面改动,下方参数仅支持代码处修改 , que: 1 // 屏蔽视频时间点对应的节试题,取消屏蔽则自动切换为模拟点击关闭弹题,默认开启 , danmu: 0 // 见面课弹幕,关闭后在网页中无法手动开启,默认关闭 , habit: '0' // 限制视频挂机时长,单位是分钟,如需挂机习惯分,可以修改参数为'30',默认不限制 // 仅开启work时,修改此处才会生效 , none: 0 // 无匹配答案时执行默认操作,默认关闭 , hide: 0 // 不加载答案搜索提示框,键盘↑和↓可以临时移除和加载,默认关闭 }, _self = unsafeWindow, url = location.pathname, $ = _self.jQuery, xhr = _self.XMLHttpRequest; String.prototype.toCDB = function () { return this.replace(/\s/g, '').replace(/[\uff01-\uff5e]/g, function (str) { return String.fromCharCode(str.charCodeAt(0) - 65248); }).replace(/[“”]/g, '"').replace(/[‘’]/g, "'").replace(/。/g, '.'); }; // setting.time += Math.ceil(setting.time * Math.random()) - setting.time / 2; setting.queue = setting.curs = []; if (!$) {} else if (url.match('/videoList')) { $.tmDialog.alert({ content: '2.X版本已取消支持旧版界面', title: '智慧树网课助手提示' }); } else if (url == '/videoStudy.html') { setting.habit *= 6E4; setting.video && hookVideo(_self.vjsComponent, 1); setting.jump && setInterval(checkToNext, setting.time); } else if (url == '/portals_h5/2clearning.html') { setting.video && hookVideo(_self.vjsComponent, 2); setting.jump && setInterval(checkToNext, setting.time); } else if (url == '/live/vod_room.html') { setting.video && hookVideo(_self.vjsComponent); setting.jump && setInterval(checkToNext, setting.time, 1); } else if (location.hostname.match('examh5')) { setTimeout(relieveLimit, 100, document); if (location.hash.match(/dohomework|doexamination/) && setting.work) beforeFind(); $(window).on('hashchange', function () { setting.work && location.reload(); }); } else if (url.match('/sourceLearning')) { var $tip = $('.source-file-item'); setting.jump && setInterval(function () { if (!$('.settleOn .finish').length) return; $tip.slice($tip.index($('.settleOn')) + 1).not(':has(.finish)').eq(0).find('.file-name').click(); }, setting.time); } else if (url == '/shareCourse/questionDetailPage') { setTimeout(relieveLimit, 100, document); $('textarea[oncut]').each(function () { setTimeout(relieveLimit, 100, this); }); } function hookVideo(Hooks, tip) { // _self.PlayerUtil.debugMode = true; _self.vjsComponent = function () { var config = arguments[0], options = config.options, line = $.map(options.sourceSrc.lines, function (value) { return value.lineName.replace('标准', '高清'); }), vol = setting.vol > 100 ? 100 : setting.vol; vol = Math.round(vol) / 100; options.volume = vol > 0 ? vol : 0; options.autostart = true; setting.speed = setting.speed > 0 ? +setting.speed : 1; options.rate = $.inArray(setting.speed, [1, 1.25, 1.5]) < 0 ? options.rate : setting.speed; tip && config.callback.playbackRate(setting.speed); options.chooseLine = $.inArray(setting.line, line) + 1 || options.chooseLine + 1; options.src = options.sourceSrc.lines[--options.chooseLine].lineUrl || options.src; if (!setting.danmu) { config.defOptions.control.danmuBtn = false; delete options.control.danmuBtn; } Hooks.apply(this, arguments); config.player.on('loadstart', function () { this.loop(true); this.play(); $('.speedBox span').text('X ' + setting.speed); }); }; $(document).on('click', '.definiLines b', function () { setting.line = ({ xiaonei: '校内', line1gq: '高清', line1bq: '流畅' })[this.classList[0]]; }).on('mouseup click', function () { setting.vol = _self.PlayerStarter.playerArray[0].player.cache_.volume * 100; }).on('click', '.speedList div', function () { setting.speed = $(this).attr('rate'); }); if (tip != 1) return; setting.tip = setting.habit && setInterval(totalTime, setting.time); setInterval(doTest, 1E3); _self.XMLHttpRequest = setting.que ? function () { var ajax = new xhr(), open = ajax.open; ajax.open = function (method, url) { if (url.match('/loadVideoPointerInfo')) method = 'OPTIONS'; return open.apply(this, arguments); }; return ajax; } : xhr; } function totalTime() { var player = _self.PlayerStarter.playerArray[0].player; setting.habit -= player.paused() ? 0 : setting.time; if (setting.habit > 0) return; clearInterval(setting.tip); player.pause(); $.getScript('//cdn.jsdelivr.net/gh/sentsin/layer/dist/layer.js', function () { _self.layer.open({ content: '已达到挂机限制时间', title: '智慧树网课助手提示' }); }); } function checkToNext(tip) { var $tip = $('.video, .lessonItem'); if ($('.current_play .time_icofinish').length) { $tip.slice($tip.index($('.current_play')) + 1).not(':has(.time_icofinish)').eq(0).click(); } else if ($('.lessonItemActive .finish').length) { // _self.PlayerStarter.playerArray[0].callback.playerNext(); $tip.slice($tip.index($('.lessonItemActive')) + 1).not(':has(.finish)').eq(0).click(); } else if (tip) { $('.current_player:contains("100%") + li').click(); // $('.finish_tishi').hasClass('disNo') || console.log('签到已完成'); } } function doTest() { if (!$('.dialog-test').length) {} else if (setting.queue.length) { $(setting.queue.shift()).parent().click(); } else if (!$('.answer').length) { $('.topic-item').eq(0).click(); } else if ($('.right').length) { $('.dialog-test .btn').click(); _self.PlayerStarter.playerArray[0].player.play(); } else { var tip = $('.answer span').text().match(/[A-Z]/g) || []; if (tip.length == 1) return $('.topic-option-item:contains(' + tip[0] + ')').click(); $('.topic-option-item').each(function () { $.inArray($(this).text().slice(0, 1), tip) < 0 == $(this).hasClass('active') && setting.queue.push(this); }); } } function relieveLimit(doc) { if (!doc.oncut && !doc.onselectstart) return setTimeout(relieveLimit, 100, doc); doc.oncontextmenu = doc.onpaste = doc.oncopy = doc.oncut = doc.onselectstart = null; } function beforeFind() { _self.XMLHttpRequest = function () { var ajax = new xhr(); ajax.onload = function (e) { if (this.status != 200 || !this.responseURL.match(/doHomework|doExam/)) return; var obj = JSON.parse(this.responseText); collectData(obj.rt.examBase); }; return ajax; }; setting.div = $( '
题号 | ' + '题目(点击可复制) | ' + '答案(点击可复制) | ' + '
---|---|---|
答案提示框 已折叠 | ' + '||
' + obj.name + '
'), option: $.map(obj.questionOptions, function (val) { return filterStyle('' + val.content + '
'); }), key: $.map(obj.questionOptions, function (val) { return val.id; }).join(), type: obj.questionType.id }); } function filterStyle(dom, that) { var $dom = $(dom, that).clone().find('style').remove().end(); return $dom.find('img[src]').replaceWith(function () { return $('').text('