Greasy Fork

Greasy Fork is available in English.

职教云|智慧职教助手

智慧职教自动刷课,点击进入课程首页自动开始(播放视频第一次手动静音),可结合浏览器倍数插件一起使用(最好别超过1.5倍速)

当前为 2021-09-16 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         职教云|智慧职教助手
// @namespace    http://tampermonkey.net/
// @version      0.4.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 <= 350; i++) {
            sleep(20*i).then(() => {
                //图片下一张按钮
                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();
}




//=========================================================(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("结束")

}