Shanxi GSPX Online Auto-click Unlearned

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

目前為 2024-10-17 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);
})();