Greasy Fork is available in English.
智慧职教自动刷课,点击进入课程首页自动开始(播放视频第一次手动静音),可结合浏览器倍数插件一起使用(最好别超过1.5倍速)
当前为
// ==UserScript==
// @name 职教云|智慧职教助手
// @namespace http://tampermonkey.net/
// @version 0.3.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
// ==/UserScript==
/**
* studyList 所有学习模块
* moduleList 未完成模块
* contentList 一个模块中的内容list
*/
class ZhiJaoCloud{
studyList = [];
moduleList= [];
contentList= [];
//构造函数
constructor() {
this.getStudyList();
}
//找到元素
getStudyList(){
//没有过滤的学习列表
let studyList = document.getElementById("process_container");
//过滤之后的所有学习列表
this.studyList = studyList.getElementsByClassName("moduleList");
}
//判断模块是否完成100%
isFinish(module){
//获取每一个模块的进度条
let bar = module.getElementsByTagName("div");
//100%完成度返回true
if (" 100% " === (bar[2].innerHTML)){
return true;
}
return false;
}
//打开列表框(未完成的才打开,并添加到module未完成模块中去)
openList(){
for (let i=0;i<this.studyList.length;i++){
//返回false在取反才打开(未完成)
if (!this.isFinish(this.studyList[i])){
//将未完成的模块添加到moduleList中
this.moduleList.push(this.studyList[i]);
let status = this.studyList[i].getElementsByClassName("topic_container")[0].style.display;
//console.log("可见状态为:"+status);
//没有展开才展开(状态不可见)
if ("block"!==status){
//点击模块的三角箭头,【展开模块目录】
this.studyList[i].getElementsByTagName("span")[1].click();
//只点击一个
break;
}
}
}
}
//展开进度
openSection(module){
console.log("模块为:")
console.log(module)
let content;
try{
content = module.getElementsByClassName("topic_container")[0];
}catch (e){
console.log("模块打开错误异常调试");
console.log(this.moduleList)
console.log(module);
console.log(content);
}
//模块的下一级目录(table,为了使后面的内容能够点击)
let trList = content.getElementsByTagName("tr");
for (let i = 2; i < trList.length; i++) {
if (i%2===1){
//console.log(trList[i])
this.contentList.push(trList[i]);
}
}
this.loop(module);
}
loop(module){
for (let i = 0; i < this.contentList.length; i++) {
console.log("loop")
//点击展开任务目录
this.contentList[i].click();
this.start(module);
}
}
start(module){
//一个模块的所有章节
let section_all = module.getElementsByClassName("topic_container")[0];
//章节目录(需要上面点击之后才能显示(block))()所有章节的div列表
let divList = section_all.getElementsByClassName("sh-toc-list");
//延时,等待dom加载
sleep(2000).then(() => {
for (let i = 0; i < divList.length; i++) {
let flog = false;
let div = divList[i].getElementsByClassName("sh-res-h am-margin-top-xs");
for (let i = 0; i < div.length; i++) {
//有a标签才是内容,不然有可能是文件夹
if (div[i].getElementsByTagName("a").length!==0){
//最小可点击单位(学习内容)
//console.log(div[i])
let span = div[i].getElementsByTagName("span")[0]; //获取不到title
//span是内容标签的第一个
//console.log(span)
console.log("学习进度:"+span.title);
if (span.title!=="100%" && span.title!==undefined && span.title!==""){
//点击进入观看页面
div[i].click();
//本页面结束
this.end();
flog = true;
break;
}
}
}
if (flog){
console.log("flog")
break;
}
}
})
}
end(){
sleep(3000).then(() => {
debugger;
})
}
//入口
main(){
this.openList();
console.log("open")
//延迟,等待模块列表加载
sleep(1000).then(() => {
console.log("sleep")
this.openSection(this.moduleList[0]); // 只打开第一个模块的列表
})
}
}
class Look {
//视频进度
schedule = "0";
//处理学习时候的上次学习提示
Hint(){
let link = document.getElementsByClassName("link");
if (link.length===0){
//没有弹出提示
console.log("2.hint");
return;
}
//点击本次的学习记录
link[1].getElementsByTagName("a")[0].click();
}
//控制器(对于ppt,文档,视频做出不同的操作)
controller(){
//文档
if (document.getElementsByClassName("swiper-pagination-current")[0]){
console.log("当前观看的为文档");
return 0;
}else if(document.getElementsByClassName("stage-next-btn")[0]){
console.log("当前观看的为ppt");
return 1;
}else if(document.getElementsByClassName("MPreview-arrowBottom")[0]){ //另一种ppt
console.log("当前观看的为ppt(无特效)");
return 2;
}else if (typeof(this.getSchedule())!=="error"){
console.log("当前观看的为视频");
return 3;
}else {
console.log("出错")
}
}
//控制器之后执行
execute(status){
switch (status) {
case 0: //文档
this.clickNext(this.getClickNum()); break;
case 1: //ppt
this.ppt(); break;
case 2: //ppt(没有特效)
this.ppt_(); break;
case 3: //视频
setInterval(this.video,1000); break;
default:
console.log("出错1")
}
}
//处理视频
video(){
this.schedule = getSchedule();
if(this.schedule!=="100%" ){
console.log("观看进度:"+getSchedule())
except();
/*//视频未播放(鼠标移动到视频中点击中心,播放)
if (this.schedule===this.schedule) {
/!*
//能进条件,但是不能播放视频 !!!!!!!!!!
let video = $(".jw-video");
video.mouseover();
video.click();
this.schedule = "0";*!/
//(视频未播放直接返回课程首页)
this.backUp();
}*/
}else {
backUp();
}
}
//处理ppt
ppt() {
for (let i = 1; i <= 100; i++) {
sleep(70*i).then(() => {
let next = document.getElementsByClassName("stage-next-btn")[0];
console.log("点击"+i);
next.click();
})
}
console.log("等待")
//等待一分钟
sleep(60000).then(() => {
console.log("开始")
this.backUp();
})
}
//处理没有特效的ppt
ppt_(){
for (let i = 1; i <= 100; i++) {
let next = document.getElementsByClassName("MPreview-arrowBottom")[0];
console.log("点击"+i);
next.click();
}
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();
}
//=========================================================(main)============================================================
//包含字符串(是课程首页)
let url = 'https://zjy2.icve.com.cn/study/process/process.html?'
if (document.URL.indexOf(url)!==-1){
console.log("开始等待目录加载")
//首页需要加载完毕之后执行(使用onload有问题)
sleep(5000).then(()=>{
console.log("load完毕")
//创建脚本对象,调用main方法
let cloud = new ZhiJaoCloud();
cloud.main();
})
}else{
console.log("开始等待")
sleep(5000).then(()=>{
console.clear();
console.log("开始执行")
//观看视频或者图片
let look = new Look();
look.main();
})
console.log("结束")
}