出了啥问题?
可以发现,学习公社里面的设置课程的目的是为了大家学习。成年人的学习本身就是一个主动的事情,要求成年人必须学习,成年人也可以照办,但是该网站的手段无所不用其极,因此催生出了该脚本。
首先看看学习公社的“学习手段”
视频不能加速,只能1倍速看;
视频不能快进,只能一秒一秒看;
视频不能挂机看,每20分钟会暂停,美其名曰“提醒观看者注意休息”
视频不能多开,一次只能看一个视频
账号不能多个同时登录,一次只能登一个,否则会强制下线之前登录的,目的是防止多账号登陆;
即便是使用了浏览器的隐私模式,也不能多个登陆,登陆验证功能在服务器处;
这样做的目的是,防止学习的人挂机,应付差事。
而且,课程分为必修课和选修课,每一类都需要学习1350分钟,即22.5小时,两类一共需要学45小时!
方案:
以上手段,随便用一个,都会让人感到不爽,还是让“机器人”帮忙看吧。
于是有作者发明了油猴脚本,以下就是油猴脚本的功能:
自动播放,自动刷新,自动点击20分钟提醒,一切自动化,开着之后,挂机就好。
道高一尺魔高一丈啊!
至于链接我就不发了,大家需要的话可以去搜索,以免它被封。
思考:为什么要有这种奇葩现象?
你说,为什么程序开发者要把学习公社开发成这么恶心呢?
因为甲方需要呀。
为什么甲方需要?
因为甲方的领导需要啊。
为什么甲方的领导需要呢?
因为甲方领导的领导需要啊,这是政绩啊,可不能弄虚作假。(反正又不是自己学)
那领导的领导为什么需要呢?
因为好写报告啊,这是政绩啊,得“留痕”、得“防查”、可不能弄虚作假。(反正又不是自己学)
……
那一开始为什么要开展这样的学习呢?
值得深思。
附该插件源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
// ==UserScript== // @name 学习公社/中国教育干部网络学院自动学习看视频(可提前查看试卷) // @namespace 学习公社/中国教育干部网络学院 1.0 // @version 0.62 // @description 学习公社自动看视频、自动刷新,经过测试非常好用 中国教育干部网络学院 国家教育行政学院 网络党校 // @author LZJ // @match *study.enaea.edu.cn/viewerforccvideo* // @match *study.enaea.edu.cn/circleIndexRedirect* // @grant none // @license MIT // @downloadURL https://update.greasyfork.org/scripts/445232/%E5%AD%A6%E4%B9%A0%E5%85%AC%E7%A4%BE%E4%B8%AD%E5%9B%BD%E6%95%99%E8%82%B2%E5%B9%B2%E9%83%A8%E7%BD%91%E7%BB%9C%E5%AD%A6%E9%99%A2%E8%87%AA%E5%8A%A8%E5%AD%A6%E4%B9%A0%E7%9C%8B%E8%A7%86%E9%A2%91%28%E5%8F%AF%E6%8F%90%E5%89%8D%E6%9F%A5%E7%9C%8B%E8%AF%95%E5%8D%B7%29.user.js // @updateURL https://update.greasyfork.org/scripts/445232/%E5%AD%A6%E4%B9%A0%E5%85%AC%E7%A4%BE%E4%B8%AD%E5%9B%BD%E6%95%99%E8%82%B2%E5%B9%B2%E9%83%A8%E7%BD%91%E7%BB%9C%E5%AD%A6%E9%99%A2%E8%87%AA%E5%8A%A8%E5%AD%A6%E4%B9%A0%E7%9C%8B%E8%A7%86%E9%A2%91%28%E5%8F%AF%E6%8F%90%E5%89%8D%E6%9F%A5%E7%9C%8B%E8%AF%95%E5%8D%B7%29.meta.js // ==/UserScript== function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = query.split("&"); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split("="); if (pair[0] == variable) { return pair[1]; } } return (false); } (function() { var url = window.location.pathname //视频播放页 if (url == '/viewerforccvideo.do') { //清理localStorage,以防不给加进度。 localStorage.clear(); localStorage.setItem('videoIsDone',false) //五秒后关闭声音 function Music_No() { setTimeout(function() { document.getElementsByClassName("xgplayer-icon-muted")[0].click() }, 5000) } //点击未完成的视频进行播放 function rePlay() { setTimeout(function() { if (document.getElementsByClassName("cvtb-MCK-CsCt-studyProgress")[0].innerHTML == '100%') { for (var i = 1; i < document.getElementsByClassName("cvtb-MCK-CsCt-studyProgress") .length; i++) { if (document.getElementsByClassName("cvtb-MCK-CsCt-studyProgress")[i].innerHTML != '100%') { document.getElementsByClassName("cvtb-MCK-CsCt-studyProgress")[i].click() break } } } }, 2000) } //隔五秒循环执行 setInterval(function() { //最后一个视频的index index = document.getElementsByClassName("cvtb-MCK-CsCt-studyProgress").length - 1 //查看当前课前是否完成 if (document.getElementsByClassName('current')[1].children[0].childNodes[1].innerText == '100%') { //如果最后一个视频完成了就代表全部视频都完成了 if (document.getElementsByClassName("cvtb-MCK-CsCt-studyProgress")[index].innerHTML == '100%') { //关闭网站 localStorage.setItem('videoIsDone',true) window.close() } else { //否则播放下一个未完成的视频 rePlay() } } else { console.log("正在观看:" + document.getElementsByClassName('current')[1].children[0] .getElementsByClassName("cvtb-text-ellipsis")[0].innerHTML) } //如果出现异常就刷新网页 if (document.getElementsByClassName("dialog-content")[0] != undefined) { if (document.getElementsByClassName("dialog-content")[0].innerText == '学时记录出现异常请检查网络') { location.reload() } } }, 5000) setInterval(function() { //播放视频 videoPlay() }, 1000) rePlay() Music_No() } //课程学习页 if (url == '/circleIndexRedirect.do') { function playVideo_2() { //切换到未完成的课程tab document.getElementsByClassName('customcur-tab-text')[1].click() //检测是否完成视频 if(localStorage.getItem('videoIsDone') == 'true'){ location.reload() }else{ console.log("观看视频:", document.getElementsByClassName('course-title')[0].innerText) } } //首次进入,只执行一次 function playVideo_1() { //切换到未完成的课程tab document.getElementsByClassName('customcur-tab-text')[1].click() //检测是否完成视频 if(localStorage.getItem('videoIsDone') == null){ alert('切换到课程学习页自动刷视频,请确保视频可以正常播放后在挂机,点击确定开始运行') } //循环 setTimeout(function() { //点击第一个开始学习 document.getElementsByClassName('golearn')[0].click() }, 1000) } //判断是否为试卷页面 if (getQueryVariable('type') == 'exam') { var formDdata = { "circleId": cid, "syllabusId": sid, }; $.ajax({ type: "GET", url: 'circleIndex.do?action=getMyClass', data: formDdata, async: true, beforeSend: function() { console.log('请等待...'); }, complete: function(XMLHttpRequest, status, errorThrown) { console.log('获取完成...'); }, success: function(data) { console.log('获取成功...'); console.log(data) var dataJson = eval('(' + data + ')'); console.log(dataJson.result['list'][0].id) setTimeout(function() { var styleMap = { "width": "100px", display: "inline-block", "background-color": "red", cursor: "pointer", "user-select": "none", "border-radius": "4px", color: "#fff", "font-size": "10px", "line-height": "30px", "margin": "0px 30px", }; var btn = document.createElement("a"); btn.innerHTML = "提前查看试卷"; for (let i in styleMap) { btn.style[i] = styleMap[i]; } btn.href = '/myExamAndTestRedirect.do?action=toSeeExamResult&ct=&examId=' + dataJson.result['list'][0].id var toolbox = document.getElementsByClassName("item-title")[0] toolbox.appendChild(btn); alert('请点击试卷标题旁的按钮查看试卷') }, 100) }, error: function(XMLHttpRequest, textStatus, errorThrown) { console.log('获取失败...'); } }); } else { setTimeout(function() { playVideo_1() }, 2000) setInterval(function() { playVideo_2() }, 5000) setTimeout(function() { localStorage.setItem('videoIsDone',false) location.reload() }, 1000 * 60 * 10) } } })(); |