// ==UserScript== // @name 【粪仔】智慧树知道网课辅助[最新版] // @namespace 粪仔 & Shadow // @version 3.8.9.3 // @description 【用于学习编程使用】 // @author wyn665817 & Shadow // @match *://*.zhihuishu.com/* // @match *://*.zhihuishu.com/videoStudy* // @match *://*.zhihuishu.com/portals_h5* // @match *://*.zhihuishu.com/live* // @match *://*.zhihuishu.com/examh5* // @match *://*.zhihuishu.com/stuExamWeb* // @connect api.api.thsk.me // @run-at document-end // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_setValue // @grant GM_getValue // @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.org/scripts/420476/%E3%80%90%E7%B2%AA%E4%BB%94%E3%80%91%E6%99%BA%E6%85%A7%E6%A0%91%E7%9F%A5%E9%81%93%E7%BD%91%E8%AF%BE%E8%BE%85%E5%8A%A9%5B%E6%9C%80%E6%96%B0%E7%89%88%5D.user.js // @updateURL https://update.greasyfork.org/scripts/420476/%E3%80%90%E7%B2%AA%E4%BB%94%E3%80%91%E6%99%BA%E6%85%A7%E6%A0%91%E7%9F%A5%E9%81%93%E7%BD%91%E8%AF%BE%E8%BE%85%E5%8A%A9%5B%E6%9C%80%E6%96%B0%E7%89%88%5D.meta.js // ==/UserScript== // 设置修改后,需要刷新或重新打开网课页面才会生效 var setting = { // 8E3 == 8000,科学记数法,表示毫秒数 time: 5E3 // 默认响应速度为8秒,不建议小于5秒,减轻服务器响应压力 // 1代表开启,0代表关闭 , video: 1 // 视频支持课程、见面课,默认开启 , work: 1 // 自动答题功能,支持章测试、考试,高准确率,默认开启 , jump: 1 // 自动切换视频,支持课程、见面课,默认开启 // 仅开启video时,修改此处才会生效 , line: '流畅' // 视频播放的默认线路,可选参数:['高清', '流畅', '校内'],默认'流畅' , vol: '0' // 默认音量的百分数,设定范围:[0,100],'0'为静音,默认'0' , speed: '1' // 进度统计速率,高倍率可以快速完成任务点,设定范围:(0,+∞),默认'1.5'倍 // 上方参数支持在页面改动,下方参数仅支持代码处修改 , que: 1 // 屏蔽视频时间点对应的节试题,取消屏蔽则自动切换为模拟点击关闭弹题,默认开启 , danmu: 0 // 见面课弹幕,关闭后在网页中无法手动开启,默认关闭 , habit: '0' // 限制视频挂机时长,单位是分钟,如需挂机习惯分,可以修改参数为'30',默认不限制 ,TKU: 'http://api.api.thsk.me/wkapi/an4.php' // 仅开启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') { let old=Element.prototype.attachShadow Element.prototype.attachShadow=function(...args){ args[0].mode='open' return old.call(this,...args) } let oldset=window.setInterval let oldout=window.setTimeout window.setInterval=function(...args){ let err= new Error('2'); if(err.stack.indexOf('checkoutNotTrustScript')!==-1){ return } return oldset.call(this,...args) } window.setTimeout=function(...args){ let err= new Error('2'); if(err.stack.indexOf('checkoutNotTrustScript')!==-1){ return } return oldout.call(this,...args) } RegExp.prototype._test = RegExp.prototype.test; RegExp.prototype.test = function (s) { if (this.source.includes('function') || this.source.includes('native code')) { return true; } return this._test(s); }; setting.habit *= 6E4; hookVideo(_self.vjsComponent, 1); setInterval(checkToNext, setting.time); } else if (url == '/portals_h5/2clearning.html') { hookVideo(_self.vjsComponent, 2); 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')) { RegExp.prototype._test = RegExp.prototype.test; 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); hookVideo(_self.vjsComponent, 3); setInterval(checkToNext, setting.time, $('.source-file-item')); } 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 (setting.que) { var open = XMLHttpRequest.prototype.open open = function (method, url) { if (url.match('/loadVideoPointerInfo')) method = 'OPTIONS'; return open.apply(this, arguments); }; // return ajax; // } : xhr; } else { _self.XMLHttpRequest = 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) { if (setting.habit < 0) return; var $tip = $('.video, .lessonItem, .file-item'); 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 (url.match('vod_room')) { $('.current_player:contains("100%") + li').click(); // $('.finish_tishi').hasClass('disNo') || console.log('签到已完成'); } else if ($('.active .icon-finish').length) { $tip.slice($tip.index($('.active')) + 1).not(':has(.icon-finish)').eq(0).click(); } } function doTest(jb) { 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() { 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(''); }).end().text().trim(); }