Shanxi GSPX Online Auto-click Unlearned

陕西省高校教师岗前培训暨教师资格教育基础理论知识培训,自动查找并点击“未达标”课程中的“前往学习”链接,直到所有课程达标。

当前为 2024-10-17 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Shanxi GSPX Online Auto-click Unlearned
// @namespace    http://tampermonkey.net/
// @version      6.3
// @description  陕西省高校教师岗前培训暨教师资格教育基础理论知识培训,自动查找并点击“未达标”课程中的“前往学习”链接,直到所有课程达标。
// @author       大老粗
// @match        http://shanxigs.gspxonline.com/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    const WAIT_TIME = 10000; // 通用等待时间
    const LONG_WAIT_TIME = 18000000; // 5小时的等待时间

    // 创建状态窗口
    function createStatusWindow() {
        const statusDiv = document.createElement('div');
        statusDiv.id = 'scriptStatusWindow';
        statusDiv.style.cssText = `
            position: fixed; top: 10px; right: 10px; width: 250px; height: 150px;
            background-color: rgba(0, 0, 0, 0.8); color: white; font-size: 14px;
            padding: 10px; z-index: 9999; border-radius: 8px; text-align: left;
        `;
        statusDiv.innerHTML = `<strong>脚本运行状态</strong><br>初始化...`;
        document.body.appendChild(statusDiv);
    }

    // 更新状态窗口的内容
    function updateStatus(message) {
        const statusDiv = document.getElementById('scriptStatusWindow');
        if (statusDiv) {
            statusDiv.innerHTML = `<strong>脚本运行状态</strong><br>${message}`;
        }
    }

    // 处理弹出窗口
    async function handlePopup() {
        updateStatus('正在处理弹出窗口...');
        const confirmButton = document.querySelector('button[data-bb-handler="success"]');
        if (confirmButton) {
            confirmButton.click();
            updateStatus('已点击确认按钮,页面加载中...');
            await new Promise(resolve => setTimeout(resolve, WAIT_TIME));
        }
    }

    // 查找并点击未达标课程
    async function clickUnqualifiedCourse() {
        updateStatus('正在查找 "未达标" 的课程...');

        // 查找包含“未达标”文本的 <tr> 行
        const unqualifiedCourses = Array.from(document.querySelectorAll('tr'))
            .filter(row => row.textContent.includes('未达标'));

        updateStatus(`找到 "未达标" 的课程数量: ${unqualifiedCourses.length}`);

        if (unqualifiedCourses.length > 0) {
            const firstCourse = unqualifiedCourses[0];

            // 查找包含 "前往学习" 的 <a> 链接
            const studyLink = firstCourse.querySelector('a.btn.btn-primary');

            if (studyLink) {
                updateStatus('找到 "前往学习" 链接,正在模拟点击...');

                // 手动触发鼠标点击事件
                simulateClick(studyLink);

                await new Promise(resolve => setTimeout(resolve, LONG_WAIT_TIME));
                await handlePopup(); // 刷新前再次处理弹出窗口
                location.reload();
                return true;
            } else {
                updateStatus('未找到 "前往学习" 链接。');
            }
        } else {
            updateStatus('未找到 "未达标" 的课程。');
        }

        return false;
    }

    // 模拟点击函数,创建鼠标事件
    function simulateClick(element) {
        const rect = element.getBoundingClientRect();
        const clickEvent = new MouseEvent('click', {
            view: window,
            bubbles: true,
            cancelable: true,
            clientX: rect.left + rect.width / 2,
            clientY: rect.top + rect.height / 2
        });
        element.dispatchEvent(clickEvent);  // 触发点击事件
        console.log('模拟点击已发送至元素:', element);
    }

    // 主程序
    async function main() {
        createStatusWindow();
        while (true) {
            const isUnqualified = await clickUnqualifiedCourse();
            if (!isUnqualified) {
                updateStatus('所有课程已达标或未找到未达标课程。');
                break;
            }
            await handlePopup(); // 处理可能出现的弹出窗口
        }
    }

    window.addEventListener('load', main);
})();