职教云|智慧职教助手

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

目前為 2021-09-11 提交的版本,檢視 最新版本

// ==UserScript==
// @name         职教云|智慧职教助手
// @namespace    http://tampermonkey.net/
// @version      0.1.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 未完成模块
 */
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])){
                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){
        let content = module.getElementsByClassName("topic_container")[0];
        //模块的下一级目录(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!==""){
                            console.log("符合的标签:")
                            console.log(div[i])
                            //点击进入观看页面
                            div[i].click();
                            //本页面结束
                            this.end();
                            flog = true;
                            break;
                        }
                    }

                }
                if (flog){
                    console.log("flog")
                    break;
                }

            }

        })
    }


    end(){
        sleep(3000).then(() => {
            debugger;
        })
    }

    //入口
    main(){
        this.openList();

        //延迟,等待模块列表加载
        sleep(1000).then(() => {
            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())

            /*//视频未播放(鼠标移动到视频中点击中心,播放)
            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(50*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 backUp(){
    let back = document.getElementsByClassName("np-menu-nav-li")[0];
    back.getElementsByTagName("a")[0].click();
}


//=====================================================================================================================

//包含字符串(是课程首页)
let url = 'https://zjy2.icve.com.cn/study/process/process.html?'
if (document.URL.indexOf(url)!==-1){
    //首页需要加载完毕之后执行
    window.onload = function() {
        //创建脚本对象,调用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("结束")

}