21tb自用

21tb的自动挂机,未实现全自动学习。手动选择课程后,课程内的每小节会自动下一节学习。注意:1、域名的主机名要注意是否相同,账号不同,对应的页面不同,不能保证所有通用,注意URL的路径匹配,自行修改,目前我接触的有两种学习界面;2、因为21tb的视频使用了iframe,所以将脚本设置“仅在顶层页面(框架)运行”选择“是”,以免重复启用。

当前为 2023-10-21 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         21tb自用
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  21tb的自动挂机,未实现全自动学习。手动选择课程后,课程内的每小节会自动下一节学习。注意:1、域名的主机名要注意是否相同,账号不同,对应的页面不同,不能保证所有通用,注意URL的路径匹配,自行修改,目前我接触的有两种学习界面;2、因为21tb的视频使用了iframe,所以将脚本设置“仅在顶层页面(框架)运行”选择“是”,以免重复启用。
// @author       You
// @match        https://*.21tb.com/els/html/courseStudyItem/courseStudyItem.learn.do*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=21tb.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    var interval=30 //间隔时间,秒,必须正整数
    var courseList=[] //所有课程
    var watchVideo //视频任务
    console.log("已启动")

    var domain=document.domain
    var url=window.location.pathname
    //时间设置有误,默认为30秒
    if(!(Number.isInteger(interval)&&interval>0))
    {
        interval=30
    }
    if(url=='/els/html/courseStudyItem/courseStudyItem.learn.do')
    {
        setTimeout(function(){
            if(document.querySelector('#courseItemId'))
            {
                console.log("1号方案")
                startWatch()
            }
            else if(document.querySelector('#aliPlayerFrame'))
            {
                console.log("2号方案")
                startWatch2()
            }
        },10000);
    }


    function startWatch2()
    {
      courseList= document.getElementsByClassName("url-course-content")[0].contentWindow.document.querySelectorAll('.section-item:not(.finish)')
      console.log("还有有"+ courseList.length +"节课")
        checkVideo2()
        watchVideo=setInterval(checkVideo2,interval*1000)
    }

function checkVideo2()
    {
        console.log("正在检测视频——2")
        //Iframe的document
        var frameDocument=document.querySelector('#aliPlayerFrame').contentDocument
        //判断是否有正在学习的节点
        if(frameDocument.querySelector('.first-line.active'))
        {
            //如果有,判断该节点是否是已完成
            if(frameDocument.querySelector('.first-line.active').parentNode.classList.contains('finish'))
            {
                //有找到未完成的课程
                if(frameDocument.querySelector('.section-item:not(.finish)'))
                {
                    frameDocument.querySelector('.section-item:not(.finish)').click()
                    return
                }
                else//没有找到未完成的课程
                {
                    //关闭定时器
                    clearInterval(watchVideo)
                    return
                }

            }
            else{//未完成,判断视频是否暂停状态
                console.log('检测视频是否暂停状态--2--暂停',frameDocument.querySelector('video').paused)

                if(frameDocument.querySelector('video').paused)
                {
                   frameDocument.querySelector('video').play()
                }
                return
            }
        } else//如果没有正在学习的节点
        {
                //有找到未完成的课程
                if(frameDocument.querySelector('.section-item:not(.finish)'))
                {
                    frameDocument.querySelector('.section-item:not(.finish)').click()
                    return
                }
                else//没有找到未完成的课程
                {
                    //关闭定时器
                    clearInterval(watchVideo)
                    return
                }
        }



    }





    function startWatch()
    {
        console.log("已加载")
        courseList=document.querySelector('#courseItemId').querySelectorAll('.cl-catalog-item-sub')
        console.log("共有"+ courseList.length +"节课")

        checkVideo()

         console.log("开启定时器")
        //开启定时器,循环检测
       watchVideo=setInterval(checkVideo,interval*1000)
    }

        function checkVideo(){
            console.log("正在检测视频——1")
            //检测是否有正在播放的视频
            if(document.querySelector('a.cl-catalog-playing'))
            {
                //已完成
                if(document.querySelector('a.cl-catalog-playing').classList.contains('item-done'))
                {
                    //如果存在未完成的视频
                    if(document.querySelector('a.item-no'))
                    {
                        //点击第一个未完成的视频
                        document.querySelector('a.item-no').click()
                        console.log('正在播放“'+document.querySelector('a.item-no').title+"”")
                        return
                    }
                    //如果不存在未完成的视频,说明视频已经播放完毕。结束计时器
                    clearInterval(watchVideo)
                }
                else{//未播放完成
                    if(document.querySelector('iframe#iframe_aliplayer').contentDocument.querySelector('video').paused)
                    {
                        document.querySelector('iframe#iframe_aliplayer').contentDocument.querySelector('video').play()
                    }
                    return
                }
            }else{//没有正在播放的视频
                //如果存在未完成的视频
                if(document.querySelector('a.item-no'))
                {
                    //点击第一个未完成的视频
                    document.querySelector('a.item-no').click()
                     console.log('正在播放“'+document.querySelector('a.item-no').title+"”")
                    return
                }
                //如果不存在未完成的视频,说明视频已经播放完毕。结束计时器
                clearInterval(watchVideo)
            }
        }

    // Your code here...
})();