// ==UserScript== // @name 职教云|智慧职教助手 // @namespace http://tampermonkey.net/ // @version 0.5.beta // @description 智慧职教自动刷课,点击进入课程首页自动开始(播放视频第一次手动静音),可结合浏览器倍数插件一起使用(最好别超过1.5倍速) // @author maple // @match https://zjy2.icve.com.cn/study/process/process.html* // @match https://zjy2.icve.com.cn/common/directory/directory.html* // @icon https://zjy2.icve.com.cn/common/images/logo.png // @grant none // @downloadURL none // ==/UserScript== //需要排除内容的列表 exclude_array = [ ]; //未完成的模块数组 undoneModule = []; //结束变量 let stop; //包含章节的tr列表长度 let trList_len; //模块下所有内容的数量 let contentList_num; //模块指针 point = 0; //是否下一个模块 let next = false; //课程首页的网址 let url = 'https://zjy2.icve.com.cn/study/process/process.html?' //判断是课程首页还是学习页面 if (document.URL.indexOf(url)!==-1) { //课程首页 console.log("dir-begin"); deleteCookie(); stop = setInterval(main, 2000); }else { sleep(5000).then(()=>{ console.clear(); //学习页面(观看视频或者图片) console.log("study-begin"); let look = new Look(); look.main(); }) } function main() { try{ //数组中有数据就不需要获取数组 if (undoneModule.length===0){ findUndoneModule(); } console.log("当前模块索引:"+point) openModule(undoneModule[point]); openSection(undoneModule[point]); clickContent(undoneModule[point]); }catch (e) { console.log("错误信息:"+e); //stop = setInterval(main, 5000); } next_module(); } //找到所有未完成模块 function findUndoneModule() { //包含所有模块的div(里面还有别的标签) let div = document.getElementById("process_container"); //过滤之后的所有模块[列表] let moduleList = div.getElementsByClassName("moduleList"); //遍历模块数组 for (let i = 0; i < moduleList.length; i++) { //找到每个模块的进度div let schedule = moduleList[i].getElementsByTagName("div")[2]; //进度不为100%就添加到未完成 if (" 100% " !== schedule.innerHTML){ //添加未完成模块到数组 undoneModule.push(moduleList[i]); } } console.log("所有模块数组:"+undoneModule) } //展开模块 function openModule(m1) { //模块展开状态 let status = m1.getElementsByClassName("topic_container")[0].style.display; //状态不可见,展开模块 if ("block"!==status){ //点击模块的三角箭头,【展开模块目录】 m1.getElementsByTagName("span")[1].click(); } } //展开模块下的章节 function openSection(m) { //包含模块下所有章节的div let div = m.getElementsByClassName("topic_container")[0]; //包含章节的tr列表 let trList = div.getElementsByTagName("tr"); //等待才能获取到tr列表的长度 if (trList_len===undefined || trList_len===0){ trList_len = trList.length; } console.log("trList长度:"+trList_len) //为零就等待下一次获取 //前面有3个无效tr,不是章节(从索引为3的开始取) for (let i = 2; i < trList.length; i++) { if (i%2===1){ //这个里面所有的都是有效章节 每一个为trList[i] //未打开才展开【未展开是有这个元素】 let openStatus = m.getElementsByClassName("am-icon sh-toc-expand topic_condensation am-icon-caret-right")[0]; if (openStatus!==undefined){ trList[i].click(); //展开模块中的每一个章节 } //console.log(trList[i]) } } } //点击章节中的内容(ppt,视频...) function clickContent(m) { //包含所有内容的div [一个模块下所有的,不含不同章节的内容] let contentDiv = m.getElementsByClassName("sh-toc-list"); if (contentList_num===undefined || contentList_num===0){ contentList_num = contentDiv.length; }else { console.log("div长度::"+contentList_num); //clearInterval(stop) } for (let i = 0; i < contentList_num; i++) { let contentList = contentDiv[i]; //模块中某一个章节的所有内容 //console.log(contentList); //如果输出的内容下没有子标签,那么这个章节中没有内容(直接下一个模块) //判断章节是否为空 [空返回true] if (isEmptySection(contentList) && point===0){ next = true; continue; } //一个章节中的所有模块 let contentS = contentList.getElementsByClassName("sh-res-h am-margin-top-xs"); //console.log(contentS) for (let j = 0; j < contentS.length; j++) { //最小单位 内容 let content = contentS[j]; //console.log(content) //有a标签才是内容,不然有可能是文件夹 if (content.getElementsByTagName("a").length!==0){ //内容中的span标签,用来获取这个内容的进度 let span = content.getElementsByTagName("span")[0]; //学习进度不是100%就点击 if (span.title!=="100%" && span.title!==undefined && span.title!==""){ //console.log("未完成:") //console.log("学习进度:"+span.title); //console.log(content); //排除异常的内容(数组中的自定义) exclude(content); }else if (i===contentS.length-1 && span.title ==="100%"){ //模块中的所有内容都已完成 【只是模块进度还没刷新,打开了这个模块】 next = true; //下一个模块 } } } } } //判断一个章节是否为空 function isEmptySection(contentList) { //子节点个数(为1就是章节为空[有一个text子标签]) let childNodeNum = contentList.childNodes.length; //console.log("子节点的个数:"+childNodeNum); if (childNodeNum<=1){ //为空返回true return true; }else { return false; } } //排除异常的内容(并点击) function exclude(content) { //内容下包含[标题]的a标签(取出innerHtml就是title) let title = content.getElementsByTagName("a")[0].innerHTML; //包含在数组中的就排除 if (exclude_array.indexOf(title)>=0){ console.log("排除的内容title: "+title) return; } console.log('------------') console.log("未完成内容:点击观看 "+title) console.log('------------') //获取内容类型 currentContentType(content); //不包含就点击,并结束下面的 content.click(); next = true; clearInterval(stop); } //获取当前内容类型(设置cookie) function currentContentType(content) { let type = content.getElementsByTagName("span")[1].innerHTML.trim(); console.log(type) document.cookie = "contentType="+type+";path=/"; } //如果上面结束了,开始下一个模块 function next_module() { if (next){ point++; //重置 trList_len = undefined; contentList_num = undefined; next = false; } //停止 if (point>=30){ clearInterval(stop) } } //获取对应的cookie function getCookie(name){ let arr = document.cookie.split(";"); for(let i = 0;i { //图片下一张按钮 let next = document.getElementsByClassName("stage-next-btn")[0]; console.log("点击:"+i); next.click(); }) } console.log("等待") //等待一分钟 sleep(60000).then(() => { console.log("开始") debugger; this.backUp(); }) } //处理没有特效的ppt ppt_(){ let imgNum_ = null for (let i = 1; i <= 200; i++) { let next = document.getElementsByClassName("MPreview-arrowBottom")[0]; //获取当前的图片数 let imgNum = document.getElementsByName("newlyPicNum")[0].value; console.log("点击"+i); next.click(); //点击之后如果等于点击之前,就说明刷完了 (break) if (imgNum_===imgNum){ console.log("ppt_break") break; }else imgNum_ = imgNum } console.log("等待") //等待一分钟 sleep(60000).then(() => { console.log("开始") this.backUp(); }) } //获取视频进度 getSchedule(){ try { let bar = document.querySelector(".jw-progress"); return bar.style.width; }catch (e){ return "error"; } } //获取需要点击多少次图片(处理文档) getClickNum(){ //当前图片页数 let current = document.getElementsByClassName("swiper-pagination-current")[0].innerHTML; //所有图片页数 let all = document.getElementsByClassName("swiper-pagination-total")[0].innerHTML; console.log("需要点击"+(all-current+1)+"次") //返回点击次数 return all-current+1; } //点击下一张图片(处理文档) clickNext(num){ console.log("4.num") let div = document.getElementsByClassName("swiper-button-next"); for (let i = 1; i <= num+1; i++) { sleep(2000*i).then(() => { console.log("5.click"); div[0].click(); if (i===num+1){ this.backUp(); } }) } } //点击后退,返回课程首页 backUp(){ let back = document.getElementsByClassName("np-menu-nav-li")[0]; back.getElementsByTagName("a")[0].click(); } main(){ console.log("--1.Look main") this.Hint(); //控制器 let status = this.controller(); this.execute(status); } } //延时函数 function sleep (time) { return new Promise((resolve) => setTimeout(resolve, time)); } //获取视频进度 function getSchedule(){ try { let bar = document.querySelector(".jw-progress"); return bar.style.width; }catch (e){ return "error"; } } //学习异常弹窗 function except(){ //找到异常按钮a标签 let a = document.getElementsByClassName("sgBtn ok")[0]; //异常按钮存在就点击 if (a !== undefined && a !== null){ console.log(a); a.click(); }else{ //console.log("无异常") } } //点击后退,返回课程首页 function backUp(){ let back = document.getElementsByClassName("np-menu-nav-li")[0]; back.getElementsByTagName("a")[0].click(); }