Skip Elearning Auto

Auto skip Goertek E-learning courses by directly sending requests

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==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();
    }
})();