网课脚本
// UserScript
// @name 知到/智慧樹網(wǎng)課助手(穩(wěn))
// @namespace
// @version 1.0.7
// @description 自動掛機看智慧樹/知到MOOC,支持自動切換下一節(jié),章節(jié)測試和kaoshi支持自動答題,視頻自動倍速播放、默認靜音等,解除各類功能限制;
// @author aliang
// @match 😕/.zhihuishu.com/*
// @connect api.s759n.cn
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @supportURL 222
// @license MIT
// /UserScript
// 設置修改后,需要刷新或重新打開網(wǎng)課頁面才會生效
var setting = {
// 5E3 == 5000,科學記數(shù)法,表示毫秒數(shù)
time: 3E3 // 默認響應速度為5秒,不建議小于3秒
,token: ‘’ // 捐助用戶可以使用定制功能,更精準的匹配答案,此處填寫捐助后獲取的識別碼
},
_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版本已取消支持舊版界面,問題反饋加QQ:2116718937’, 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’)) {
setting.video && hookVideo(_self.vjsComponent, 3);
setting.jump && setInterval(checkToNext, setting.time, $(’.source-file-item’));
} else if (url == ‘/shareCourse/questionDetailPage’) {
setTimeout(relieveLimit, 100, document);
$(‘textarea[oncut]’).each(function() {
setTimeout(relieveLimit, 100, this);
});
} else if (url.match(‘exerciseList’) && setting.work) {
_self.XMLHttpRequest = hookHiexam;
setInterval(function() {
$(setting.queue.shift()).parent().click();
}, 1E3);
setting.jump && setInterval(function() {
// var $li = setting.queue.length ? $() : $(’.jobclassallnumber-div li’);
// li.slice(li.slice(li.slice(li.index($(’.greenbordercur’)) + 1).not(’.greenbgcur’).eq(0).click();
setting.queue.length || $(’.Topicswitchingbtn:contains(下一題)’).click();
}, setting.time);
}
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,
rate = tip == 3 ? [1, 1.25, 1.5, 2, 2.5, 3] : [1, 1.25, 1.5];
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, rate) < 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: ‘校內(nèi)’, 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: ‘提示’, end: function() {
setting.habit = 0;
}});
});
}
function checkToNext(tip) {
if (setting.habit < 0) return;
var $tip = (′.video,.lessonItem′);if(('.video, .lessonItem'); if ((′.video,.lessonItem′);if((’.current_play .time_icofinish’).length) {
tip.slice(tip.slice(tip.slice(tip.index(KaTeX parse error: Expected 'EOF', got '}' at position 73: …).click(); }? else if ((’.lessonItemActive .finish’).length) {
// _self.PlayerStarter.playerArray[0].callback.playerNext();
tip.slice(tip.slice(tip.slice(tip.index($(’.lessonItemActive’)) + 1).not(’:has(.finish)’).eq(0).click();
} else if (tip == 1) {
$(’.current_player:contains(“100%”) + li’).click();
// KaTeX parse error: Expected 'EOF', got '}' at position 66: …('簽到已完成'); }? else if ((’.settleOn .finish’).length) {
tip.slice(tip.index($(’.settleOn’)) + 1).not(’:has(.finish)’).eq(0).find(’.file-name’).click();
}
}
function doTest() {
if (!$(’.dialog-test’).length) {
} else if (setting.queue.length) {
KaTeX parse error: Expected 'EOF', got '}' at position 47: …).click(); }? else if (!(’.answer’).length) {
KaTeX parse error: Expected 'EOF', got '}' at position 36: …).click(); }? else if (!(’.right’).length) {
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(.inArray(.inArray((this).text().slice(0, 1), tip) < 0 == KaTeX parse error: Expected 'EOF', got '&' at position 27: …lass('active') &?& setting.queue…(’.btn-next:enabled’).length) {
$(’.btn-next:enabled’).click();
} else {
$(’.dialog-test .btn’).click();
_self.PlayerStarter.playerArray[0].player.play();
}
}
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 = $(
‘
‘’ +
‘正在搜索答案…’ +
‘暫停答題’ +
‘重新查詢’ +
‘折疊面板’ +
‘未作答題目’ +
‘’ +
‘自定義答題范圍:’ +
‘’ +
’~ ’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘
‘’ +
‘ ’
).appendTo(‘body’).on(‘click’, ‘button, td’, function() {
var len = $(this).prevAll(‘button’).length;
if (this.nodeName == ‘TD’) {
KaTeX parse error: Expected 'EOF', got '&' at position 22: ….prev().length &?& GM_setClipboa…(this).text());
} else if (len === 0) {
if (setting.loop) {
clearInterval(setting.loop);
delete setting.loop;
len = [false, ‘已暫停搜索’, ‘繼續(xù)答題’];
} else {
setting.loop = setInterval(findAnswer, setting.time);
len = [true, ‘正在搜索答案…’, ‘暫停答題’];
}
setting.div.find(‘input’).attr(‘disabled’, len[0]);
setting.div.children(‘div:eq(0)’).html(function() {
return $(this).data(‘html’) || len[1];
}).removeData(‘html’);
$(this).html(len[2]);
} else if (len == 1) {
location.reload();
} else if (len == 2) {
setting.div.find(‘tbody, tfoot’).toggle();
} else if (len == 3) {
var $li = $(’.el-scrollbar__wrap li’),
$tip = $li.filter(’.white, .yellow’).eq(0);
$tip.click().length ? setting.div.children(‘div:last’).scrollTop(function() {
var $tr = $(‘tbody tr’, this).has(‘td:nth-child(1):contains(’ + tip.text()+′)′);if(!tip.text() + ')'); if (!tip.text()+′)′);if(!tr.length) return arguments[1];
return $tr.offset().top - $tr.parents(‘table’).offset().top; // $tr[0].offsetTop
}) : KaTeX parse error: Expected 'EOF', got '}' at position 24: …ide(); }? }).on('cha…/) ? parseInt(this.value) - 1 : -1;
if (!this.value) setting[this.name] = this.name == ‘num’ ? 0 : undefined;
}).detach(setting.hide ? ‘*’ : ‘html’);
setting.type = {
單選題: 1,
多選題: 2,
填空題: 3,
問答題: 4,
‘分析題/解答題/計算題/證明題’: 5,
‘閱讀理解(選擇)/完型填空’: 9,
判斷題: 14
};
setting.lose = setting.num = setting.small = 0;
$(document).keydown(function(event) {
if (event.keyCode == 38) {
setting.div.detach();
} else if (event.keyCode == 40) {
setting.div.appendTo(‘body’);
}
});
setting.loop = setInterval(findAnswer, setting.time, true);
setInterval(function() {
$(setting.queue.shift()).parent().click();
}, 1E3);
}
function findAnswer(tip) {
if (setting.queue.length) {
return;
} else if (tip && !$(’.answerCard’).length) {
return setting.div.children(‘div:eq(0)’).data(‘html’, ‘非自動答題頁面’).siblings(‘button:eq(0)’).click();
} else if (setting.max < 0 || setting.num < 0) {
return setting.div.children(‘div:eq(0)’).data(‘html’, ‘范圍參數(shù)應為 正整數(shù)’).siblings(‘button:eq(0)’).click();
} else if (setting.num >= $(’.subject_stem’).length || setting.num > setting.max) {
// setting.div.children(‘button:eq(3)’).toggle(!!setting.lose);
tip = setting.lose ? ‘共有 ’ + setting.lose + ’ 道題目待完善(已深色標注)’ : ‘答題已完成’;
return setting.div.children(‘div:eq(0)’).data(‘html’, tip).siblings(‘button:eq(0), form’).hide().click();
} else if (!setting.curs.length) {
setting.curs = $(’.infoList span’).map(function() {
return $(this).text().trim();
});
if (!setting.curs.length) return;
}
var $TiMu = $(’.subject_stem’).eq(setting.num).parent(),
$dom = TiMu.find(′.smallStemdescribe′).eq(setting.small).children(′div′).slice(1,?1),question=filterStyle(TiMu.find('.smallStem_describe').eq(setting.small).children('div').slice(1, -1), question = filterStyle(TiMu.find(′.smallStemd?escribe′).eq(setting.small).children(′div′).slice(1,?1),question=filterStyle(dom) || filterStyle($TiMu.find(’.subject_describe’)),
type = TiMu.find(′.subjecttype′).text().match(/【(.+)】∣TiMu.find('.subject_type').text().match(/【(.+)】|TiMu.find(′.subjectt?ype′).text().match(/【(.+)】∣/)[1];
type = type ? setting.type[type] || 0 : -1;
GM_xmlhttpRequest({
method: ‘GET’,
url: ‘http://api.s759n.cn/api.php?w=’ + encodeURIComponent(question),
headers: {
‘Content-type’: ‘a(chǎn)pplication/x-www-form-urlencoded’
},
timeout: setting.time,
onload: function(xhr) {
if (!setting.loop) {
} else if (xhr.status == 200) {
var obj = $.parseJSON(xhr.responseText) || {};
if (obj.code) {
setting.div.children(‘div:eq(0)’).text(‘正在搜索答案…’);
var data = obj.data.replace(/&/g, ‘&’).replace(/<([^i])/g, ‘<$1’);
obj.data = /^http/.test(data) ? ‘’ : obj.data;
$(
‘’ +
‘’ + $TiMu.find(’.subject_num’).text().trim().replace(’.’, ‘’) + ‘’ +
‘’ + (question.match(’<img’) ? question : question.replace(/&/g, ‘&’).replace(/</g, ‘<’)) + ‘’ +
‘’ + (/^http/.test(data) ? obj.data : ‘’) + data + ‘’ +
‘’
).appendTo(setting.div.find(‘tbody’)).css(‘background-color’, function() {
$dom = $dom.length ? $dom.closest(’.examPaper_subject’) : TiMu;if(fillAnswer(TiMu; if (fillAnswer(TiMu;if(fillAnswer(dom, obj, type)) return ‘’;
setting.div.children(‘button:eq(3)’).show();
return ‘rgba(0, 150, 136, 0.6)’;
});
setting.small = ++setting.small < $TiMu.find(’.smallStem_describe’).length ? setting.small : (setting.num++, 0);
} else {
setting.div.children(‘div:eq(0)’).html(obj.data || ‘服務器繁忙,正在重試…贊助或問題反饋QQ:209787028’);
}
setting.div.children(‘span’).html(obj.msg || ‘’);
} else if (xhr.status == 403) {
var html = xhr.responseText.indexOf(’{’) ? ‘請求過于頻繁,建議稍后再試,贊助或問題反饋QQ:209787028’ : $.parseJSON(xhr.responseText).data;
setting.div.children(‘div:eq(0)’).data(‘html’, html).siblings(‘button:eq(0)’).click();
} else {
setting.div.children(‘div:eq(0)’).text(‘服務器異常,正在重試…贊助或問題反饋QQ:209787028’);
}
},
ontimeout: function() {
setting.loop && setting.div.children(‘div:eq(0)’).text(‘服務器超時,正在重試…贊助或問題反饋QQ:209787028’);
}
});
}
function fillAnswer($TiMu, obj, type) {
var $div = $TiMu.find(’.nodeLab’),
str = String(obj.data).toCDB() || new Date().toString(),
data = str.split(/#|\x01||/),
state = setting.lose;
// $div.find(’📻checked’).prop(‘checked’, false);
obj.code > 0 && $div.each(function() {
var $input = (′input′,this)[0],tip=filterStyle(′.nodedetail′,this).toCDB()∣∣newDate().toString();if(tip.match(/(正確∣是∣對∣√∣T∣ri)('input', this)[0], tip = filterStyle('.node_detail', this).toCDB() || new Date().toString(); if (tip.match(/^(正確|是|對|√|T|ri)(′input′,this)[0],tip=filterStyle(′.noded?etail′,this).toCDB()∣∣newDate().toString();if(tip.match(/(正確∣是∣對∣√∣T∣ri)/)) {
data.join().match(/(^|,)(正確|是|對|√|T|ri)(,|KaTeX parse error: Expected 'EOF', got '&' at position 5: )/) &?& setting.queue…input);
} else if (tip.match(/^(錯誤|否|錯|×|F|wr)KaTeX parse error: Expected '}', got 'EOF' at end of input: …|否|錯|×|F|wr)(,|)/) && setting.queue.push(KaTeX parse error: Expected 'EOF', got '}' at position 17: …nput); }? else if (type ….inArray(tip, data) + 1 || str.indexOf(tip) + 1) == input.checked∣∣setting.queue.push(input.checked || setting.queue.push(input.checked∣∣setting.queue.push(input);
} else {
KaTeX parse error: Expected 'EOF', got '&' at position 25: …tip, data) + 1 &?& setting.queue…input);
}
});
if (setting.queue.length) {
} else if (/^(1|2|14)$/.test(type)) {
var $input = $div.find(‘input’);
input.is(′:checked′)∣∣(setting.none?setting.queue.push(input.is(':checked') || (setting.none ? setting.queue.push(input.is(′:checked′)∣∣(setting.none?setting.queue.push(input[Math.floor(Math.random() * KaTeX parse error: Expected 'EOF', got '}' at position 40: …g.lose++); }? else if (/^[3-…/.test(type)) {
data = String(obj.data).split(/#|\x01||/);
str = $TiMu.find(‘textarea’).each(function(index) {
index = (obj.code > 0 && data[index]) || ‘’;
this.value = index.trim();
// if (this.value == this._value) return true;
this.dispatchEvent(new Event(‘input’));
this.dispatchEvent(new Event(‘blur’));
}).length;
(obj.code > 0 && data.length == str) || setting.none || setting.lose++;
} else {
setting.none || setting.lose++;
}
return state == setting.lose;
}
function hookHiexam() {
var ajax = new xhr();
ajax.onload = function() {
if (this.status != 200 || !this.responseURL.match(‘getDoQuestSingle’)) return;
var obj = JSON.parse(this.responseText).rt;
$.each(obj.questionOptionList || [], function(index) {
var $input = KaTeX parse error: Expected '}', got '&' at position 111: …this.isCorrect &?& setting.queue…input);
} else if (obj.questionTypeId == 2) {
this.isCorrect == input.checked∣∣setting.queue.push(input.checked || setting.queue.push(input.checked∣∣setting.queue.push(input);
}
});
};
return ajax;
}
function filterStyle(dom, that) {
var $dom = $(dom, that).clone().find(‘style’).remove().end();
return $dom.find(‘img[src]’).replaceWith(function() {
return $(’
}).end().text().trim();
}
總結(jié)
- 上一篇: 【Matlab】建立最优控制LQR控制器
- 下一篇: LQR控制律设计