智慧树刷课脚本

前言

网课的真正意义在于,让大学生学会磨刀不误砍柴工的道理,以及让我的博客又多了一篇水文。 ———— injahow
:huaji2: :huaji:
脚本已上传至https://gist.github.comhttps://greasyfork.org,博客里也暂时留个备份。

成绩分布

没什么需要注意的,就是学习习惯这一项的成绩,需要在12天里持续学习25分钟以上,不过总分里面好像没有这一项的分数。
29.1.png
29.2.png

视频播放

这里通过两个事件按钮的id,playButton和nextBtn获取播放器控件对象,执行click模拟点击。
29.4.png

视频速度

获取速度选择器控件,修改传递的速度参数后,模拟点击,脚本设置的速度参数默认值是15,可根据情况或需求自行更改。
29.3.png
29.5.png

视频音量

原理同上,模拟点击,设置静音。
29.6.png

目录列表

获取到全部视频目录后,根据当前播放的视频的条目代码的差异,不难发现current_play为当前视频关键class。然后可以获取到当前播放的视频的学习进度等相关信息。不过麻烦的是,通过class判断会出现问题,因为视频学习进度的class是会自动隐藏的,学习进度未完成与完成后的class是不同的。这里我采取的是暴力查找的脚本方案(找不到class就报错跳过),其实我也不知道怎么处理比较好,总之跑起来是没问题的。大概。。。 :huaji22:
29.7.png

题目列表

这里直接查询选项的class后,使用第一个查询结果[0],即第一个选项A,然后模拟点击返回按钮。
29.8.png

代码及演示

脚本里面多次设置延时,是考虑到网页的加载速度有差异,可根据不同情况进行适当修改。还有就是播放下一个视频后,脚本会失效,这里偷个懒直接刷新页面进行脚本重载(刚开始用的递归处理,不知道会不会影响性能,暂且用傻瓜方案吧。)若需要使用脚本,浏览器安装了油猴插件的话,跳转到gist直接打开Raw,插件会自动识别并安装,或者到https://greasyfork.org下载安装。

注意:此版本0.1.2存在播放下一个视频出错的BUG,请查看更高版本!
// ==UserScript==
// @name         智慧树自动刷网课
// @namespace    https://github.com/injahow
// @version      0.1.2
// @description  智慧树自动刷网课脚本,自动答题、检查学习进度,支持调速默认15倍速
// @author       injahow
// @match        *://studyh5.zhihuishu.com/*
// @license      MIT
// @grant        none
// ==/UserScript==

setTimeout(function() {

    'use strict';
    var videoLists = document.getElementsByClassName('el-scrollbar__view')[0];//0一定是目录
    var current_play_video = videoLists.getElementsByClassName('current_play')[0];//当前播放的视频单元
    var playVideo = document.getElementById('playButton');
    var nextVideo = document.getElementById('nextBtn');
    var volume = document.getElementsByClassName('volumeIcon')[0];

    console.log('injahow:视频静音!');
    volume.click();

    var speedTab = document.getElementsByClassName('speedTab speedTab15')[0];
    speedTab.id = 'mySpeedTab';
    var setSpeed = document.getElementById('mySpeedTab');
    /**设置15倍速,如果报错请适当调低*/
    setSpeed.setAttribute("rate", "15");//设置速度为15
    setSpeed.click();
    //playVideo.click();

    var myPlayer = document.getElementById('vjs_container_html5_api')
    console.log('injahow:播放器信息:', myPlayer);

    myPlayer.onplay = function(){//视频播放监听
        console.log('injahow:视频开始播放!');

    };

    setInterval(function(){//间隔10000ms执行检查
        console.log('injahow:播放记录检查!');
        //console.log('injahow:当前视频信息:', current_play_video);
        let progress_num = current_play_video.className.indexOf('time_icofinish');
        let time_finish = current_play_video.getElementsByClassName('time_icofinish')[0];//当前播放的视频单元
        //console.log('injahow:当前time_finish:', time_finish);
        if(typeof(time_finish.hidden) == "undefined"){//报错忽略...
            //console.log('injahow:学习ing...');
        } else {
            console.log('injahow:学习完毕!');
            nextVideo.click();
            console.log('injahow:准备重载脚本!');
            //刷新页面,重载脚本
            setTimeout(function(){
                location.reload();
            },3000);
        }
    },10000);

    myPlayer.onpause = function(){//视频暂停监听
        console.log('injahow:视频已暂停!');
        //case 1.弹出题目窗口
        //case 2.用户或其他触发视频暂停
        //case 3.视频播放完毕
        //3.1.学习完,3.2.学习未完
        setTimeout(function(){
            console.log('injahow:继续播放!');
            playVideo.click();
        },5000);

        let tm = document.getElementsByClassName("el-scrollbar__view")[1];//1-可能不是题目,报错不影响
        //console.log(tm);
        let tm_opt_a = tm.getElementsByClassName("topic-item")[0];//当前题目选项
        tm_opt_a.click();//这里只选择第一个选项,无论对错不影响

        setTimeout(function(){
            console.log('injahow:关闭弹窗!');
            let btn6 = document.getElementsByClassName('btn')[6];
            console.log(btn6);
            btn6.click();
        },3000);

        /*
        let progress_num = current_play_video.getElementsByClassName('progress-num')[0].innerText;//当前的学习进度
        if(progress_num !== ''){//报错不影响
            console.log('injahow:学习进度未完,继续播放拖延时间!');
        }*/

    };

},3000);

29.9.gif

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注