EneteduAssistant-教师网培中心2X速

Automate course learning on enetedu.com

目前為 2025-01-03 提交的版本,檢視 最新版本

// ==UserScript==
// @name         EneteduAssistant-教师网培中心2X速
// @namespace    http://tampermonkey.net/
// @version      1.0
// @license      MIT
// @description  Automate course learning on enetedu.com
// @author       KKG&DS
// @match        https://onlinenew.enetedu.com/gtcfla/MyTrainCourse/OnlineCourse*
// @match        https://onlinenew.enetedu.com/gtcfla/MyTrainCourse/ChoiceCourse*
// @match        https://onlinenew.enetedu.com/*/MyTrainCourse/ChoiceCourse*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

(function () {
    'use strict';
    const SCRIPT_VERSION = '1.0'; // 脚本版本
    let volumeLevel = 0.1; // 音量为 10%
    let playbackRate = 2.0; // 播放速率为 2 倍

    // 添加状态栏
    GM_addStyle(`
        #eneteduHelperStatus {
            position: fixed;
            top: 10px;
            right: 10px;
            background: rgba(0, 0, 0, 0.6);
            color: white;
            padding: 10px;
            border-radius: 5px;
            font-family: Arial, sans-serif;
            font-size: 14px;
            z-index: 10000;
            display: block;
        }
    `);

    // 模拟桌面端用户代理
    Object.defineProperty(navigator, 'userAgent', {
        value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        configurable: true
    });

    // 禁用设备检测函数
    window.goPAGE = function () {};

    // 页面加载完成后初始化
    window.addEventListener('load', () => {
        let statusDiv = document.createElement('div');
        statusDiv.id = 'eneteduHelperStatus';
        document.body.appendChild(statusDiv);
        updateStatus(`脚本已加载 (v${SCRIPT_VERSION})`);
        startVideoControl();
    });

    // 更新状态栏
    function updateStatus(message) {
        let statusDiv = document.getElementById('eneteduHelperStatus');
        if (statusDiv) {
            statusDiv.textContent = `EneteduHelper v${SCRIPT_VERSION}: ${message}`;
        }
    }

    // 开始视频控制
    function startVideoControl() {
        let playerCheckInterval = setInterval(() => {
            let player = getVideoPlayer();
            if (player) {
                clearInterval(playerCheckInterval);
                handleVideo(player);
                startProgressMonitor(player);
                startPlaybackMonitor(player);
                startPopupMonitor();
            } else {
                updateStatus('等待视频播放器...');
            }
        }, 1000);
    }

    // 获取视频播放器
    function getVideoPlayer() {
        let iframe = document.querySelector('iframe');
        if (iframe) {
            try {
                let iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
                let player = iframeDocument.querySelector('video');
                if (player) {
                    return player;
                }
            } catch (error) {
                updateStatus('无法访问 iframe 内容(跨域限制)');
                return null;
            }
        }
        return null;
    }

    // 处理视频播放
    function handleVideo(player) {
        // 设置视频音量为 10%
        if (player.volume !== undefined) {
            player.volume = volumeLevel;
            updateStatus(`音量设置为 ${volumeLevel * 100}%`);
        }

        // 设置视频播放速率为 2 倍
        if (player.playbackRate !== undefined) {
            player.playbackRate = playbackRate;
            updateStatus(`播放速率设置为 ${playbackRate} 倍`);
        }

        // 确保视频静音并播放
        if (player.muted !== undefined) {
            player.muted = true;
        }
        if (player.paused) {
            player.play();
            updateStatus('视频正在播放');
        }

        // 定期保存播放进度
        setInterval(() => {
            if (player.currentTime !== undefined && player.duration !== undefined) {
                let currentTime = player.currentTime;
                let duration = player.duration;
                let progress = (currentTime / duration) * 100;

                // 避免拖拽进度条
                if (Math.abs(currentTime - player.currentTime) > 1) {
                    player.currentTime = currentTime;
                    updateStatus('检测到拖拽进度条,已恢复');
                }

                GM_setValue('lastPlaybackTime', currentTime);
                updateStatus(`播放中,音量:${volumeLevel * 100}%,进度:${progress.toFixed(2)}%`);
            }
        }, 5000);
    }

    // 监控课程进度
    function startProgressMonitor(player) {
        setInterval(() => {
            if (player && player.currentTime !== undefined && player.duration !== undefined) {
                let progress = (player.currentTime / player.duration) * 100;
                if (progress >= 100) {
                    playNextCourse();
                }
            }
        }, 1000);
    }

    // 监控视频播放状态
    function startPlaybackMonitor(player) {
        setInterval(() => {
            if (player.paused) {
                player.play();
                updateStatus('视频已暂停,恢复播放');
            }
        }, 1000);
    }

    // 监控弹窗
    function startPopupMonitor() {
        setInterval(() => {
            let popup = document.querySelector('.layui-layer-page');
            if (popup) {
                let confirmButton = popup.querySelector('.layui-layer-btn0');
                if (confirmButton) {
                    confirmButton.click();
                    updateStatus('检测到弹窗,已确认');
                } else {
                    updateStatus('检测到弹窗,但未找到确认按钮');
                }

                // 恢复视频播放
                let player = getVideoPlayer();
                if (player && player.paused) {
                    player.play();
                    updateStatus('弹窗出现,恢复视频播放');
                }
            }
        }, 1000);
    }

    // 播放下一个课程
    function playNextCourse() {
        let courseItems = document.querySelectorAll('.classcenter-chapter2 ul li');
        let currentCourseIndex = -1;

        // 查找当前正在播放的章节
        courseItems.forEach((item, index) => {
            if (item.style.backgroundColor === 'rgb(204, 197, 197)') { // 当前章节的背景色
                currentCourseIndex = index;
            }
        });

        if (currentCourseIndex !== -1 && currentCourseIndex < courseItems.length - 1) {
            // 查找下一个未完成的章节
            for (let i = currentCourseIndex + 1; i < courseItems.length; i++) {
                let progressText = courseItems[i].querySelector('span').innerText.trim();
                if (progressText !== '[100%]') {
                    // 获取章节的跳转链接
                    let nextCourseLink = courseItems[i].getAttribute('onclick');
                    if (nextCourseLink) {
                        // 提取链接地址
                        let match = nextCourseLink.match(/location\.href='([^']+)'/);
                        if (match && match[1]) {
                            // 跳转到下一个章节
                            window.location.href = match[1];
                            updateStatus('开始下一个课程');
                            return;
                        }
                    }
                }
            }
        }

        // 如果所有章节都已完成,返回上一页
        updateStatus('所有课程已完成,返回上一页');
        window.history.back();
    }
})();