Skip Elearning Auto

Auto skip Goertek E-learning courses by directly sending requests

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Skip Elearning Auto
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  Auto skip Goertek E-learning courses by directly sending requests
// @author       lepecoder
// @match        https://goertek-elearning.21tb.com/els/html/courseStudyItem/courseStudyItem.learn.do?*
// @grant        none
// @license      MIT
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    let countdown = 5;
    let countdownInterval = null;

    // 创建提示信息元素
    function createInfoPanel() {
        if (document.getElementById('skipElearningPanel')) return;

        const panel = document.createElement('div');
        panel.id = 'skipElearningPanel';
        panel.innerHTML = `跳过学习工具已就绪<br><span id="countdownText" style="font-size: 12px;">(${countdown}s 后可点击)</span>`;
        panel.style.position = 'fixed';
        panel.style.top = '10px';
        panel.style.right = '10px';
        panel.style.zIndex = '9999';
        panel.style.padding = '10px';
        panel.style.backgroundColor = '#ffffcc';
        panel.style.border = '1px solid #ffcc00';
        panel.style.borderRadius = '5px';
        panel.style.fontSize = '14px';
        panel.style.maxWidth = '300px';
        panel.style.cursor = 'not-allowed';
        panel.style.opacity = '0.7';
        panel.addEventListener('click', handleClick);
        document.body.appendChild(panel);

        // 添加提示
        const tip = document.createElement('div');
        tip.textContent = '自动跳过学习';
        tip.style.fontSize = '12px';
        tip.style.marginTop = '5px';
        tip.style.color = '#666';
        panel.appendChild(tip);

        // 开始倒计时
        startCountdown();
    }

    // 开始倒计时
    function startCountdown() {
        countdown = 5;
        updateCountdownDisplay();

        countdownInterval = setInterval(() => {
            countdown--;
            updateCountdownDisplay();

            if (countdown <= 0) {
                clearInterval(countdownInterval);
                enablePanel();
            }
        }, 1000);
    }

    // 更新倒计时显示
    function updateCountdownDisplay() {
        const countdownText = document.getElementById('countdownText');
        if (countdownText) {
            if (countdown > 0) {
                countdownText.textContent = `(${countdown}s 后可点击)`;
            } else {
                countdownText.textContent = '(点击跳过学习)';
            }
        }
    }

    // 启用面板点击功能
    function enablePanel() {
        const panel = document.getElementById('skipElearningPanel');
        if (panel) {
            panel.style.cursor = 'pointer';
            panel.style.opacity = '1.0';
        }
    }

    // 禁用面板点击功能
    function disablePanel() {
        const panel = document.getElementById('skipElearningPanel');
        if (panel) {
            panel.style.cursor = 'not-allowed';
            panel.style.opacity = '0.7';
        }
    }

    // 处理点击事件
    function handleClick() {
        if (countdown > 0) return; // 倒计时期间不允许点击
        skipElearning();
    }

    // 更新提示信息
    function updateInfoPanel(message, color = '#000000') {
        // 确保面板存在
        if (!document.getElementById('skipElearningPanel')) {
            createInfoPanel();
        }

        const panel = document.getElementById('skipElearningPanel');
        if (panel) {
            panel.firstChild.textContent = message;
            panel.style.color = color;
        }
    }

    // 提取courseId
    function getCourseId() {
        const urlParams = new URLSearchParams(window.location.search);
        return urlParams.get('courseId');
    }

    // 获取学习记录
    function getStudyRecord(courseId) {
        return new Promise((resolve, reject) => {
            const data = JSON.stringify({
                "courseId": courseId,
                "sourceId": courseId,
                "providerCorpCode": "goertek"
            });

            const xhr = new XMLHttpRequest();
            xhr.withCredentials = true;

            xhr.addEventListener("readystatechange", function () {
                if (this.readyState === 4) {
                    if (this.status === 200) {
                        try {
                            const response = JSON.parse(this.responseText);
                            if (response.bizResult && response.bizResult.length > 0) {
                                // 返回整个bizResult数组
                                resolve(response.bizResult);
                            } else {
                                reject(new Error('学习记录为空'));
                            }
                        } catch (e) {
                            reject(new Error('解析学习记录失败: ' + e.message));
                        }
                    } else {
                        reject(new Error(`获取学习记录失败: HTTP ${this.status}`));
                    }
                }
            });

            xhr.open("POST", "https://goertek-elearning.21tb.com/tbc-rms/record/getStudyRecordList");
            xhr.setRequestHeader("-local", "zh_CN");
            xhr.setRequestHeader("Accept", "application/json, text/plain, */*");
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.setRequestHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");

            // 复制当前页面的cookie
            const cookieHeader = document.cookie;
            if (cookieHeader) {
                xhr.setRequestHeader("Cookie", cookieHeader);
            }

            xhr.send(data);
        });
    }

    // 更新学习记录
    function updateStudyRecord(record) {
        return new Promise((resolve, reject) => {
            const data = JSON.stringify({
                "recordId": record.recordId,
                "courseId": record.courseId,
                "sourceId": record.courseId,
                "providerCorpCode": "goertek",
                "chapterId": record.chapterId,
                "resourceId": record.resourceId,
                "timeToFinish": record.timeToFinish,
                "currentPosition": record.timeToFinish,
                "type": "video",
                "currentStudyTime": record.timeToFinish,
                "pageIndex": 0,
                "platform": "PC"
            });

            const xhr = new XMLHttpRequest();
            xhr.withCredentials = true;

            xhr.addEventListener("readystatechange", function () {
                if (this.readyState === 4) {
                    if (this.status === 200) {
                        resolve(this.responseText);
                    } else {
                        reject(new Error(`跳过学习失败: HTTP ${this.status}`));
                    }
                }
            });

            xhr.open("POST", "https://goertek-elearning.21tb.com/tbc-rms/record/updateCourseRecord");
            xhr.setRequestHeader("-local", "zh_CN");
            xhr.setRequestHeader("Accept", "application/json, text/plain, */*");
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.setRequestHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");

            // 复制当前页面的cookie
            const cookieHeader = document.cookie;
            if (cookieHeader) {
                xhr.setRequestHeader("Cookie", cookieHeader);
            }

            xhr.send(data);
        });
    }

    // 主要功能函数
    async function skipElearning() {
        // 禁用面板防止重复点击
        disablePanel();
        if (countdownInterval) {
            clearInterval(countdownInterval);
        }

        updateInfoPanel('正在获取课程ID...', '#0000ff');

        try {
            const courseId = getCourseId();
            if (!courseId) {
                throw new Error('无法从URL中获取课程ID');
            }

            updateInfoPanel('正在获取学习记录...', '#0000ff');
            console.log('[SkipElearning] 获取学习记录,courseId:', courseId);
            const records = await getStudyRecord(courseId);
            console.log('[SkipElearning] 学习记录数量:', records.length);

            updateInfoPanel(`正在跳过学习 (${records.length}个视频)...`, '#0000ff');

            // 为每个记录发送更新请求
            let successCount = 0;
            for (let i = 0; i < records.length; i++) {
                try {
                    updateInfoPanel(`正在跳过学习 (${i+1}/${records.length})...`, '#0000ff');
                    const result = await updateStudyRecord(records[i]);
                    console.log(`[SkipElearning] 更新记录 ${i+1} 结果:`, result);
                    successCount++;
                } catch (error) {
                    console.error(`[SkipElearning] 更新记录 ${i+1} 失败:`, error);
                }
            }

            updateInfoPanel(`跳过完成! 成功: ${successCount}/${records.length} 页面即将刷新`, '#00aa00');
            setTimeout(() => {
                location.reload();
            }, 1000);
        } catch (error) {
            console.error('[SkipElearning] 错误:', error);
            updateInfoPanel('跳过失败: ' + error.message, '#ff0000');
            // 重新开始倒计时
            startCountdown();
        }
    }

    // 页面加载完成后初始化
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', createInfoPanel);
    } else {
        createInfoPanel();
    }
})();