// ==UserScript== // @name 电信网上大学超级学习 // @namespace remain_true_to_our_original_aspiration // @version 1.1.7 // @description 除了不能替你考试(暂时),更快、更全、更好用的电信网上大学学习工具。 // @author Ghost River // @match https://*.zhixueyun.com/* // @icon data:image/gif;base64,R0lGODlhIAAgAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wArAAArMwArZgArmQArzAAr/wBVAABVMwBVZgBVmQBVzABV/wCAAACAMwCAZgCAmQCAzACA/wCqAACqMwCqZgCqmQCqzACq/wDVAADVMwDVZgDVmQDVzADV/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMrADMrMzMrZjMrmTMrzDMr/zNVADNVMzNVZjNVmTNVzDNV/zOAADOAMzOAZjOAmTOAzDOA/zOqADOqMzOqZjOqmTOqzDOq/zPVADPVMzPVZjPVmTPVzDPV/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YrAGYrM2YrZmYrmWYrzGYr/2ZVAGZVM2ZVZmZVmWZVzGZV/2aAAGaAM2aAZmaAmWaAzGaA/2aqAGaqM2aqZmaqmWaqzGaq/2bVAGbVM2bVZmbVmWbVzGbV/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5krAJkrM5krZpkrmZkrzJkr/5lVAJlVM5lVZplVmZlVzJlV/5mAAJmAM5mAZpmAmZmAzJmA/5mqAJmqM5mqZpmqmZmqzJmq/5nVAJnVM5nVZpnVmZnVzJnV/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wrAMwrM8wrZswrmcwrzMwr/8xVAMxVM8xVZsxVmcxVzMxV/8yAAMyAM8yAZsyAmcyAzMyA/8yqAMyqM8yqZsyqmcyqzMyq/8zVAMzVM8zVZszVmczVzMzV/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8rAP8rM/8rZv8rmf8rzP8r//9VAP9VM/9VZv9Vmf9VzP9V//+AAP+AM/+AZv+Amf+AzP+A//+qAP+qM/+qZv+qmf+qzP+q///VAP/VM//VZv/Vmf/VzP/V////AP//M///Zv//mf//zP///wAAAAAAAAAAAAAAACH5BAEAAPwALAAAAAAgACAAAAj/APcJHEiw4D5i9AwqXLiwnR9UD3nVY8iQXsKFxGr5eXWRIsFCfgrSs1XrFS93+2z54eVx4LBXqAqiKsSrly2QLDe23DfzIU2BtQbqQ/XqlcBXhDxqTGjrVch9fughpPfn51GjC3v5mbiPECquKmfSc5VqGEE/vRbaGuiwo621+3oRKtRxn0OGL/38cbWRZS+W+4rGLPgKbkGVtdwFDexnWDunM18VMkjvKeG1vP4E3ZjX1jCVdQf6aWfwMy/O9ZwWdKzW8EB6Md1F5UXIFkqplfcNa7x6cMFCw1wVmomqskaOm1G53pfbIC9Uvcz6Wcv5YNFCy5lbJuiu48WtApXNrSStcLtHVPqG9SpZEKHA5gYz+rFM6E9MrQV5ASbme2AviETB1RQqZg0FmECpAMbLYgM9R0haBM1kWCGpECJZZAhCSJCGZ2H13kaFIKWcdjsJRIxCnxVmVkoMltiSMuC5uNOILSVkkY0HMUfYZDthtg9La7mSEkEauWjLIhOl1Ys+xNQkWioyrhXUWrbUY5ZRp7W400XK0LMkc/QM9wd5MopE4Xy1rFgmZY6FtlBAADs= // @license GPL3 // @grant GM_openInTab // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_listValues // @grant GM_addValueChangeListener // @grant GM_removeValueChangeListener // @grant window.close // @grant window.focus // @grant unsafeWindow // @downloadURL none // ==/UserScript== (function() { 'use strict'; if (!window.location.href.match('/train-new/class-detail/|/study/subject/detail/|/study/course/detail/|/study/course/out-detail/')) return; //非学习页面退出。 var max = 4; //最大同时学习课程数。如果同时学习的数量大于1,则需要同时启用另外名为“电信网上大学超级学习多开支持”的插件。 var lessons = []; var lessonsinfo = {}; var sections = []; var isTrain = false; var taskID = 0; var initID = ''; var hasExam = []; var hasError = []; var currentSection = ''; var studying = {}; var count = 0; var listenerId = null var urls = { 'normal':'https://kc.zhixueyun.com/#/study/course/detail/11&$id$/6/1', 'course':'https://kc.zhixueyun.com/#/study/course/detail/11&$id$/5/1'} var isCourse = window.location.href.match("/study/course/detail/|/study/course/out-detail/") //是否学习页 function checkStatus(){ setTimeout(function () { let r = GM_getValue("g.r:" + window.location.href.slice(-40,-4), 0); if ( r != taskID ) window.close(); //学习任务页与控制页失联,有新的页面打开,关闭本任务页。 let requires = $('.chapter-list-box.required[data-sectiontype!=9]:not(:contains("重新学习"))'); if(requires.length==0){ GM_sendMessage('remain.true.to.our.original.aspiration', window.location.href.slice(-40,-4),"finished with exam is "+ ($('.chapter-list-box.required[data-sectiontype=9]').length>0)); GM_deleteValue("g.r:" + window.location.href.slice(-40,-4)); window.close(); }else{ if(requires.length>0) { requires[0].click(); } if(!document.title.endsWith('🟩')) document.title += '🟩'; GM_sendMessage('remain.true.to.our.original.aspiration', window.location.href.slice(-40,-4),"studying " + $('dl.chapter-list-box.required.focus').find('span.progress').text()); autoPlay(); checkStatus(); } }, 17000); } function autoPlay() { if($('video').length>0) { if ($('video')[0].onpause === null) { $('video')[0].onpause = function() { $('video').muted = true; $('video')[0].play(); }; } $('video')[0].muted = true; $('video')[0].play(); } } function clearLostTasks() { const keys = GM_listValues(); let nt = Date.now(); for(let k in keys) { if (keys[k].startsWith('g.r:')) { let id = GM_getValue(keys[k], nt); if((nt - id) > 43200000) GM_deleteValue(keys[k]); } } } if( !isCourse ) { let r = sessionStorage.getItem(window.location.href.slice(-36)); if (r) { let rhtml = JSON.parse(r); $(rhtml).appendTo("body"); sessionStorage.removeItem(window.location.href.slice(-36)); } else { GM_deleteValue('remain.true.to.our.original.aspiration'); clearLostTasks(); $(`
`).appendTo("body"); //课程列表页,增加学习按钮 } } else { //let r = sessionStorage.getItem(window.location.href.slice(-40,-4)); let r = GM_getValue("g.r:" + window.location.href.slice(-40,-4), 0); if (r) { //GM_deleteValue(window.location.href.slice(-40,-4)); taskID = r; } else { console.log('非自动学习打开的页面不处理。'); return; } //非自动学习打开的页面不处理。 initID = window.location.href.slice(-40,-4); setTimeout(function () { if( !window.location.href.match(initID)) { //资源不存在 GM_sendMessage('remain.true.to.our.original.aspiration', initID,"finished with error"); window.close(); } else { let id = Object.keys(unsafeWindow.app._modules).find(value => value.startsWith('study/course/detail--')); unsafeWindow.app._modules[id].store.models.course.data.courseChapters.forEach(function(Chapter){ if(Chapter.learnSequence) Chapter.learnSequence = null; }); //去除章节顺序限制 if($('.chapter-list-box.required[data-sectiontype!=9]:not(:contains("重新学习"))').length>0) { $('.chapter-list-box.required[data-sectiontype!=9]:not(:contains("重新学习"))')[0].click(); } document.title += '🟩'; autoPlay(); checkStatus(); } }, 5000) } $("#wsView").click(function () { if($('#progress').is(':hidden')){ $("#progress").show(); $("#wsView").text('查看详细情况▲'); }else{ $("#progress").hide(); $("#wsView").text('查看详细情况▼'); } }); function GM_onMessage(label, callback) { listenerId = GM_addValueChangeListener(label, function() { callback.apply(undefined, arguments[2]); }); } function GM_sendMessage(label) { GM_setValue(label, Array.from(arguments).slice(1)); } function studyFinised() { if(lessonsinfo == null) return; let resultStr = '所有课程学习完成!' let url = ''; if(isTrain) { url = urls['course']; } else { url = urls['normal']; } let ul = ''; if (hasError.length>0) { resultStr += '部分课程资源不存在!'; hasError.forEach(function(id){ ul += `