Greasy Fork

Greasy Fork is available in English.

积极分子在线培训助手

党旗飘飘学习助手,自动刷课,跳转控制,JLU

当前为 2025-05-14 提交的版本,查看 最新版本

// ==UserScript==
// @name         积极分子在线培训助手
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  党旗飘飘学习助手,自动刷课,跳转控制,JLU
// @author       bugo
// @match        *://*/jjfz/play*
// @match        *://*/*/jjfz/play*
// @icon         data:image/png;base64,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
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_notification
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    console.log("积极分子在线培训助手已加载");

    // 工具函数
    const utils = {
        getVideo: () => document.querySelector("video"),
        
        getRid: () => {
            const html = document.documentElement.innerHTML;
            const match = html.match(/rid[\s:="']*(\d+)["'\s]/);
            return match ? match[1] : null;
        },
        
        // 清除所有定时器
        clearAllTimers: () => {
            // 清除原页面定时器
            clearInterval(window.timer);
            window.clearInterval(window.loop_flag);
            window.clearInterval(window.flag);
    
            // 清除我们自己的定时器
            if (window.autoInterval) {
                clearInterval(window.autoInterval);
                window.autoInterval = null;
            }
        },
        
        // 处理各种弹窗,包括继续观看和关闭
        handleDialogs: () => {
            // .public_close .public_cancel  .public_submit  public_cont1这三种按钮 并且要判断内容
            document.querySelectorAll(".public_close, .public_cancel, .public_submit, .public_cont1").forEach(btn => {
                if (btn) {
                    // 继续观看 、我知道了 、继续
                    if (btn.textContent?.includes("继续观看") || btn.textContent?.includes("我知道了") || btn.textContent?.includes("继续")) {
                        btn.click();
                    }
                }
            });
        }
    };

    // 防止页面切换时暂停
    const originAddListener = Document.prototype.addEventListener;
    Document.prototype.addEventListener = function(type, listener, options) {
        if (type === "visibilitychange") return;
        return originAddListener.call(this, type, listener, options);
    };
    Object.defineProperty(document, 'hidden', { configurable: true, get: () => false });
    Object.defineProperty(document, 'visibilityState', { configurable: true, get: () => 'visible' });

    // 添加样式
    GM_addStyle(`
        .jjfz-helper-panel {
            position: fixed;
            top: 110px;
            left: 10px;
            background: #fff;
            border-radius: 0 0 4px 4px;
            box-shadow: 2px 2px 8px rgba(0, 0, 0, 0.2);
            z-index: 9999;
            padding: 12px;
            width: 280px;
            font-size: 14px;
            margin-top: -1px;
        }
        .jjfz-helper-panel h3 {
            margin: 0 0 12px 0;
            padding-bottom: 8px;
            border-bottom: 1px solid #eee;
            text-align: center;
            font-size: 16px;
            color: #e61d1d;
        }
        .jjfz-helper-option {
            margin-bottom: 10px;
        }
        .jjfz-helper-option label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
        }
        .checkbox-wrapper {
            display: flex;
            align-items: center;
            margin: 5px 0;
        }
        .checkbox-wrapper input[type="checkbox"] {
            width: auto;
            margin: 0;
            cursor: pointer;
        }
        .jjfz-helper-panel select, .jjfz-helper-panel input, .jjfz-helper-panel button {
            width: 100%;
            padding: 6px;
            border: 1px solid #ddd;
            border-radius: 3px;
            margin-bottom: 6px;
            cursor: pointer;
        }
        .jjfz-helper-panel select, .jjfz-helper-panel input[type="text"] {
            cursor: auto;
        }
        .jjfz-helper-panel button {
            background: #2196F3;
            color: white;
            border: none;
            font-weight: bold;
        }
        .jjfz-helper-panel button:hover {
            background: #1976D2;
        }
        .jjfz-helper-panel button.stop {
            background: #F44336;
        }
        .jjfz-helper-panel button.stop:hover {
            background: #D32F2F;
        }
        .jjfz-helper-toggle {
            position: fixed;
            top: 80px;
            left: 10px;
            background: #2196F3;
            color: white;
            border: none;
            border-radius: 4px;
            padding: 6px 12px;
            cursor: pointer;
            z-index: 10000;
            font-weight: bold;
            width: 80px;
            box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.05);
        }
        .jjfz-helper-toggle.expanded {
            border-radius: 4px 4px 0 0;
        }
        .jjfz-helper-toggle:hover {
            background: #1976D2;
        }
    `);

    // 设置
    const settings = {
        autoPlay: GM_getValue('autoPlay', true),
        autoNext: true,
        panelExpanded: GM_getValue('panelExpanded', true),
        
        // 保存设置
        save: function() {
            Object.keys(this).forEach(key => {
                if (typeof this[key] !== 'function' && key !== 'autoNext') {
                    GM_setValue(key, this[key]);
                }
            });
        }
    };

    // 核心功能
    const core = {
        
        // 添加学习时长 - 参数为要添加的秒数
        addStudyTime: (seconds) => {
            const rid = utils.getRid();
            const video = utils.getVideo();
    
            if (!video || !rid || seconds <= 0) return false;
    
            // 计算目标时间
            const currentTime = video.currentTime || 0;
            const duration = video.duration || 600;
            // 减少2秒,等待网址自动上报完成事件
            const targetTime = Math.min(duration-2, currentTime + seconds);
    
            // 发送请求并设置视频时间
            let success = false;
    
            $.ajax({
                type: "POST",
                cache: false,
                dataType: "json",
                url: "/jjfz/lesson/current_time",
                data: {
                    rid: rid,
                    time: targetTime,
                    _xsrf: $(":input[name='_xsrf']").val()
                },
                async: false,
                success: function(data) {
                    if (data && data.code === 1) {
                        try {
                            video.currentTime = targetTime;
                            success = true;
                        } catch (e) {
                            success = false;
                        }
                    } else {
                        success = false;
                    }
                },
                error: function() {
                    success = false;
                }
            });
    
            return success;
        },
    
        // 自动播放下一集
        playNextVideo: () => {
            const current = document.querySelector('.video_red1')?.closest('li');
            const next = current?.nextElementSibling;
    
            if (next && next.querySelector('a')) {
                next.querySelector('a').click();
                return true;
            } else {
                GM_notification({ text: '✅ 本章播放完成,跳转课程列表页~', timeout: 4000 });
                location.href = `${location.protocol}//${location.host}/jjfz/lesson`;
                return false;
            }
        },
    
        // 处理视频结束事件
        handleVideoEnded: () => {
            utils.clearAllTimers();
            if (settings.autoNext) {
                // 等待2秒,确保视频结束事件触发
                setTimeout(core.playNextVideo, 2000);
            }
        },
    
        // 启动自动学习
        startAutoLearning: () => {
            if (!settings.autoPlay || window.autoInterval) return;
    
            // 处理弹窗
            utils.handleDialogs();
    
            // 监听视频结束事件
            const video = utils.getVideo();
            if (video && !video.hasEndedListener) {
                video.addEventListener('ended', function() {
                    console.log("视频播放结束");
                    core.handleVideoEnded();
                });
                video.hasEndedListener = true;
            }
    
            // 启动定时器
            window.autoInterval = setInterval(() => {
                const video = utils.getVideo();
                if (!video) return;
    
                // 尝试点击播放按钮
                if (video.paused) {
                    const playButton = document.querySelector('.plyr__controls [data-plyr="play"], .plyr__play-large, [aria-label="播放"]');
                    if (playButton) {
                        playButton.click();
                    } else {
                        // 触发点击事件
                        video.dispatchEvent(new MouseEvent('click', {
                            bubbles: true,
                            cancelable: true
                        }));
                    }
                    video.play();
                }
    
                // 自动处理弹窗
                utils.handleDialogs();
    
                // 更新界面
                ui.update();
    
                // 检测视频是否接近结束但尚未触发ended事件
                if (video.currentTime > video.duration * 0.98 && !video.ended) {
                    video.currentTime = video.duration; // 强制跳到结尾触发ended事件
                }
            }, 1500);
        }
    };

    // UI 相关功能
    const ui = {
        create: () => {
            // 创建切换按钮
            const toggleButton = document.createElement('button');
            toggleButton.className = 'jjfz-helper-toggle' + (settings.panelExpanded ? ' expanded' : '');
            toggleButton.textContent = settings.panelExpanded ? '收起' : '展开';
            toggleButton.onclick = function() {
                const panel = document.querySelector('.jjfz-helper-panel');
                settings.panelExpanded = !settings.panelExpanded;
                panel.style.display = settings.panelExpanded ? 'block' : 'none';
                this.textContent = settings.panelExpanded ? '收起' : '展开';
    
                // 根据展开状态更新按钮样式
                this.classList.toggle('expanded', settings.panelExpanded);
                settings.save();
            };
            document.body.appendChild(toggleButton);
    
            // 创建控制面板
            const panel = document.createElement('div');
            panel.className = 'jjfz-helper-panel';
            panel.style.display = settings.panelExpanded ? 'block' : 'none';
            panel.innerHTML = `
                <h3>积极分子培训助手 - JLU</h3>
    
                <div class="jjfz-helper-option">
                    <button id="jjfz-toggle-auto" class="${settings.autoPlay ? 'stop' : ''}">${settings.autoPlay ? '⏸️ 暂停刷课' : '▶️ 开始刷课'}</button>
                </div>
    
                <div class="jjfz-helper-option">
                    <label>跳转控制</label>
                    <div style="display:flex;gap:5px;">
                        <input type="number" id="jjfz-jump-time" value="30" min="1" max="3600" style="flex:2;">
                        <button id="jjfz-jump-btn" style="flex:1;">快进(秒)⏩</button>
                    </div>
                </div>
    
                <div class="jjfz-helper-status">
                    <p>当前视频: <span id="jjfz-current-video">获取中...</span></p>
                    <p>学习进度: <span id="jjfz-progress">0/0</span></p>
                </div>
            `;
            document.body.appendChild(panel);
    
            // 添加事件监听
            ui.setupEventListeners();
        },
        
        // 设置事件监听
        setupEventListeners: () => {
            document.getElementById('jjfz-toggle-auto').addEventListener('click', function() {
                settings.autoPlay = !settings.autoPlay;
                this.textContent = settings.autoPlay ? '⏸️ 暂停刷课' : '▶️ 开始刷课';
                this.className = settings.autoPlay ? 'stop' : '';
                settings.save();
    
                if (settings.autoPlay) {
                    core.startAutoLearning();
                } else {
                    utils.clearAllTimers();
                }
            });
    
            document.getElementById('jjfz-jump-btn').addEventListener('click', function() {
                const seconds = parseInt(document.getElementById('jjfz-jump-time').value) || 30;
                core.addStudyTime(seconds); // 快进
            });
        },
        
        // 更新UI
        update: () => {
            const video = utils.getVideo();
            if (!video) return;
    
            // 更新当前视频信息
            const videoTitle = document.querySelector('.video_red1 a')?.textContent.trim() || "未知";
            const currentVideoEl = document.getElementById('jjfz-current-video');
            if (currentVideoEl) {
                currentVideoEl.textContent = videoTitle;
            }
    
            // 更新课程进度
            const total = document.querySelectorAll('.video_lists ul li').length;
            const current = Array.from(document.querySelectorAll('.video_lists ul li')).findIndex(li => li.classList.contains('video_red1')) + 1;
            const progressEl = document.getElementById('jjfz-progress');
            if (progressEl) {
                progressEl.textContent = `${current}/${total}`;
            }
        }
    };

    // 主函数
    function main() {
        // 创建UI
        ui.create();

        // 监听视频加载
        let checkCount = 0;
        const videoCheckInterval = setInterval(() => {
            const video = utils.getVideo();
            checkCount++;

            if (video) {
                clearInterval(videoCheckInterval);

                // 监听播放进度
                video.addEventListener('timeupdate', ui.update);

                // 自动学习模式
                if (settings.autoPlay) {
                    core.startAutoLearning();
                }

                ui.update();
            } else if (checkCount > 20) {
                // 20秒后仍未找到视频,停止检查
                clearInterval(videoCheckInterval);
                console.log("未能找到视频元素");
            }
        }, 1000);
    }

    // 启动脚本
    main();
})();