您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
广东省继续教育(含公需课)刷课,自动答题 + 自动关闭弹窗 + 完成自动进入下章
当前为
// ==UserScript== // @name 广东省继续教育(含公需课)自动刷课 // @version 3.0 // @description 广东省继续教育(含公需课)刷课,自动答题 + 自动关闭弹窗 + 完成自动进入下章 // @author lzhzssy // @icon https://ggfw.gdhrss.gov.cn/favicon.ico // @match http*://ggfw.hrss.gd.gov.cn/zxpx/auc/play/player* // @license GPLv3 // @namespace https://gf.qytechs.cn/ // ==/UserScript== setTimeout(function () { // 静音 p.tag.muted = true; var errChecking = setInterval(function () { if ($('.learnpercent').text().indexOf('已完成') != -1) { var learnlist = $("a:contains('未完成')").length != 0 ? $("a:contains('未完成')") : $("a:contains('未开始')"); if (learnlist.length == 0) { if (confirm('本课程全部学习完成!即将关闭页面!')) { window.close(); } } else { learnlist.each(function () { this.click(); }) } } // 暂停时自动开始播放 if (p.paused()) { p.play() } }, 500); }, 1000); // ====== 自动答题 + 通用弹窗持续处理(修复版)====== (function () { const TRY_INTERVAL = 1000; let answeredThisQuestion = false; let currentQuestionId = null; let processedDialogs = new WeakSet(); let isRetrying = false; let waitingForNextQuestion = false; // 新增:等待下一题加载的标志 let lastAnswerTime = 0; // 记录最后一次答题时间 // ================= 工具函数 ================= function clickEl(el) { if (!el) return false; try { el.click(); return true; } catch (e) { try { el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true })); return true; } catch (err) { console.warn('click failed', err); return false; } } } function setInputChecked(input) { if (!input) return; input.checked = true; input.dispatchEvent(new Event('change', { bubbles: true })); input.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true })); } function submitAnswer() { const submitBtn = document.querySelector('.reply-sub'); if (submitBtn) { clickEl(submitBtn); return true; } if (typeof window.subAnswer === 'function') { try { window.subAnswer(); return true; } catch (e) { } } return false; } // 获取题目唯一标识 function getQuestionId() { const form = document.querySelector('#from_ejectque'); if (!form) return null; // 综合多个因素生成唯一ID const questionText = form.querySelector('.eject-title, .question-text, h3, .title'); const text = questionText ? questionText.innerText.trim() : ''; // 获取所有选项的状态 const inputs = Array.from(form.querySelectorAll("input[name='panduan']")); const optionsState = inputs.map(i => `${i.value}:${i.checked}`).join('|'); // 组合生成ID return `${text}_${optionsState}`; } // 检查是否有可见的题目表单 function hasVisibleQuestion() { const form = document.querySelector('#from_ejectque'); if (!form) return false; const style = window.getComputedStyle(form); return style.display !== 'none' && form.offsetParent !== null; } // ================= 答题自动化部分 ================= function tryAutoAnswerOnce() { const form = document.querySelector('#from_ejectque'); if (!form) return false; // 如果正在等待下一题或表单不可见,跳过 if (waitingForNextQuestion || !hasVisibleQuestion()) { return false; } // 防抖:2秒内不重复答题 const now = Date.now(); if (now - lastAnswerTime < 2000) { return false; } // 检查是否是新题目 const questionId = getQuestionId(); if (!questionId) return false; if (questionId !== currentQuestionId) { console.log('[AutoAnswer] 检测到新题目'); currentQuestionId = questionId; answeredThisQuestion = false; isRetrying = false; waitingForNextQuestion = false; } // 如果已经回答过或正在重试,跳过 if (answeredThisQuestion || isRetrying) return false; let opt = form.querySelector("input[name='panduan'][value='0']"); if (!opt) opt = form.querySelector("input[name='panduan']"); if (!opt) return false; console.log('[AutoAnswer] 尝试提交答案:选项0'); setInputChecked(opt); setTimeout(() => { if (submitAnswer()) { answeredThisQuestion = true; lastAnswerTime = Date.now(); console.log('[AutoAnswer] 答案已提交'); } }, 500); return true; } // =============== 通用弹窗检测处理 =============== function findVisibleDialogs() { const dialogs = Array.from(document.querySelectorAll('.messager-window, .panel.window, .prism-ErrorMessage')); return dialogs.filter(d => { if (processedDialogs.has(d)) return false; const style = window.getComputedStyle(d); if (style.display !== 'none' && d.offsetParent !== null) return true; const inline = d.getAttribute('style') || ''; return inline.includes('display: block'); }); } function handleDialog(dialog) { processedDialogs.add(dialog); const text = dialog.innerText.trim(); if (!text) return; console.log('[PopupHandler] 检测到弹窗:', text); if (text.includes('答案错误')) { console.log('[PopupHandler] 处理:答案错误 → 准备切换选项'); clickDialogOk(dialog); isRetrying = true; answeredThisQuestion = false; setTimeout(() => { const form = document.querySelector('#from_ejectque'); if (!form) { isRetrying = false; return; } const alt = form.querySelector("input[name='panduan'][value='1']"); if (alt && !alt.checked) { console.log('[PopupHandler] 切换到选项1'); setInputChecked(alt); setTimeout(() => { submitAnswer(); answeredThisQuestion = true; lastAnswerTime = Date.now(); isRetrying = false; }, 500); } else { const anyOpt = Array.from(form.querySelectorAll("input[name='panduan']")); const unchecked = anyOpt.find(o => !o.checked); if (unchecked) { console.log('[PopupHandler] 切换到其他选项'); setInputChecked(unchecked); setTimeout(() => { submitAnswer(); answeredThisQuestion = true; lastAnswerTime = Date.now(); isRetrying = false; }, 500); } else { isRetrying = false; } } }, 1200); } else if (text.includes('答案正确')) { console.log('[PopupHandler] 处理:答案正确 → 点击确定,等待下一题'); // 设置等待标志,防止在题目切换前重复答题 waitingForNextQuestion = true; setTimeout(() => { clickDialogOk(dialog); console.log('[PopupHandler] 已点击确定,等待5秒后恢复答题'); // 延长等待时间,确保题目完全切换 setTimeout(() => { currentQuestionId = null; // 强制重新识别题目 waitingForNextQuestion = false; answeredThisQuestion = false; console.log('[PopupHandler] 恢复答题检测'); }, 5000); // 等待5秒 }, 800); } else if (text.includes('网络') || text.includes('播放错误') || text.includes('重试')) { console.log('[PopupHandler] 处理:网络/播放错误 → 点击刷新或重试'); const refreshBtn = dialog.querySelector('.prism-button-refresh, .prism-button-retry'); if (refreshBtn) clickEl(refreshBtn); else clickDialogOk(dialog); } else { console.log('[PopupHandler] 处理:其他提示弹窗 → 点击确定'); setTimeout(() => clickDialogOk(dialog), 800); } } function clickDialogOk(dialog) { let okBtn = Array.from(dialog.querySelectorAll('a.l-btn, .prism-button, button')) .find(a => (a.textContent || '').includes('确定') || (a.textContent || '').includes('刷新') || (a.textContent || '').includes('重试')); if (!okBtn) { const span = dialog.querySelector('.l-btn-text'); if (span && /确定|刷新|重试/.test(span.textContent)) okBtn = span.closest('a') || span; } if (!okBtn) { okBtn = dialog.querySelector('.panel-tool-close'); } if (okBtn) { clickEl(okBtn); console.log('[PopupHandler] 已点击弹窗按钮'); } } // =============== 主循环:持续检测 =============== const mainInterval = setInterval(() => { try { if (!isRetrying) { tryAutoAnswerOnce(); } const dialogs = findVisibleDialogs(); dialogs.forEach(dialog => handleDialog(dialog)); } catch (err) { console.error('[AutoAnswer] 主循环错误:', err); } }, TRY_INTERVAL); setInterval(() => { processedDialogs = new WeakSet(); }, 30000); console.log('[AutoAnswer] 自动答题 + 弹窗处理脚本已启动 ✅'); })(); // 拖拉进度 + 倍速播放(但是没用,因为有要求学习时长) (function () { 'use strict'; function enableVideoControl() { const video = document.querySelector('video'); if (!video) return; console.log('[Prism增强] 找到视频元素,开始启用自定义控制。'); // 允许拖动(有的播放器禁用 onseeked/onseeking) video.removeAttribute('disablepictureinpicture'); video.controls = true; // 显示控制栏 // 默认倍速 video.playbackRate = 1.0; // 添加快捷键控制 document.addEventListener('keydown', (e) => { if (e.target.tagName.toLowerCase() === 'input' || e.target.tagName.toLowerCase() === 'textarea') return; switch (e.key) { case '>': // Shift + . video.playbackRate = Math.min(video.playbackRate + 0.25, 4); showTip(`倍速:${video.playbackRate.toFixed(2)}x`); break; case '<': // Shift + , video.playbackRate = Math.max(video.playbackRate - 0.25, 0.25); showTip(`倍速:${video.playbackRate.toFixed(2)}x`); break; case 'ArrowRight': video.currentTime += 10; showTip('快进10秒'); break; case 'ArrowLeft': video.currentTime -= 10; showTip('后退10秒'); break; case ' ': // 空格暂停/播放 e.preventDefault(); video.paused ? video.play() : video.pause(); break; } }); // 倍速提示 function showTip(text) { let tip = document.getElementById('speed-tip'); if (!tip) { tip = document.createElement('div'); tip.id = 'speed-tip'; tip.style.cssText = 'position:fixed;bottom:15%;left:50%;transform:translateX(-50%);' + 'background:rgba(0,0,0,0.7);color:#fff;padding:8px 15px;border-radius:8px;font-size:16px;z-index:999999;transition:opacity 0.5s;'; document.body.appendChild(tip); } tip.textContent = text; tip.style.opacity = '1'; clearTimeout(tip._timer); tip._timer = setTimeout(() => (tip.style.opacity = '0'), 1200); } } // 监听页面动态加载(Prism Player 是异步初始化的) const observer = new MutationObserver(() => { if (document.querySelector('video')) { enableVideoControl(); observer.disconnect(); } }); observer.observe(document.body, { childList: true, subtree: true }); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址