// ==UserScript== // @name 🏅学习通AI研习助手|💡智能刷课+自动答题|🤖 AI智能答题|🏆 一键启动|🛠️ 无需配置|长期维护更新 // @namespace http://tampermonkey.net/ // @version 1.1.8 // @description 采用AI大模型,题目识别准、作答快,所有题目均可作答。支持自动刷课、自动答题、自动完成章节测试,简洁界面、稳定服务,持续适配平台更新。 // @author kail // @match *://*.chaoxing.com/* // @grant GM_xmlhttpRequest // @grant GM_addStyle // @grant GM_getResourceText // @connect api.116611.xyz // @resource typrMd5Lib https://116611.xyz/typr-md5.js // @resource fontTableData https://116611.xyz/table.json // @license CC-BY-NC-ND-4.0 // @antifeature payment 脚本存在第三方答题接口付费功能 // @icon data:image/jpeg;base64,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 // ==/UserScript== const systemConfig = { buildTime: new Date().toISOString(), environment: 'production' }; class Logger { constructor(prefix) { this.prefix = prefix || 'System'; this.levels = ['DEBUG', 'INFO', 'WARN', 'ERROR']; } log(level, message) { if (this.levels.includes(level)) { const timestamp = new Date().toISOString(); } } debug(msg) { this.log('DEBUG', msg); } info(msg) { this.log('INFO', msg); } warn(msg) { this.log('WARN', msg); } error(msg) { this.log('ERROR', msg); } } const logger = new Logger('CXHelper'); const browserCheck = { isChrome: () => /Chrome/.test(navigator.userAgent), isFirefox: () => /Firefox/.test(navigator.userAgent), isEdge: () => /Edge/.test(navigator.userAgent), isSafari: () => /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) }; class PerformanceMonitor { constructor() { this.metrics = new Map(); this.startTimes = new Map(); } start(name) { this.startTimes.set(name, performance.now()); } end(name) { const startTime = this.startTimes.get(name); if (startTime) { const duration = performance.now() - startTime; this.metrics.set(name, duration); this.startTimes.delete(name); return duration; } return 0; } getMetric(name) { return this.metrics.get(name) || 0; } } const perfMonitor = new PerformanceMonitor(); const utils = { generateId: (length = 8) => { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; for (let i = 0; i < length; i++) { result += chars.charAt(Math.floor(Math.random() * chars.length)); } return result; }, deepClone: (obj) => { if (obj === null || typeof obj !== 'object') return obj; if (obj instanceof Date) return new Date(obj.getTime()); if (obj instanceof Array) return obj.map(item => utils.deepClone(item)); if (typeof obj === 'object') { const cloned = {}; Object.keys(obj).forEach(key => { cloned[key] = utils.deepClone(obj[key]); }); return cloned; } }, debounce: (func, wait) => { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; }, throttle: (func, limit) => { let inThrottle; return function() { const args = arguments; const context = this; if (!inThrottle) { func.apply(context, args); inThrottle = true; setTimeout(() => inThrottle = false, limit); } } } }; class CacheManager { constructor(maxSize = 100) { this.cache = new Map(); this.maxSize = maxSize; } set(key, value, ttl = 300000) { // 默认5分钟过期 if (this.cache.size >= this.maxSize) { const firstKey = this.cache.keys().next().value; this.cache.delete(firstKey); } const item = { value: value, expiry: Date.now() + ttl }; this.cache.set(key, item); } get(key) { const item = this.cache.get(key); if (!item) return null; if (Date.now() > item.expiry) { this.cache.delete(key); return null; } return item.value; } clear() { this.cache.clear(); } } const cacheManager = new CacheManager(); logger.info('System initialization completed'); (function() { 'use strict'; (function(){ function _b64ToBytes(b64){ const bin = atob(b64); const out = new Uint8Array(bin.length); for(let i=0;ic-1); const __SALT = String.fromCharCode.apply(null, __S); const __ENC = "idiM9YBNCEBSu80fAcWJtglB3UgCOQSNSUCG2EFbmlWW7AyIJkSb/kgNWgCHsoEA"; function __getDSK(){ try { const step1 = __ENC.split('').reverse().join(''); const xored = _b64ToBytes(step1); const plainB64Bytes = _xor(xored, _strToBytes(__SALT)); const plainB64 = _bytesToStr(plainB64Bytes); return atob(plainB64); } catch (e) { return ''; } } window.__getDeepseekKey = __getDSK; })(); const DEEPSEEK_PROXY_BASE = 'https://api.116611.xyz'; const DEEPSEEK_MODEL = 'deepseek-chat'; const DEEPSEEK_API_URL = `${DEEPSEEK_PROXY_BASE}/v1/chat/completions`; function deepseekChat(messages, options = {}) { return new Promise((resolve, reject) => { try { GM_xmlhttpRequest({ method: 'POST', url: DEEPSEEK_API_URL, headers: { 'Content-Type': 'application/json', 'X-App-Token': __getDSAuth() }, data: JSON.stringify({ model: DEEPSEEK_MODEL, messages, ...options }), timeout: 60000, onload: (r) => { if (r.status >= 200 && r.status < 300) { try { resolve(JSON.parse(r.responseText)); } catch (e) { reject(e); } } else { reject(new Error(`HTTP ${r.status}: ${String(r.responseText || '').slice(0,200)}`)); } }, onerror: () => reject(new Error('Network error')), ontimeout: () => reject(new Error('Timeout')) }); } catch (err) { reject(err); } }); } let isAnswering = false; let isStudyingChapters = false; let studyIntervalId = null; const STUDY_PERSIST_KEY = 'cx_helper_study_on_v2'; const PANEL_REG_KEY = 'cx_helper_active_panel_v2'; const PANEL_INSTANCE_ID = `${Date.now()}_${Math.random().toString(36).slice(2, 8)}`; const FRAME_DEPTH = (() => { let d = 0; try { let w = window; while (w !== w.top) { d++; w = w.parent; } } catch { d = 999; } return d; })(); let isActiveOwner = false; let createdPanelEl = null; const HEARTBEAT_INTERVAL_MS = 2000; const STALE_MS = 7000; let heartbeatTimerId = null; let lastAutoSkipTs = 0; let emptyChecksCount = 0; let lastEmptySectionKey = ''; let recoveryTimerId = null; const API_BASE = 'https://116611.xyz'; const MONEY_YUAN = (() => { try { const b64 = 'OC4wMA=='; return atob(b64); } catch { return '8.00'; } })(); const PAY_NAME = 'XHelper 解锁/赞助'; const DEFAULT_PAY = 'wxpay'; const LS_KEY_DEV_ID = 'cxhelper_device_id'; const LS_KEY_FREE = 'cxhelper_free_used'; const LS_KEY_LICENSED = 'cxhelper_licensed'; const POLL_MS_PAY = 3000; const POLL_MAX_PAY = 100; const getFreeLimit = (() => { let cached = null; return function() { if (cached != null) return cached; try { const b64 = 'JDEw'; const decoded = atob(b64); const n = parseInt(decoded.replace(/\D/g, ''), 10); cached = Number.isFinite(n) ? n : 10; } catch { cached = 10; } return cached; }; })(); function getDeviceIdPaid() { try { let id = localStorage.getItem(LS_KEY_DEV_ID); if (!id) { id = ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)); localStorage.setItem(LS_KEY_DEV_ID, id); } return id; } catch { return 'dev_' + Math.random().toString(36).slice(2); } } const DEVICE_ID_PAID = getDeviceIdPaid(); function getCookie(key) { try { const name = key + '='; const parts = document.cookie.split(';'); for (let part of parts) { const s = part.trim(); if (s.indexOf(name) === 0) return decodeURIComponent(s.substring(name.length)); } return ''; } catch { return ''; } } function setCookie(key, value, days, domain) { try { const d = new Date(); d.setTime(d.getTime() + ((days || 365) * 24 * 60 * 60 * 1000)); const expires = 'expires=' + d.toUTCString(); const dm = domain ? ';domain=' + domain : ''; document.cookie = key + '=' + encodeURIComponent(value) + ';path=/' + ';' + expires + dm; } catch {} } function isLocallyLicensed() { try { // 优先从跨子域Cookie读取,保障不同页面一致 const c = getCookie(LS_KEY_LICENSED); if (c === '1') return true; return localStorage.getItem(LS_KEY_LICENSED) === '1'; } catch { return false; } } function setLocallyLicensed() { try { localStorage.setItem(LS_KEY_LICENSED, '1'); } catch {} // 写入跨子域Cookie,统一所有 *.chaoxing.com 页面状态 try { setCookie(LS_KEY_LICENSED, '1', 365, '.chaoxing.com'); } catch {} } function getFreeUsedCount() { try { return parseInt(localStorage.getItem(LS_KEY_FREE) || '0', 10) || 0; } catch { return 0; } } function incFreeUsedCount() { try { const n = getFreeUsedCount() + 1; localStorage.setItem(LS_KEY_FREE, String(n)); return n; } catch { return 0; } } async function checkLicensePaid() { if (isLocallyLicensed()) return true; try { const r = await fetch(`${API_BASE}/api/license/status?deviceId=${encodeURIComponent(DEVICE_ID_PAID)}`, { credentials: 'omit' }); const ct = (r.headers.get('content-type') || '').toLowerCase(); const data = ct.includes('application/json') ? await r.json() : await r.text(); const ok = !!(data && data.licensed); if (ok) setLocallyLicensed(); // try { updateTrialBadge(); } catch {} return ok; } catch { return false; } } async function startPaymentPaid(payType) { const win = window.open('', '_blank'); try { const resp = await fetch(`${API_BASE}/api/create`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: PAY_NAME, money: MONEY_YUAN, type: payType || DEFAULT_PAY, param: DEVICE_ID_PAID }) }); const html = await resp.text(); win.document.open(); win.document.write(html); win.document.close(); return true; } catch (e) { if (win) win.close(); alert('发起支付失败:' + e.message); return false; } } async function pollUntilLicensedPaid(onProgress) { for (let i = 0; i < POLL_MAX_PAY; i++) { if (onProgress) { try { onProgress(i); } catch {} } const ok = await checkLicensePaid(); if (ok) { setLocallyLicensed(); return true; } await new Promise(r => setTimeout(r, POLL_MS_PAY)); } return false; } function showPayModalPaid(messageText) { return new Promise(resolve => { const mask = document.createElement('div'); mask.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:999998;backdrop-filter:blur(4px);'; const box = document.createElement('div'); box.style.cssText = 'position:fixed;left:50%;top:120px;transform:translateX(-50%);width:420px;background:#fff;border-radius:16px;box-shadow:0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04);overflow:hidden;z-index:999999;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Arial;'; const msg = messageText || '试用已用完,打赏8元永久解锁哦'; box.innerHTML = ( '
解锁全部功能(永久)
' + '
' + '
' + msg + '
' + '
' + '
' + '' + '' + '
' + '
若支付方式不可用请尝试切换
' + '
' + '
点击"去支付"将打开收银台,完成后此处会自动检测。
' + '
' + '
' + '' + '' + '
' ); document.body.appendChild(mask); document.body.appendChild(box); const tip = box.querySelector('#cx_tip_paid'); const btnPay = box.querySelector('#cx_go_pay'); const btnCancel = box.querySelector('#cx_cancel_paid'); function close() { try { box.remove(); mask.remove(); } catch {} } btnCancel.onclick = () => { close(); resolve(false); }; btnPay.onclick = async () => { btnPay.disabled = true; btnPay.textContent = '打开收银台...'; const payType = (box.querySelector('input[name="cx_pay"]:checked') || {}).value || DEFAULT_PAY; const ok = await startPaymentPaid(payType); if (!ok) { btnPay.disabled = false; btnPay.textContent = '去支付'; return; } btnPay.textContent = '检测支付中...'; if (tip) tip.innerHTML = '已打开收银台,请完成支付,完成后此处会自动解锁...
💡 若无法打开支付页面请尝试连接手机热点网络'; const done = await pollUntilLicensedPaid(); if (done) { if (tip) tip.textContent = '支付成功,正在解锁...'; setLocallyLicensed(); try { updateTrialBadge(); } catch {} setTimeout(() => { close(); resolve(true); }, 500); } else { btnPay.disabled = false; btnPay.textContent = '去支付'; if (tip) tip.textContent = '未检测到支付完成,可重试或稍后再次打开本面板。'; } }; }); } function showFeedbackModal() { const mask = document.createElement('div'); mask.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:999998;backdrop-filter:blur(4px);'; const box = document.createElement('div'); box.style.cssText = 'position:fixed;left:50%;top:120px;transform:translateX(-50%);width:400px;background:#fff;border-radius:16px;box-shadow:0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04);overflow:hidden;z-index:999999;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Arial;'; box.innerHTML = ( '
意见反馈
' + '
' + '
' + '如果您在使用过程中遇到问题或有任何建议,欢迎通过以下方式联系我们:' + '
' + '
' + '
联系邮箱
' + '
2036470448@qq.com
' + '
点击邮箱地址即可复制
' + '
' + '
我们将会认真对待每一条反馈,并且尽快回复您的问题。您的建议是我们改进产品的重要动力!
' + '
' + '
' + '' + '
' ); document.body.appendChild(mask); document.body.appendChild(box); const closeBtn = box.querySelector('#feedback-close'); function close() { try { box.remove(); mask.remove(); } catch {} } closeBtn.onclick = close; mask.onclick = close; const emailDiv = box.querySelector('[onclick*="clipboard"]'); if (emailDiv) { emailDiv.addEventListener('click', function() { const originalText = this.innerHTML; this.innerHTML = '✅ 已复制到剪贴板'; this.style.color = '#2563eb'; setTimeout(() => { this.innerHTML = originalText; this.style.color = '#333'; }, 2000); }); } } async function ensureAccessAllowed() { if (await checkLicensePaid()) return true; const used = getFreeUsedCount(); if (used < getFreeLimit()) { incFreeUsedCount(); try { updateTrialBadge(); } catch {} return true; } const ok = await showPayModalPaid(); if (ok) { setLocallyLicensed(); try { updateTrialBadge(); } catch {} return true; } throw new Error('试用已用完,请解锁后继续使用'); } function getActivePanelRecord() { try { const raw = localStorage.getItem(PANEL_REG_KEY); return raw ? JSON.parse(raw) : null; } catch { return null; } } function setActivePanelRecord(rec) { try { localStorage.setItem(PANEL_REG_KEY, JSON.stringify(rec)); } catch {} } function clearActivePanelRecordIfOwner() { try { const cur = getActivePanelRecord(); if (cur && cur.id === PANEL_INSTANCE_ID) { localStorage.removeItem(PANEL_REG_KEY); } } catch {} } function shouldWeOwn(current) { const nowTs = Date.now(); if (!current) return { own: true, ts: nowTs }; if (!current.aliveTs || nowTs - current.aliveTs > STALE_MS) return { own: true, ts: nowTs }; try { if (current.url && current.url !== location.href) return { own: true, ts: nowTs }; } catch {} if (FRAME_DEPTH > (current.depth || 0)) return { own: true, ts: nowTs }; if (FRAME_DEPTH === (current.depth || 0) && nowTs > (current.ts || 0)) return { own: true, ts: nowTs }; return { own: false, ts: nowTs }; } function claimOwnership() { const cur = getActivePanelRecord(); const decision = shouldWeOwn(cur); if (decision.own) { setActivePanelRecord({ id: PANEL_INSTANCE_ID, depth: FRAME_DEPTH, ts: decision.ts, aliveTs: Date.now(), url: location.href }); isActiveOwner = true; } else { isActiveOwner = false; } return isActiveOwner; } function startHeartbeat() { if (heartbeatTimerId) return; heartbeatTimerId = setInterval(() => { if (!isActiveOwner) return; const cur = getActivePanelRecord(); if (!cur || cur.id !== PANEL_INSTANCE_ID) { stopHeartbeat(); return; } cur.aliveTs = Date.now(); try { cur.url = location.href; } catch {} setActivePanelRecord(cur); }, HEARTBEAT_INTERVAL_MS); } function stopHeartbeat() { if (heartbeatTimerId) { clearInterval(heartbeatTimerId); heartbeatTimerId = null; } } const cleanupOwnership = () => { stopHeartbeat(); clearActivePanelRecordIfOwner(); }; window.addEventListener('beforeunload', cleanupOwnership); window.addEventListener('pagehide', cleanupOwnership); function destroyPanelAndStop() { try { if (studyIntervalId) { clearInterval(studyIntervalId); studyIntervalId = null; } isStudyingChapters = false; isAnswering = false; stopHeartbeat(); const panel = document.getElementById('answer-helper-panel'); if (panel && panel.parentNode) panel.parentNode.removeChild(panel); createdPanelEl = null; } catch {} } window.addEventListener('storage', (e) => { if (e.key !== PANEL_REG_KEY) return; const rec = getActivePanelRecord(); if (!rec) return; if (rec.id === PANEL_INSTANCE_ID) { if (!createdPanelEl) { try { createdPanelEl = createPanel(); bindPanelEvents(); } catch {} } isActiveOwner = true; startHeartbeat(); } else { isActiveOwner = false; destroyPanelAndStop(); } }); GM_addStyle(` /* Panel: Modern Light Theme */ #answer-helper-panel { --ah-panel-height: 340px; position: fixed; top: 24px; left: 24px; width: 320px; min-width: 320px; max-width: 320px; height: var(--ah-panel-height) !important; min-height: var(--ah-panel-height) !important; max-height: var(--ah-panel-height) !important; background: #ffffff; border: 1px solid rgba(0, 0, 0, 0.08); border-radius: 16px; padding: 0; z-index: 9999; box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.05); font-family: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; color: #1f2937; user-select: none; overflow: hidden; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s ease, height 0.3s ease; } /* Header */ #answer-helper-header { cursor: move; height: 52px; padding: 0 18px; display: flex; align-items: center; justify-content: space-between; background: #ffffff; border-bottom: 1px solid #f3f4f6; font-size: 15px; color: #111827; } #answer-helper-header .title { display: inline-flex; align-items: center; gap: 10px; font-weight: 700; color: #111827; } #answer-helper-header .title .accent { display: inline-block; width: 10px; height: 10px; border-radius: 50%; background: #6366f1; box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15); } #answer-helper-header .right { display: inline-flex; align-items: center; gap: 10px; } #answer-helper-header .collapse-btn { width: 32px; height: 32px; border-radius: 8px; background: #f9fafb; border: 1px solid #f3f4f6; cursor: pointer; color: #6b7280; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; } #answer-helper-header .collapse-btn:hover { background: #f3f4f6; color: #111827; border-color: #e5e7eb; transform: scale(1.05); } .collapse-btn-inner { width: 16px; height: 16px; position: relative; } .collapse-icon-bar.horizontal { width: 14px; height: 2px; background: currentColor; border-radius: 1px; position: absolute; left: 1px; top: 7px; } .collapse-icon-bar.vertical { width: 2px; height: 14px; background: currentColor; border-radius: 1px; position: absolute; left: 7px; top: 1px; } /* Content */ #answer-helper-content { padding: 12px 16px; overflow-y: auto; height: calc(var(--ah-panel-height) - 52px); max-height: calc(var(--ah-panel-height) - 52px); } #answer-helper-panel.collapsed #answer-helper-content { display: none; } #answer-helper-panel.collapsed { width: 240px; min-width: 240px; max-width: 240px; height: 52px !important; min-height: 52px !important; border-radius: 12px; } /* Body: main on top, actions at bottom */ #answer-helper-content .panel-body { display: grid; grid-template-columns: 1fr; grid-template-rows: auto auto; grid-template-areas: "main" "actions"; gap: 12px; align-items: start; } .panel-main { min-width: 0; grid-area: main; } .panel-actions { grid-area: actions; } .panel-actions.panel-row { display: flex; flex-direction: column; gap: 10px; } .panel-actions.panel-row .primary-pair { display: flex; gap: 10px; width: 100%; } .panel-actions.panel-row .primary-pair .pair-slot { flex: 1; display: flex; } .panel-actions.panel-row .primary-pair .pair-slot .ah-btn { flex: 1; min-height: 44px; border-radius: 12px; } .panel-actions.panel-row .ah-btn { min-height: 40px; padding: 8px 12px; border-radius: 10px; } /* Toast */ #no-task-toast { position: fixed; top: 24px; right: 24px; background: #ffffff; border: 1px solid rgba(0,0,0,0.05); color: #111827; padding: 12px 20px; border-radius: 12px; font-size: 14px; font-weight: 500; z-index: 10000; box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1); animation: fadeInOut 3s cubic-bezier(0.4, 0, 0.2, 1) forwards; } @keyframes fadeInOut { 0% { opacity: 0; transform: translateY(-20px) scale(0.95); } 10% { opacity: 1; transform: translateY(0) scale(1); } 90% { opacity: 1; transform: translateY(0) scale(1); } 100% { opacity: 0; transform: translateY(-20px) scale(0.95); } } /* Terminal Log */ #answer-log { height: 140px; overflow-y: auto; border: 1px solid #f3f4f6; border-radius: 12px; padding: 10px; margin-bottom: 8px; font-size: 12px; line-height: 1.6; font-family: 'JetBrains Mono', 'Fira Code', 'Menlo', monospace; background: #f9fafb; color: #4b5563; } #answer-log::-webkit-scrollbar { width: 6px; } #answer-log::-webkit-scrollbar-track { background: transparent; } #answer-log::-webkit-scrollbar-thumb { background: #e5e7eb; border-radius: 10px; } #answer-log::-webkit-scrollbar-thumb:hover { background: #d1d5db; } .log-item { margin: 4px 0; padding: 6px 10px; border-radius: 8px; background: #ffffff; border: 1px solid #f3f4f6; box-shadow: 0 1px 2px rgba(0,0,0,0.02); } .success { color: #059669; border-left: 3px solid #10b981; } .error { color: #dc2626; border-left: 3px solid #ef4444; } .info { color: #374151; border-left: 3px solid #6b7280; } .debug { color: #6b7280; border-left: 3px solid #9ca3af; } /* Buttons */ .ah-btn { flex: 1; padding: 8px 14px; border: 1px solid #e5e7eb; border-radius: 10px; font-size: 13px; font-weight: 600; cursor: pointer; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); display: flex; align-items: center; justify-content: center; gap: 6px; color: #374151; background: #ffffff; } .ah-btn:hover { background: #f9fafb; border-color: #d1d5db; transform: translateY(-1px); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05); } .ah-btn:active { transform: translateY(0); box-shadow: none; } .ah-primary { background: #6366f1; color: #ffffff; border-color: #4f46e5; } .ah-primary:hover { background: #4f46e5; border-color: #4338ca; box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3); } .ah-danger { background: #ffffff; color: #ef4444; border-color: #fee2e2; } .ah-danger:hover { background: #fef2f2; border-color: #fca5a5; } .ah-secondary { background: #f9fafb; color: #4b5563; border-color: #f3f4f6; } .ah-secondary:hover { background: #f3f4f6; border-color: #e5e7eb; } .ah-success { background: #10b981; color: #ffffff; border-color: #059669; } .ah-success:hover { background: #059669; box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3); } /* Speed buttons */ .speed-button { transition: all 0.2s ease; border-radius: 8px; } .speed-active { background: #6366f1 !important; color: #ffffff !important; border-color: #4f46e5 !important; } #playback-speed-controls.segmented { display: flex; gap: 6px; justify-content: flex-end; margin-top: 6px; } #playback-speed-controls.segmented .ah-btn { min-width: 60px; padding: 6px 8px; font-size: 12px; } /* Trial Badge */ #answer-helper-panel .cx-trial-badge { position: absolute; left: 16px; bottom: 12px; color: #9ca3af; font-size: 11px; } #answer-helper-panel .cx-trial-badge .trial-buy-btn { display: inline-block; margin-left: 8px; padding: 2px 8px; font-size: 11px; border: 1px solid #e0e7ff; background: #eef2ff; color: #4f46e5; border-radius: 6px; cursor: pointer; font-weight: 600; } #answer-helper-panel .cx-trial-badge .trial-buy-btn:hover { background: #e0e7ff; border-color: #c7d2fe; } `); function createPanel() { const panel = document.createElement('div'); panel.id = 'answer-helper-panel'; panel.innerHTML = `
学习通研习助手
检测中...
`; document.body.appendChild(panel); try { panel.style.setProperty('--ah-panel-height', '340px'); } catch {} try { const rect = panel.getBoundingClientRect(); const winW = window.innerWidth || document.documentElement.clientWidth; const winH = window.innerHeight || document.documentElement.clientHeight; const left = Math.max(12, Math.round((winW - rect.width) / 2)); let isQuizPage = false; try { forEachAllSameOriginDocs((doc) => { if (isQuizPage) return; if (isQuizPageDoc(doc)) isQuizPage = true; }); } catch {} const centerTop = Math.round((winH - rect.height) / 2); const offset = Math.round(winH * 0.1); const desiredTop = isQuizPage ? Math.round(winH * 0.08) : (centerTop - offset); const top = Math.max(12, Math.min(desiredTop, Math.max(12, winH - rect.height - 12))); panel.style.left = left + 'px'; panel.style.top = top + 'px'; panel.style.right = 'auto'; } catch {} let isDragging = false, offsetX = 0, offsetY = 0; const header = panel.querySelector('#answer-helper-header'); header.addEventListener('mousedown', function(e) { if (e.target.classList.contains('collapse-btn')) return; isDragging = true; const rect = panel.getBoundingClientRect(); offsetX = e.clientX - rect.left; offsetY = e.clientY - rect.top; document.body.style.userSelect = 'none'; }); document.addEventListener('mousemove', function(e) { if (!isDragging) return; panel.style.left = (e.clientX - offsetX) + 'px'; panel.style.top = (e.clientY - offsetY) + 'px'; panel.style.right = 'auto'; }); document.addEventListener('mouseup', function() { isDragging = false; document.body.style.userSelect = ''; }); const collapseBtn = panel.querySelector('.collapse-btn'); const collapseBtnInner = collapseBtn.querySelector('.collapse-btn-inner'); collapseBtn.addEventListener('click', function() { panel.classList.toggle('collapsed'); collapseBtnInner.innerHTML = ''; if (panel.classList.contains('collapsed')) { const h = document.createElement('span'); h.className = 'collapse-icon-bar horizontal'; const v = document.createElement('span'); v.className = 'collapse-icon-bar vertical'; collapseBtnInner.appendChild(h); collapseBtnInner.appendChild(v); } else { const h = document.createElement('span'); h.className = 'collapse-icon-bar horizontal'; collapseBtnInner.appendChild(h); } }); return panel; } function setPanelFixedHeight(px) { const panel = document.getElementById('answer-helper-panel'); if (!panel) return; const val = Math.max(200, Math.round(px || 0)) + 'px'; try { panel.style.setProperty('--ah-panel-height', val); } catch {} try { const rect = panel.getBoundingClientRect(); const winH = window.innerHeight || document.documentElement.clientHeight; const maxTop = Math.max(12, winH - rect.height - 12); if (rect.top > maxTop) panel.style.top = maxTop + 'px'; } catch {} } function bindPanelEvents() { document.getElementById('start-answer')?.addEventListener('click', () => { addLog('本助手仅供学习研究,请遵守课程与平台规则。', 'info'); addLog('开始自动答题...'); autoAnswer(); }); document.getElementById('pause-answer')?.addEventListener('click', () => { isAnswering = false; addLog('正在暂停自动答题...', 'info'); }); const startStudyBtn = document.getElementById('start-study'); const pauseStudyBtn = document.getElementById('pause-study'); if (startStudyBtn && pauseStudyBtn) { startStudyBtn.addEventListener('click', () => { addLog('本助手仅供学习研究,请遵守课程与平台规则。', 'info'); startStudyChapters(); }); pauseStudyBtn.addEventListener('click', () => { stopStudyChapters(); }); } document.getElementById('speed-1x')?.addEventListener('click', () => { setVideoPlaybackSpeed(1.0); }); document.getElementById('speed-1.5x')?.addEventListener('click', () => { setVideoPlaybackSpeed(1.5); }); document.getElementById('speed-2x')?.addEventListener('click', () => { setVideoPlaybackSpeed(2.0); }); updateSpeedButtonsState(); const buyBtn = document.getElementById('buy-license'); if (buyBtn) { buyBtn.addEventListener('click', async () => { try { await showPayModalPaid('免费试用,打赏8元永久解锁哦'); } catch (e) { addLog('打开支付弹窗失败: ' + (e && e.message ? e.message : e), 'error'); } }); } document.getElementById('feedback-btn')?.addEventListener('click', () => { showFeedbackModal(); }); setTimeout(updateTrialBadge, 0); } function safeClick(el) { try { if (!el) return false; el.click(); el.dispatchEvent(new MouseEvent('click', { bubbles: true })); return true; } catch { return false; } } function forEachSameOriginFrame(callback) { const visit = (win) => { for (let i = 0; i < win.frames.length; i++) { const f = win.frames[i]; try { const doc = f.document || f.contentDocument; if (doc && doc.location && doc.location.href.includes('.chaoxing.com')) { callback(doc); visit(f); } } catch { } } }; try { callback(document); } catch {} try { visit(window); } catch {} } function forEachAllSameOriginDocs(callback) { const seen = new Set(); const visit = (win) => { if (!win || seen.has(win)) return; seen.add(win); try { const doc = win.document || win.contentDocument; if (doc) callback(doc); } catch {} try { const len = win.frames ? win.frames.length : 0; for (let i = 0; i < len; i++) { try { visit(win.frames[i]); } catch {} } } catch {} }; try { visit(window.top); } catch { visit(window); } } async function waitForQuestionsRenderAny(timeoutMs = 8000) { const end = Date.now() + timeoutMs; const selector = '.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item'; while (Date.now() < end) { let hit = null; forEachAllSameOriginDocs((doc) => { if (hit) return; try { const qs = doc.querySelectorAll(selector); if (qs && qs.length > 0) hit = doc; } catch {} }); if (hit) return hit; await new Promise(r => setTimeout(r, 300)); } return null; } function gotoNextSection(contextDoc) { const docsToTry = []; if (contextDoc) docsToTry.push(contextDoc); try { if (window.top && window.top.document) docsToTry.push(window.top.document); } catch {} docsToTry.push(document); const textNextRegex = /下一(节|章|单元|页|个)|继续|下一步|下一个|Next/i; const nextBtnSelectors = [ '.next', '.vc-next', '.reader-next', 'a[title="下一页"]', '.btn-next', '#next', '.prev_next .right a', '.switch-btn.next', '.icon-arrow-right', '.right-btn .next' ]; const currentNodeSelectors = ['.cur', '.curr', 'li.active', 'li.selected', '.posCatalog_active']; try { if (isStudyingChapters) localStorage.setItem(STUDY_PERSIST_KEY, '1'); } catch {} for (const doc of docsToTry) { try { for (const sel of nextBtnSelectors) { const btn = doc.querySelector(sel); if (btn && !btn.getAttribute('disabled') && !String(btn.className).includes('disabled')) { if (safeClick(btn)) { addLog('检测到下一节按钮,已点击', 'success'); return true; } } } for (const curSel of currentNodeSelectors) { const cur = doc.querySelector(curSel); if (cur && cur.nextElementSibling) { const link = cur.nextElementSibling.querySelector('a'); if (link && safeClick(link)) { addLog('目录定位到下一小节', 'success'); return true; } } } const links = Array.from(doc.querySelectorAll('a[href*="knowledgeId"], a[href*="chapterId"], a[href*="studentstudy"]')); if (links.length > 1) { const hrefNow = (location && location.href) || ''; const idx = links.findIndex(a => (a.href || '').includes('knowledgeId') && hrefNow.includes('knowledgeId') && a.href.split('knowledgeId')[1] === hrefNow.split('knowledgeId')[1]); const next = idx >= 0 ? links[idx + 1] : null; if (next && safeClick(next)) { addLog('通过目录链接顺序跳转下一小节', 'success'); return true; } } const clickable = Array.from(doc.querySelectorAll('a, button, .btn, .el-button, .next')); for (const el of clickable) { const txt = (el.textContent || '').trim(); if (textNextRegex.test(txt)) { const excludeClasses = ['close', 'cancel', 'delete', 'remove', 'back', 'prev', 'disabled', 'popup', 'modal']; const hasExcludeClass = excludeClasses.some(cls => el.className.toLowerCase().includes(cls) || el.id.toLowerCase().includes(cls) ); const isVisible = el.offsetWidth > 0 && el.offsetHeight > 0 && window.getComputedStyle(el).display !== 'none' && window.getComputedStyle(el).visibility !== 'hidden'; const isValidNavigationElement = ( (el.tagName === 'A' && (el.href || el.onclick)) || (el.tagName === 'BUTTON' && el.onclick) || el.className.includes('btn') || el.className.includes('next') ) && !el.closest('.popup, .modal, .dialog, .alert'); const isNavigationText = /^(下一节|下一章|下一个|下一页|继续|Next)$/i.test(txt); if (!hasExcludeClass && isVisible && isValidNavigationElement && isNavigationText) { if (safeClick(el)) { addLog(`通过文本匹配跳转: ${txt}`, 'success'); return true; } } else { addLog(`跳过不合适的文本匹配元素: ${txt} (类名: ${el.className})`, 'debug'); } } } } catch {} } addLog('未能自动跳转到下一小节', 'error'); return false; } function handleVideosInDocument(doc) { try { const videos = doc.querySelectorAll('video, .video-js video'); if (videos.length === 0) return false; let any = false; videos.forEach(v => { try { v.muted = true; if (!Number.isNaN(v.playbackRate)) v.playbackRate = currentPlaybackSpeed; const p = v.play(); if (p && typeof p.catch === 'function') p.catch(() => {}); v.loop = false; if (!v.dataset.autonextBind) { v.dataset.autonextBind = '1'; v.addEventListener('ended', () => { if (v.dataset.disableAutoNext === '1' || !isStudyingChapters) return; addLog('视频播放结束,进行完成度检测', 'success'); setTimeout(() => ensureSectionCompletedAndAdvance(doc), 300); }, { passive: true }); let nearingFired = false; const onTimeUpdate = () => { if (v.dataset.disableAutoNext === '1' || !isStudyingChapters) return; try { const d = v.duration || 0; const t = v.currentTime || 0; if (d > 0 && (d - t) <= 1.0 && !nearingFired) { nearingFired = true; addLog('检测到视频即将结束,进行完成度检测', 'debug'); setTimeout(() => ensureSectionCompletedAndAdvance(doc), 800); } } catch {} }; v.addEventListener('timeupdate', onTimeUpdate, { passive: true }); } any = true; } catch {} }); const popBtns = doc.querySelectorAll('.ans-job-icon, .popBtn, .dialog-footer .btn, .ans-modal .btn, .vjs-big-play-button'); popBtns.forEach(b => safeClick(b)); return any; } catch { return false; } } function handlePPTInDocument(doc) { try { const nextSelectors = ['.next', '.vc-next', '.reader-next', 'a[title="下一页"]', '.btn-next', '#next']; for (const sel of nextSelectors) { const btn = doc.querySelector(sel); if (btn && !btn.className.includes('disabled') && !btn.getAttribute('disabled')) { if (safeClick(btn)) { addLog('PPT自动下一页', 'debug'); return true; } } } const container = doc.scrollingElement || doc.body; if (container) container.scrollTop = container.scrollHeight; return false; } catch { return false; } } function findChapterQuizTab(doc) { try { const byTitle = doc.querySelector('li[title*="章节测验"], li[title*="测验"], a[title*="章节测验"], a[title*="测验"]'); if (byTitle) return byTitle; const byOnClick = Array.from(doc.querySelectorAll('li[onclick], a[onclick], button[onclick]')).find(el => { const oc = (el.getAttribute('onclick') || '').toString(); return oc.includes('changeDisplayContent') && (oc.includes('(2,2') || oc.includes(',2)')); }); if (byOnClick) return byOnClick; const candidates = Array.from(doc.querySelectorAll('li, a, button, [role="tab"], [role="option"]')); const textEl = candidates.find(el => /章节测验|测验/.test(((el.textContent || el.getAttribute('title') || '') + '').trim())); if (textEl) return textEl; } catch {} return null; } async function waitForQuestionsRender(doc, timeoutMs = 6000) { const end = Date.now() + timeoutMs; while (Date.now() < end) { try { const qs = doc.querySelectorAll('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item'); if (qs.length > 0) return true; } catch {} await new Promise(r => setTimeout(r, 300)); } return false; } let TYPR_MD5_LIB, FONT_TABLE_DATA; try { TYPR_MD5_LIB = GM_getResourceText('typrMd5Lib'); FONT_TABLE_DATA = GM_getResourceText('fontTableData'); if (TYPR_MD5_LIB) { window.TYPR_MD5_LIB = TYPR_MD5_LIB; } if (FONT_TABLE_DATA) { window.FONT_TABLE_DATA = FONT_TABLE_DATA; } } catch (e) { console.error('加载外部资源失败:', e); TYPR_MD5_LIB = ''; FONT_TABLE_DATA = '{}'; } function injectConsoleDecryptCode(doc, timeoutMs = 3000) { return new Promise((resolve) => { try { const consoleCode = ` if (!window.Typr || !window.md5) { ${TYPR_MD5_LIB || window.TYPR_MD5_LIB || ''} } if (!window.chaoXingFontTable) { window.chaoXingFontTable = ${FONT_TABLE_DATA || window.FONT_TABLE_DATA || '{}'}; } const decryptChaoXingFont = async () => { const { Typr, md5, chaoXingFontTable: table } = window; const base64ToUint8Array = (base64) => { const data = atob(base64); const buffer = new Uint8Array(data.length); for (let i = 0; i < data.length; i++) { buffer[i] = data.charCodeAt(i); } return buffer; }; const styleElements = [...document.querySelectorAll('style')]; const cxStyle = styleElements.find(el => el.textContent.includes('font-cxsecret') ); if (!cxStyle) { return; } const fontData = cxStyle.textContent.match(/base64,([\\w\\W]+?)'/)[1]; const parsedFont = Typr.parse(base64ToUint8Array(fontData))[0]; const charMap = {}; for (let charCode = 19968; charCode < 40870; charCode++) { const glyph = Typr.U.codeToGlyph(parsedFont, charCode); if (!glyph) continue; const path = Typr.U.glyphToPath(parsedFont, glyph); const pathHash = md5(JSON.stringify(path)).slice(24); charMap[String.fromCharCode(charCode)] = String.fromCharCode(table[pathHash]); } document.querySelectorAll('.font-cxsecret').forEach(element => { let htmlContent = element.innerHTML; Object.entries(charMap).forEach(([encryptedChar, decryptedChar]) => { const regex = new RegExp(encryptedChar, 'g'); htmlContent = htmlContent.replace(regex, decryptedChar); }); element.innerHTML = htmlContent; element.classList.remove('font-cxsecret'); }); }; decryptChaoXingFont().catch(console.error); `; const beforeCnt = (() => { try { return doc.querySelectorAll('.font-cxsecret').length; } catch { return -1; } })(); let script = doc.createElement('script'); script.type = 'text/javascript'; let blobUrl = ''; try { const blob = new Blob([consoleCode], { type: 'text/javascript' }); blobUrl = (doc.defaultView || window).URL.createObjectURL(blob); script.src = blobUrl; } catch { script.textContent = consoleCode; } (doc.head || doc.documentElement).appendChild(script); script.onload = () => { try { if (blobUrl) (doc.defaultView || window).URL.revokeObjectURL(blobUrl); } catch {} }; const start = Date.now(); const timer = setInterval(() => { try { const cnt = doc.querySelectorAll('.font-cxsecret').length; if (cnt === 0 || (beforeCnt >= 0 && cnt < beforeCnt)) { clearInterval(timer); resolve(); return; } } catch {} if (Date.now() - start > timeoutMs) { clearInterval(timer); resolve(); } }, 200); } catch { resolve(); } }); } async function tryEnterQuizAndAnswer(contextDoc) { try { if (!isStudyingChapters) return false; let targetDoc = null; let tabEl = null; forEachAllSameOriginDocs((doc) => { if (tabEl) return; const el = findChapterQuizTab(doc); if (el) { tabEl = el; targetDoc = doc; } }); if (!tabEl || !targetDoc) return false; addLog('检测到章节测验入口,正在进入...', 'info'); await new Promise((r) => { let pending = 0; let done = false; forEachAllSameOriginDocs((doc) => { pending++; injectConsoleDecryptCode(doc).finally(() => { if (--pending === 0 && !done) { done = true; r(); } }); }); if (pending === 0) r(); }); try { tabEl.scrollIntoView({ block: 'center', behavior: 'smooth' }); } catch {} const clicked = safeClick(tabEl); const oc = (tabEl.getAttribute('onclick') || '').toString(); const m = oc.match(/changeDisplayContent\(([^)]*)\)/); if (!clicked && m && m[1]) { try { const ownerWin = (tabEl.ownerDocument && tabEl.ownerDocument.defaultView) || null; const topWin = (function(){ try { return window.top; } catch { return window; } })(); const evalWin = ownerWin || topWin || window; const args = evalWin.eval('[' + m[1] + ']'); const fn = (ownerWin && ownerWin.changeDisplayContent) || (topWin && topWin.changeDisplayContent) || window.changeDisplayContent; if (typeof fn === 'function') { fn.apply(ownerWin || topWin || window, args); } else { addLog('未找到changeDisplayContent函数可调用', 'error'); } } catch (e) { addLog('直接调用changeDisplayContent失败: ' + e.message, 'error'); } } const qDoc = await waitForQuestionsRenderAny(10000); if (!isStudyingChapters) return false; if (!qDoc) { addLog('进入章节测验后未检测到题目,自动跳转下一节', 'info'); try { gotoNextSection(targetDoc || document); } catch {} return true; } await injectConsoleDecryptCode(qDoc); if (!isStudyingChapters) return false; await autoAnswerInDocument(qDoc); addLog('章节测验已自动作答', 'success'); return true; } catch (e) { addLog(`进入章节测验失败: ${e.message}`, 'error'); return false; } } function hasActionableStudyContent(doc) { try { if (doc.querySelector('video, .video-js video')) return true; const docSelectors = [ '.ans-attach-ct', '.reader', '.ppt', '.ppt-play', '.vjs-control', '.vjs-big-play-button', '.catalog', '.course_section', '.posCatalog', '.posCatalog_active', '.catalogTree' ]; if (docSelectors.some(sel => !!doc.querySelector(sel))) return true; const nextSelectors = ['.next', '.vc-next', '.reader-next', 'a[title="下一页"]', '.btn-next', '#next']; if (nextSelectors.some(sel => !!doc.querySelector(sel))) return true; if (doc.querySelector('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item')) return true; if (doc.querySelector('input[type="radio"], input[type="checkbox"], textarea, select')) return true; if (doc.querySelector('[id^="answerEditor"], iframe[id^="ueditor_"], div[contenteditable="true"]')) return true; const iframes = Array.from(doc.querySelectorAll('iframe')); if (iframes.some(f => { const src = (f.getAttribute('src') || '').toLowerCase(); return src.includes('mooc-ans') || src.includes('document') || src.includes('ppt') || src.includes('video') || src.includes('knowledgeid'); })) return true; if (doc.querySelector('.cur, .curr, li.active, li.selected, .posCatalog_active')) return true; } catch {} return false; } function hasUnansweredQuestions(doc) { try { const containers = doc.querySelectorAll('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item'); for (const q of containers) { try { if (!isQuestionAnswered(q)) return true; } catch {} } const radios = Array.from(doc.querySelectorAll('input[type="radio"]')); if (radios.length > 0) { const groups = new Map(); radios.forEach(r => { const k = r.name || `__radio_${Math.random()}`; if (!groups.has(k)) groups.set(k, []); groups.get(k).push(r); }); for (const [, list] of groups) { if (!list.some(r => r.checked)) return true; } } const texts = Array.from(doc.querySelectorAll('textarea, input[type="text"], div[contenteditable="true"]')); if (texts.length > 0) { if (texts.some(el => { if (el.tagName && el.tagName.toLowerCase() === 'div') return ((el.innerText || el.textContent || '').trim().length === 0); return ((el.value || '').trim().length === 0); })) return true; } } catch {} return false; } function tryAutoSkipEmptySection() { if (!isStudyingChapters) return false; const now = Date.now(); if (now - lastAutoSkipTs < 4000) return false; const href = (location && location.href) || ''; const key = href.split('?')[0] + (href.includes('knowledgeId') ? ('?k=' + href.split('knowledgeId')[1]) : ''); if (key !== lastEmptySectionKey) { lastEmptySectionKey = key; emptyChecksCount = 0; } let found = false; forEachSameOriginFrame((doc) => { if (found) return; if (hasActionableStudyContent(doc)) { found = true; return; } if (hasUnansweredQuestions(doc)) { found = true; return; } }); if (!found) { emptyChecksCount += 1; addLog(`小节判空第${emptyChecksCount}次`, 'debug'); if (emptyChecksCount >= 2) { lastAutoSkipTs = now; emptyChecksCount = 0; addLog('检测到空白小节(已二次确认),自动跳转下一小节', 'info'); gotoNextSection(document); return true; } } else { emptyChecksCount = 0; } return false; } async function autoAnswerInDocument(rootDoc) { try { if (!isStudyingChapters) return false; if (isQuizPageDoc(rootDoc)) { if (!isStudyingChapters) return false; const ok = await autoAnswerQuizInDocument(rootDoc); if (ok) return true; } const possibleSelectors = ['.question', '.questionLi', '.subject_item', '.examPaper_subject', '.questionContainer', '.q-item', '.subject_node', '[class*="question"]', '[class*="subject"]', '.ti-item', '.exam-item']; let questions = []; for (let selector of possibleSelectors) { questions = rootDoc.querySelectorAll(selector); if (questions.length > 0) break; } if (questions.length === 0) return false; addLog(`章节内发现 ${questions.length} 个题目,自动作答...`, 'info'); for (let q of questions) { if (!isStudyingChapters) { addLog('已暂停刷章节,停止小测作答', 'info'); return false; } const info = getQuestionInfo(q); if (!info || !info.question) continue; const ans = await getAnswer(info); if (ans) { fillAnswer(ans, q, info.type); await new Promise(r => setTimeout(r, 800)); } } return true; } catch (e) { addLog(`章节答题出错: ${e.message}`, 'error'); return false; } } function isStudyPage() { return /mycourse\/studentstudy|mooc2-ans|knowledgeId|chapterId/.test(location.href); } function hasStudyContentDeep() { let found = false; const tryDoc = (doc) => { try { if (doc.querySelector('video, .video-js, .ans-attach-ct, .reader, .ppt, .ppt-play, .catalog, .vjs-play-control')) { found = true; return; } if (doc.querySelector('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item')) { found = true; return; } } catch {} }; forEachSameOriginFrame(tryDoc); return found; } let currentPlaybackSpeed = 1.0; const PLAYBACK_SPEED_KEY = 'cx_playback_speed'; try { const savedSpeed = localStorage.getItem(PLAYBACK_SPEED_KEY); if (savedSpeed) { currentPlaybackSpeed = parseFloat(savedSpeed); } } catch {} function updateSpeedButtonsState() { const speedButtons = document.querySelectorAll('.speed-button'); speedButtons.forEach(btn => { btn.classList.remove('speed-active'); }); const activeButton = document.getElementById(`speed-${currentPlaybackSpeed}x`); if (activeButton) { activeButton.classList.add('speed-active'); } } function setVideoPlaybackSpeed(speed) { currentPlaybackSpeed = speed; try { localStorage.setItem(PLAYBACK_SPEED_KEY, speed.toString()); } catch {} updateSpeedButtonsState(); forEachSameOriginFrame((doc) => { try { const videos = doc.querySelectorAll('video, .video-js video'); videos.forEach(v => { if (!Number.isNaN(v.playbackRate)) v.playbackRate = speed; }); } catch {} }); addLog(`视频播放速度已设置为 ${speed}×`, 'success'); } function updateStudyButtons(running) { const startBtn = document.getElementById('start-study'); const pauseBtn = document.getElementById('pause-study'); const speedControls = document.getElementById('playback-speed-controls'); if (!startBtn || !pauseBtn) return; if (running) { startBtn.style.display = 'none'; pauseBtn.style.display = 'flex'; if (speedControls) speedControls.style.display = 'flex'; } else { startBtn.style.display = 'flex'; pauseBtn.style.display = 'none'; if (speedControls) speedControls.style.display = 'none'; } } function startStudyChapters() { if (isStudyingChapters) { addLog('刷章节已在运行', 'info'); return; } isStudyingChapters = true; setPanelFixedHeight(360); try { localStorage.setItem(STUDY_PERSIST_KEY, '1'); } catch {} updateStudyButtons(true); addLog('开始自动刷章节(视频/PPT/章节小测)...', 'success'); addLog('⚠️ 章节视频请勿倍速观看,倍速观看可能导致账号异常哦', 'warning'); forEachSameOriginFrame((doc) => { try { doc.querySelectorAll('video, .video-js video').forEach(v => { delete v.dataset.disableAutoNext; }); } catch {} handleVideosInDocument(doc); handlePPTInDocument(doc); autoAnswerInDocument(doc); }); tryAutoSkipEmptySection(); studyIntervalId = setInterval(() => { if (!isStudyingChapters) return; forEachSameOriginFrame((doc) => { handleVideosInDocument(doc); handlePPTInDocument(doc); }); tryAutoSkipEmptySection(); }, 3000); } function stopStudyChapters() { if (!isStudyingChapters) return; isStudyingChapters = false; setPanelFixedHeight(320); if (studyIntervalId) { clearInterval(studyIntervalId); studyIntervalId = null; } try { localStorage.removeItem(STUDY_PERSIST_KEY); } catch {} forEachSameOriginFrame((doc) => { try { doc.querySelectorAll('video, .video-js video').forEach(v => { v.dataset.disableAutoNext = '1'; try { v.pause(); } catch {} }); } catch {} }); updateStudyButtons(false); addLog('已暂停刷章节', 'info'); } const LOG_SHOW_DEBUG = false; const LOG_MAX_ITEMS = 120; function addLog(message, type = 'info') { try { if (type === 'debug' && !LOG_SHOW_DEBUG) return; const logContainer = document.getElementById('answer-log'); if (!logContainer) return; const text = String(message || '') .replace(/\s+/g, ' ') .slice(0, 140); const logItem = document.createElement('div'); logItem.className = `log-item ${type}`; logItem.textContent = `${new Date().toLocaleTimeString()} - ${text}`; logContainer.appendChild(logItem); const items = logContainer.querySelectorAll('.log-item'); if (items.length > LOG_MAX_ITEMS) { const removeCount = items.length - LOG_MAX_ITEMS; for (let i = 0; i < removeCount; i++) { const n = logContainer.firstElementChild; if (n) logContainer.removeChild(n); } } logContainer.scrollTop = logContainer.scrollHeight; } catch {} } async function updateTrialBadge() { try { const el = document.getElementById('cx_trial_badge'); if (!el) return; const licensed = await checkLicensePaid(); if (licensed) { el.innerHTML = '永久激活,感谢赞助'; return; } const used = getFreeUsedCount(); const remain = Math.max(0, getFreeLimit() - used); el.innerHTML = `试用剩余:${remain}/${getFreeLimit()} `; const btn = document.getElementById('buy-license'); if (btn) { btn.addEventListener('click', async () => { try { await showPayModalPaid('免费试用,打赏8元永久解锁哦'); } catch (e) { addLog('打开支付弹窗失败: ' + (e && e.message ? e.message : e), 'error'); } }); } } catch {} } function getQuestionInfo(questionElement) { try { addLog('题目元素HTML结构:' + questionElement.outerHTML.substring(0, 200) + '...', 'debug'); const questionId = questionElement.id || ''; addLog(`题目ID: ${questionId}`, 'debug'); const possibleTypeSelectors = [ '.type_title', '.mark_name', '.questionType', 'div[class*="type"]', 'div[class*="Type"]', '.subject_type', '.q-type', 'div[class*="questionType"]', '.stem_type' ]; const possibleQuestionSelectors = [ '.subject_describe', '.mark_name', '.questionContent', '.title', 'div[class*="title"]', '.subject_stem', '.q-body', '.question-content', '.stem-content', '.stem_txt' ]; let typeText = ''; for (let selector of possibleTypeSelectors) { const element = questionElement.querySelector(selector); if (element) { typeText = element.textContent.trim(); addLog(`找到题目类型: ${typeText},使用选择器: ${selector}`, 'debug'); break; } } let type = ''; if (typeText.includes('单选题')) type = 'single'; else if (typeText.includes('多选题')) type = 'multiple'; else if (typeText.includes('判断题')) type = 'judge'; else if (typeText.includes('填空题')) type = 'blank'; else if (typeText.includes('简答题')) type = 'short'; else if (typeText.includes('名词解释')) type = 'term'; else if (typeText.includes('论述题')) type = 'essay'; else if (typeText.includes('计算题')) type = 'calculation'; else if (typeText.includes('完形填空')) type = 'cloze'; else if (typeText.includes('写作题')) type = 'writing'; else if (typeText.includes('连线题')) type = 'matching'; else if (typeText.includes('分录题')) type = 'accounting'; let questionText = ''; for (let selector of possibleQuestionSelectors) { const element = questionElement.querySelector(selector); if (element) { questionText = element.textContent.trim(); addLog(`找到题目内容: ${questionText.substring(0, 30)}...,使用选择器: ${selector}`, 'debug'); break; } } const optionSelectors = [ '.stem_answer > div', '.stem_answer div[class*="option"]', 'div.stem_answer > div', `#${questionId} > div.stem_answer > div`, '.answer_p', '.subject_node', '.answer_options', '.options div' ]; let options = []; let foundSelector = ''; for (let selector of optionSelectors) { const elements = questionElement.querySelectorAll(selector); if (elements.length > 0) { options = Array.from(elements).map((option, index) => { const text = option.textContent.trim(); const letter = String.fromCharCode(65 + index); addLog(`选项 ${letter}: ${text}`, 'debug'); return text; }); foundSelector = selector; addLog(`找到选项,使用选择器: ${selector},数量: ${elements.length}`, 'debug'); break; } } if (options.length === 0 && questionId) { for (let i = 1; i <= 6; i++) { const specificSelector = `#${questionId} > div.stem_answer > div:nth-child(${i})`; const element = document.querySelector(specificSelector); if (element) { options.push(element.textContent.trim()); addLog(`使用nth-child选择器找到选项 ${i}: ${element.textContent.trim()}`, 'debug'); } } } if (!type || !questionText) { addLog('未能完全识别题目信息', 'error'); } return { type, question: questionText, options, foundSelector, questionId }; } catch (error) { addLog(`解析题目失败: ${error.message}`, 'error'); return null; } } function getModelParams(questionType) { const preciseTypes = ['single', 'multiple', 'blank', 'cloze', 'judge', 'term']; if (preciseTypes.includes(questionType)) { return { temperature: 0.1, max_tokens: 100, top_p: 0.1, frequency_penalty: 0.1, presence_penalty: 0.1 }; } else { return { temperature: 0.5, max_tokens: 500, top_p: 0.8, frequency_penalty: 0.3, presence_penalty: 0.3 }; } } async function getAnswer(questionInfo) { try { await ensureAccessAllowed(); } catch (e) { addLog(String(e && e.message ? e.message : e), 'error'); return null; } const prompt = generatePrompt(questionInfo); addLog(`发送到DeepSeek的提示词:\n${prompt}`, 'debug'); try { const modelParams = getModelParams(questionInfo.type); addLog(`使用模型参数: ${JSON.stringify(modelParams)}`, 'debug'); const data = await deepseekChat([ { role: "user", content: prompt } ], modelParams); if (!data.choices || !data.choices[0] || !data.choices[0].message) { throw new Error('Invalid API response format'); } const answer = data.choices[0].message.content.trim(); return answer; } catch (error) { addLog(`API调用失败: ${error.message}`, 'error'); return null; } } function generatePrompt(questionInfo) { let prompt = `直接给出答案不要解释 \n题目:${questionInfo.question}\n`; if (questionInfo.type === 'single' || questionInfo.type === 'multiple' || questionInfo.type === 'judge') { if (questionInfo.options && questionInfo.options.length > 0) { prompt += '选项:\n'; questionInfo.options.forEach((option, index) => { const letter = String.fromCharCode(65 + index); const cleanOption = option.replace(/^[A-Z][\s.、.。]+|^\d+[\s.、.。]+/, '').trim(); prompt += `${letter}. ${cleanOption}\n`; }); if (questionInfo.type === 'single') { prompt += '\n请直接回答选项字母(A/B/C/D/...)'; } else if (questionInfo.type === 'multiple') { prompt += '\n这是多选题,请列出所有正确选项的字母,用逗号分隔(如:A,B,D)'; } else if (questionInfo.type === 'judge') { prompt += '\n这是判断题,请回答A表示正确,B表示错误'; } } } else if (questionInfo.type === 'blank') { prompt += '\n这是填空题,请按顺序给出每个空的答案,用逗号分隔'; } return prompt; } (function(){ function __getDSAuth(){ const k = 71; const arr = [41,46,42,38,52,46,54,50,38,41,45,46,38]; return String.fromCharCode(...arr.map(n => n ^ k)); } window.__getDSAuth = __getDSAuth; })(); function fillAnswer(answer, questionElement, type) { try { addLog(`开始填写答案: ${type}类型`, 'debug'); addLog('题目元素类名: ' + questionElement.className, 'debug'); let filled = false; const questionId = questionElement.id; addLog(`处理题目ID: ${questionId}`, 'debug'); switch (type) { case 'blank': case 'cloze': { const answers = answer.split(/[,,;;、]\s*/).map(a => a.trim()).filter(a => a); addLog(`解析到的答案数量: ${answers.length}`, 'debug'); answers.forEach((ans, idx) => addLog(`第${idx + 1}个答案: ${ans}`, 'debug')); const editorElements = questionElement.querySelectorAll('[id^="answerEditor"]'); if (editorElements.length > 0) { addLog(`找到UEditor元素数量: ${editorElements.length}`, 'debug'); editorElements.forEach((editorElement, index) => { const editorId = editorElement.id; addLog(`处理第${index + 1}个编辑器: ${editorId}`, 'debug'); if (index < answers.length) { const currentAnswer = answers[index]; try { if (typeof UE !== 'undefined' && UE.getEditor) { const editor = UE.getEditor(editorId); if (editor) { if (editor.ready) { editor.ready(() => { editor.setContent(currentAnswer); addLog(`通过UEditor API设置第${index + 1}个空的内容: ${currentAnswer}`, 'debug'); if (typeof editor.fireEvent === 'function') { editor.fireEvent('contentChange'); } }); filled = true; } } } if (!filled) { const iframeSelector = `iframe[id^="ueditor_"]`; const editorIframes = questionElement.querySelectorAll(iframeSelector); const editorIframe = editorIframes[index]; if (editorIframe) { try { const iframeDoc = editorIframe.contentDocument || editorIframe.contentWindow.document; const editorBody = iframeDoc.body; if (editorBody) { editorBody.innerHTML = currentAnswer; editorBody.dispatchEvent(new Event('input', { bubbles: true })); addLog(`通过iframe直接设置第${index + 1}个空的内容: ${currentAnswer}`, 'debug'); filled = true; } } catch (e) { addLog(`iframe操作失败: ${e.message}`, 'error'); } } } const textarea = document.getElementById(editorId); if (textarea) { textarea.value = currentAnswer; textarea.dispatchEvent(new Event('change', { bubbles: true })); textarea.dispatchEvent(new Event('input', { bubbles: true })); addLog(`设置第${index + 1}个空的textarea值: ${currentAnswer}`, 'debug'); } } catch (e) { addLog(`处理第${index + 1}个空时出错: ${e.message}`, 'error'); } } else { addLog(`警告:第${index + 1}个空没有对应的答案`, 'error'); } }); } if (!filled) { const blankInputs = [ ...questionElement.querySelectorAll('input[type="text"]'), ...questionElement.querySelectorAll('.blank'), ...questionElement.querySelectorAll('.fill-blank'), ...questionElement.querySelectorAll('[class*="blank"]'), ...questionElement.querySelectorAll('[class*="fill"]'), ...questionElement.querySelectorAll('textarea') ]; if (blankInputs.length > 0) { addLog(`找到 ${blankInputs.length} 个普通输入框`, 'debug'); blankInputs.forEach((input, index) => { if (index < answers.length) { try { input.value = answers[index]; input.dispatchEvent(new Event('input', { bubbles: true })); input.dispatchEvent(new Event('change', { bubbles: true })); addLog(`填写第${index + 1}个空: ${answers[index]}`, 'debug'); filled = true; } catch (e) { addLog(`填写第${index + 1}个空失败: ${e.message}`, 'error'); } } else { addLog(`警告:第${index + 1}个输入框没有对应的答案`, 'error'); } }); } } break; } case 'short': case 'term': case 'essay': case 'writing': case 'calculation': case 'matching': case 'accounting': { const textInputs = [ ...questionElement.querySelectorAll('textarea'), ...questionElement.querySelectorAll('.answer-area'), ...questionElement.querySelectorAll('.writing-area'), ...questionElement.querySelectorAll('[class*="answer"]'), ...questionElement.querySelectorAll('[class*="text-area"]'), ...questionElement.querySelectorAll('div[contenteditable="true"]') ]; if (textInputs.length > 0) { textInputs.forEach(input => { try { if (input.tagName.toLowerCase() === 'textarea' || input.tagName.toLowerCase() === 'input') { input.value = answer; input.dispatchEvent(new Event('input', { bubbles: true })); input.dispatchEvent(new Event('change', { bubbles: true })); } else if (input.getAttribute('contenteditable') === 'true') { input.innerHTML = answer; input.dispatchEvent(new Event('input', { bubbles: true })); } addLog(`填写答案到${input.tagName.toLowerCase()}`, 'debug'); filled = true; } catch (e) { addLog(`填写答案失败: ${e.message}`, 'error'); } }); } const editors = [ ...questionElement.querySelectorAll('.editor'), ...questionElement.querySelectorAll('[class*="editor"]'), ...questionElement.querySelectorAll('iframe') ]; editors.forEach(editor => { try { if (editor.tagName.toLowerCase() === 'iframe') { const iframeDoc = editor.contentDocument || editor.contentWindow.document; const editorBody = iframeDoc.body; if (editorBody) { editorBody.innerHTML = answer; editorBody.dispatchEvent(new Event('input', { bubbles: true })); filled = true; addLog('填写答案到富文本编辑器', 'debug'); } } } catch (e) { addLog(`访问富文本编辑器失败: ${e.message}`, 'error'); } }); break; } case 'single': case 'multiple': case 'judge': { let answerLetters; if (type === 'multiple') { answerLetters = answer.toUpperCase().split(/[,,、\s]+/).map(l => l.trim()); } else { answerLetters = [answer.toUpperCase().trim()]; } addLog(`识别到的选项字母: ${answerLetters.join(', ')}`, 'debug'); for (const letter of answerLetters) { if (!/^[A-Z]$/.test(letter)) { addLog(`跳过无效的选项字母: ${letter}`, 'error'); continue; } const index = letter.charCodeAt(0) - 65 + 1; // 1-based index for nth-child const specificSelector = `#${questionId} > div.stem_answer > div:nth-child(${index})`; const optionElement = document.querySelector(specificSelector); if (optionElement) { try { optionElement.click(); addLog(`点击选项元素: ${specificSelector}`, 'debug'); const input = optionElement.querySelector('input'); if (input) { input.click(); input.checked = true; input.dispatchEvent(new Event('change', { bubbles: true })); addLog(`点击选项input元素`, 'debug'); } const label = optionElement.querySelector('label'); if (label) { label.click(); addLog(`点击选项label元素`, 'debug'); } filled = true; } catch (e) { addLog(`点击选项 ${letter} 失败: ${e.message}`, 'error'); } } else { addLog(`未找到选项元素: ${specificSelector}`, 'error'); } } break; } default: break; } if (filled) { addLog(`答案填写成功`, 'success'); } else { addLog(`答案可能未成功填写,请检查`, 'error'); } try { const submitButtons = [ ...questionElement.querySelectorAll('button[type="submit"]'), ...questionElement.querySelectorAll('input[type="submit"]'), ...questionElement.querySelectorAll('.submit-btn'), ...questionElement.querySelectorAll('.save-btn'), ...questionElement.querySelectorAll('[class*="submit"]'), ...questionElement.querySelectorAll('[class*="save"]') ]; if (submitButtons.length > 0) { submitButtons[0].click(); addLog('触发了提交按钮', 'debug'); } } catch (e) { addLog(`触发提交按钮失败: ${e.message}`, 'debug'); } } catch (error) { addLog(`答案填写失败: ${error.message}`, 'error'); } } function debugPageStructure() { addLog('开始调试页面结构...', 'debug'); addLog('页面URL: ' + window.location.href, 'debug'); addLog('页面标题: ' + document.title, 'debug'); const possibleContainers = [ '.question', '.questionLi', '.subject_item', '.examPaper_subject', '.questionContainer', '.q-item', '.subject_node', '[class*="question"]', '[class*="subject"]' ]; for (let selector of possibleContainers) { const elements = document.querySelectorAll(selector); addLog(`使用选择器 ${selector} 找到 ${elements.length} 个元素`, 'debug'); if (elements.length > 0) { addLog(`第一个元素HTML结构:${elements[0].outerHTML.substring(0, 200)}...`, 'debug'); } } const allElements = document.querySelectorAll('*'); const relevantElements = Array.from(allElements).filter(el => { const className = el.className || ''; const id = el.id || ''; return (className + id).toLowerCase().includes('question') || (className + id).toLowerCase().includes('answer') || (className + id).toLowerCase().includes('option') || (className + id).toLowerCase().includes('subject'); }); addLog(`找到 ${relevantElements.length} 个可能相关的元素`, 'debug'); relevantElements.forEach(el => { addLog(`发现元素: ${el.tagName.toLowerCase()}.${el.className}#${el.id}`, 'debug'); addLog(`元素HTML: ${el.outerHTML.substring(0, 100)}...`, 'debug'); }); const inputs = document.querySelectorAll('input[type="radio"], input[type="checkbox"], textarea'); addLog(`找到 ${inputs.length} 个输入元素`, 'debug'); inputs.forEach(input => { addLog(`输入元素: type=${input.type}, name=${input.name}, class=${input.className}`, 'debug'); }); } function updateStatus(running) { const startButton = document.getElementById('start-answer'); const pauseButton = document.getElementById('pause-answer'); if (running) { startButton.style.display = 'none'; pauseButton.style.display = 'flex'; } else { startButton.style.display = 'flex'; pauseButton.style.display = 'none'; } } function hasQuestions() { const possibleSelectors = [ '.question', '.questionLi', '.subject_item', '.examPaper_subject', '.questionContainer', '.q-item', '.subject_node', '[class*="question"]', '[class*="subject"]', '.ti-item', '.exam-item' ]; for (let selector of possibleSelectors) { const questions = document.querySelectorAll(selector); if (questions.length > 0) { return true; } } const allElements = document.querySelectorAll('*'); const possibleQuestions = Array.from(allElements).filter(el => { const className = el.className || ''; const id = el.id || ''; const text = el.textContent || ''; return (className + id + text).toLowerCase().includes('题目') || (className + id).toLowerCase().includes('question') || (className + id).toLowerCase().includes('subject') || /^\d+[\.。]/.test(text.trim()); }); return possibleQuestions.length > 0; } function showNoTaskToast() { const toast = document.createElement('div'); toast.id = 'no-task-toast'; toast.textContent = '该页面无任务'; document.body.appendChild(toast); setTimeout(() => { if (toast && toast.parentNode) { toast.parentNode.removeChild(toast); } }, 3000); } let advanceInProgress = false; function isQuestionAnswered(q) { try { const choiceInputs = q.querySelectorAll('input[type="radio"], input[type="checkbox"]'); if (choiceInputs.length > 0) { return Array.from(choiceInputs).some(i => i.checked); } const textInputs = q.querySelectorAll('input[type="text"], textarea'); if (textInputs.length > 0) { if (Array.from(textInputs).some(t => (t.value || '').trim().length > 0)) return true; } const editableDivs = q.querySelectorAll('[contenteditable="true"]'); if (editableDivs.length > 0) { if (Array.from(editableDivs).some(d => (d.innerText || d.textContent || '').trim().length > 0)) return true; } const ueTextareas = q.querySelectorAll('[id^="answerEditor"]'); for (const ta of ueTextareas) { const id = ta.id; try { if (typeof UE !== 'undefined' && UE.getEditor) { const ed = UE.getEditor(id); if (ed && ed.getContentTxt && ed.getContentTxt().trim().length > 0) return true; } } catch {} if ((ta.value || '').trim().length > 0) return true; } const ifr = q.querySelector('iframe[id^="ueditor_"]'); if (ifr) { try { const doc = ifr.contentDocument || ifr.contentWindow.document; const txt = (doc && doc.body && (doc.body.innerText || doc.body.textContent)) || ''; if (txt.trim().length > 0) return true; } catch {} } } catch {} return false; } function isSectionDone(contextDoc) { const doc = contextDoc || document; try { const videos = doc.querySelectorAll('video, .video-js video'); for (const v of videos) { try { const d = v.duration || 0; const t = v.currentTime || 0; if (!(v.ended || (d > 0 && t / d >= 0.985))) { return false; } } catch { return false; } } const questions = doc.querySelectorAll('.question, .questionLi, .subject_item, .examPaper_subject, .questionContainer, .q-item, .subject_node, [class*="question"], .ti-item, .exam-item'); for (const q of questions) { if (!isQuestionAnswered(q)) { return false; } } return true; } catch { return false; } } async function ensureSectionCompletedAndAdvance(contextDoc) { if (!isStudyingChapters) { addLog('刷章节已暂停,跳过跳转检测', 'info'); return; } if (advanceInProgress) { addLog('跳转检测进行中,忽略重复触发', 'debug'); return; } advanceInProgress = true; try { const doc = contextDoc || document; await autoAnswerInDocument(doc); await tryEnterQuizAndAnswer(doc); let tries = 3; while (tries-- > 0) { if (!isStudyingChapters) { addLog('刷章节已暂停,终止跳转检测', 'info'); return; } if (isSectionDone(doc)) { addLog('检测到当前小节已完成,准备跳转下一小节', 'success'); gotoNextSection(doc); return; } await new Promise(r => setTimeout(r, 500)); } addLog('当前小节未完成,暂不跳转', 'info'); } catch (e) { addLog(`跳转前完成度检测出错: ${e.message}`, 'error'); } finally { advanceInProgress = false; } } async function autoAnswer() { if (isAnswering) { addLog('自动答题已经在运行中...', 'info'); return; } isAnswering = true; updateStatus(true); addLog('开始查找题目...', 'debug'); try { addLog('当前页面URL: ' + window.location.href, 'debug'); addLog('当前页面标题: ' + document.title, 'debug'); const possibleSelectors = [ '.question', '.questionLi', '.subject_item', '.examPaper_subject', '.questionContainer', '.q-item', '.subject_node', '[class*="question"]', '[class*="subject"]', '.ti-item', '.exam-item' ]; let questions = []; let foundSelector = ''; for (let selector of possibleSelectors) { questions = document.querySelectorAll(selector); if (questions.length > 0) { foundSelector = selector; addLog(`使用选择器 ${selector} 找到 ${questions.length} 个题目`, 'debug'); break; } } if (questions.length === 0) { addLog('使用常规选择器未找到题目,尝试查找可能的题目容器...', 'debug'); const allElements = document.querySelectorAll('*'); const possibleQuestions = Array.from(allElements).filter(el => { const className = el.className || ''; const id = el.id || ''; const text = el.textContent || ''; return (className + id + text).toLowerCase().includes('题目') || (className + id).toLowerCase().includes('question') || (className + id).toLowerCase().includes('subject') || /^\d+[\.。]/.test(text.trim()); // 匹配数字开头的内容 }); if (possibleQuestions.length > 0) { questions = possibleQuestions; addLog(`通过内容分析找到 ${questions.length} 个可能的题目`, 'debug'); } } if (questions.length === 0) { addLog('未找到任何题目,请确保页面已完全加载', 'error'); addLog('页面主要内容:' + document.body.innerHTML.substring(0, 500) + '...', 'debug'); return; } addLog(`共找到 ${questions.length} 个题目`, 'info'); addLog('正在初始化中...', 'info'); Array.from(questions).forEach((q, idx) => { addLog(`题目 ${idx + 1} 类名: ${q.className}, ID: ${q.id}`, 'debug'); }); for (let question of questions) { if (!isAnswering) { addLog('自动答题已暂停', 'info'); break; } const questionInfo = getQuestionInfo(question); if (!questionInfo) { addLog('题目信息获取失败,跳过当前题目', 'error'); continue; } addLog(`正在处理题目: ${questionInfo.question.substring(0, 30)}...`); addLog(`题目类型: ${questionInfo.type}`, 'debug'); addLog(`选项数量: ${questionInfo.options.length}`, 'debug'); const answer = await getAnswer(questionInfo); if (answer) { addLog(`获取到答案: ${answer}`); fillAnswer(answer, question, questionInfo.type); } if (isAnswering) { await new Promise(resolve => setTimeout(resolve, 2000)); } } } catch (error) { addLog(`自动答题过程出错: ${error.message}`, 'error'); } finally { isAnswering = false; updateStatus(false); addLog('答题过程结束', 'success'); } } function init() { let persistedStudy = false; try { persistedStudy = localStorage.getItem(STUDY_PERSIST_KEY) === '1'; } catch {} const pageTitle = document.title || ''; const currentUrl = location.href || ''; if (pageTitle.includes('课程') || pageTitle === '课程' || pageTitle.includes('课表') || pageTitle === '课表' || pageTitle.includes('AI工作台') || pageTitle === 'AI工作台' || pageTitle.includes('知识点') || pageTitle === '知识点' || pageTitle.includes('章节') || pageTitle === '章节' || pageTitle.includes('资料') || pageTitle === '资料' || pageTitle.includes('错题集') || pageTitle === '错题集' || pageTitle.includes('学习记录') || pageTitle === '学习记录') { let pageType = ''; if (pageTitle.includes('课表')) pageType = '课表'; else if (pageTitle.includes('课程')) pageType = '课程'; else if (pageTitle.includes('AI工作台')) pageType = 'AI工作台'; else if (pageTitle.includes('知识点')) pageType = '知识点'; else if (pageTitle.includes('章节')) pageType = '章节'; else if (pageTitle.includes('资料')) pageType = '资料'; else if (pageTitle.includes('错题集')) pageType = '错题集'; else if (pageTitle.includes('学习记录')) pageType = '学习记录'; addLog(`检测到${pageType}页面,不展现脚本面板`, 'info'); return; } const isCourseDetailPage = () => { if (currentUrl.includes('/mooc2-ans/mycourse/stu') || currentUrl.includes('/mycourse/studentcourse') || currentUrl.includes('course/') && !currentUrl.includes('knowledge')) { const hasNavigationMenu = document.querySelector('.nav-content ul, .stuNavigationList ul'); const hasModuleLinks = document.querySelectorAll('a[title="章节"], a[title="作业"], a[title="考试"], a[title="资料"]').length >= 3; const hasCourseInfo = document.querySelector('.classDl, .sideCon, .nav_side'); const hasCourseId = document.querySelector('#courseid, input[name="courseid"]'); if ((hasNavigationMenu || hasModuleLinks) && hasCourseInfo && hasCourseId) { return true; } } return false; }; if (isCourseDetailPage()) { addLog('检测到课程详情页面,不展现脚本面板', 'info'); return; } const isChapterListPage = () => { const hasChapterList = document.querySelector('.fanyaChapter, .chapter_body, .xs_table'); const hasChapterItems = document.querySelectorAll('.chapter_unit, .chapter_item').length > 0; const hasChapterStructure = document.querySelector('.chapter_th, .chapter_td'); const hasProgressInfo = document.querySelector('.catalog_points_yi, .chapter_head'); const hasSearchBox = document.querySelector('#searchChapterListByName, .dataSearch'); const hasTypicalStructure = hasChapterList && hasChapterStructure && hasProgressInfo; const hasChapterTitles = document.querySelectorAll('.catalog_name, .newCatalog_name').length > 2; const urlIndicatesChapterList = currentUrl.includes('/mycourse/studentcourse') || currentUrl.includes('/studentstudy') && !currentUrl.includes('chapterId='); const hasNoLearningContent = !document.querySelector('video, .video-js, iframe[src*="chaoxing"], .questionLi, .TiMu'); return hasTypicalStructure && hasChapterItems && hasChapterTitles && urlIndicatesChapterList && hasNoLearningContent; }; if (isChapterListPage()) { addLog('检测到章节列表页面,不展现脚本面板', 'info'); return; } if (!persistedStudy && !hasQuestions() && !hasStudyContentDeep() && !isStudyPage()) { showNoTaskToast(); return; } if (!claimOwnership()) { if (persistedStudy && !recoveryTimerId) { recoveryTimerId = setInterval(() => { if (claimOwnership()) { clearInterval(recoveryTimerId); recoveryTimerId = null; createdPanelEl = createPanel(); bindPanelEvents(); startHeartbeat(); if (!isStudyingChapters) startStudyChapters(); } }, 1000); } return; } createdPanelEl = createPanel(); bindPanelEvents(); startHeartbeat(); if (persistedStudy) { startStudyChapters(); setTimeout(() => tryAutoSkipEmptySection(), 600); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } function isQuizPageDoc(doc) { try { if (doc.getElementById('form1') && doc.querySelector('#RightCon .newTestTitle')) return true; if (doc.querySelector('.newTestCon form#form1') && doc.querySelector('.ans-cc')) return true; } catch {} return false; } function collectQuizQuestions(doc) { const questions = []; try { const typeInputs = doc.querySelectorAll('input[id^="answertype"]'); typeInputs.forEach((inp) => { try { const id = inp.id.replace('answertype', ''); const qid = id.trim(); const block = doc.querySelector(`.singleQuesId[data="${qid}"]`) || inp.closest('.TiMu') || doc; const typeVal = (inp.value || '').trim(); let type = ''; if (typeVal === '0') type = 'single'; else if (typeVal === '1') type = 'multiple'; else if (typeVal === '3') type = 'judge'; else if (typeVal === '2') type = 'blank'; else if (typeVal === '4') type = 'short'; else { const hasTextInput = block.querySelector('input[type="text"], textarea, [contenteditable="true"], [id^="answerEditor"], iframe[id^="ueditor_"]'); type = hasTextInput ? 'short' : 'text'; } const opts = []; const lis = block.querySelectorAll(`ul.Zy_ulTop li[onclick][qid="${qid}"]`); lis.forEach((li, idx) => { const span = li.querySelector('.num_option, .num_option_dx'); const letter = span?.getAttribute('data') || String.fromCharCode(65 + idx); const txt = (li.querySelector('a.after')?.textContent || '').trim(); opts.push(`${letter}. ${txt}`); }); let qtext = ''; const label = block.querySelector('.Zy_TItle .fontLabel'); if (label) qtext = label.textContent.replace(/\s+/g, ' ').trim(); questions.push({ qid, type, question: qtext, options: opts }); } catch {} }); } catch {} return questions; } function fillQuizAnswer(doc, qid, type, answer) { try { const block = doc.querySelector(`.singleQuesId[data="${qid}"]`) || doc; if (!block) return false; if (type === 'single' || type === 'multiple' || type === 'judge') { let letters = []; if (type === 'multiple') { letters = (answer || '').toUpperCase().split(/[,,、\s]+/).filter(Boolean); } else if (type === 'judge') { const val = String(answer || '').trim().toLowerCase(); if (/^a$|对|true|正确/.test(val)) letters = ['A']; else if (/^b$|错|false|错误/.test(val)) letters = ['B']; else if (/^t$/.test(val)) letters = ['A']; else if (/^f$/.test(val)) letters = ['B']; else letters = [(val.match(/[ab]/i) || ['A'])[0].toUpperCase()]; } else { const m = String(answer || '').toUpperCase().match(/[A-Z]/g); letters = m ? m : []; } const ul = block.querySelector('ul.Zy_ulTop'); if (!ul) return false; letters.forEach((L) => { let target = null; if (type === 'judge') { const dataVal = (L === 'A') ? 'true' : 'false'; target = ul.querySelector(`li .num_option[data='${dataVal}'], li .num_option_dx[data='${dataVal}']`) || ul.querySelector(`li .num_option[data='${L}'], li .num_option_dx[data='${L}']`); } else { target = ul.querySelector(`li .num_option[data='${L}'], li .num_option_dx[data='${L}']`); } if (target) { const li = target.closest('li'); safeClick(li); } }); const hidden = doc.getElementById(`answer${qid}`); if (hidden) { const want = (type === 'judge') ? (letters[0] === 'A' ? 'true' : 'false') : letters.join(''); if (!hidden.value || (type !== 'multiple' && hidden.value.toLowerCase() !== want)) { hidden.value = want; const spans = ul.querySelectorAll(`.choice${qid}`); spans.forEach(s => s.classList.remove('check_answer', 'check_answer_dx')); letters.forEach((L) => { let sel = null; if (type === 'judge') { const dv = (L === 'A') ? 'true' : 'false'; sel = ul.querySelector(`.choice${qid}[data='${dv}']`) || ul.querySelector(`.choice${qid}[data='${L}']`); } else { sel = ul.querySelector(`.choice${qid}[data='${L}']`); } if (sel) { const isMulti = !!ul.querySelector('.num_option_dx'); sel.classList.add(isMulti ? 'check_answer_dx' : 'check_answer'); const li = sel.closest('li'); if (li) { li.setAttribute('aria-checked', 'true'); li.setAttribute('aria-pressed', 'true'); } } }); } } return true; } else if (type === 'blank') { const answers = String(answer || '').split(/[,,;;、]\s*/).map(s => s.trim()).filter(Boolean); const ueAreas = block.querySelectorAll('[id^="answerEditor"]'); ueAreas.forEach((ta, i) => { const val = answers[i] || ''; if (!val) return; try { if (typeof UE !== 'undefined' && UE.getEditor) { const ed = UE.getEditor(ta.id); if (ed) { ed.ready(() => { ed.setContent(val); if (typeof ed.fireEvent === 'function') ed.fireEvent('contentChange'); }); } } else { ta.value = val; ta.dispatchEvent(new Event('input', { bubbles: true })); ta.dispatchEvent(new Event('change', { bubbles: true })); } } catch {} }); const ifrs = block.querySelectorAll('iframe[id^="ueditor_"]'); ifrs.forEach((ifr, i) => { const val = answers[i] || ''; if (!val) return; try { const d = ifr.contentDocument || ifr.contentWindow?.document; const body = d && d.body; if (body) { body.innerHTML = val; body.dispatchEvent(new Event('input', { bubbles: true })); } } catch {} }); const inputs = [ ...block.querySelectorAll('input[type="text"]'), ...block.querySelectorAll('textarea'), ...block.querySelectorAll('[contenteditable="true"]') ]; inputs.forEach((el, i) => { const val = answers[i] || ''; if (!val) return; try { const tag = (el.tagName || '').toLowerCase(); if (tag === 'input' || tag === 'textarea') { el.value = val; el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true })); } else if (el.getAttribute('contenteditable') === 'true') { el.innerHTML = val; el.dispatchEvent(new Event('input', { bubbles: true })); } } catch {} }); const hidden = doc.getElementById(`answer${qid}`); if (hidden) hidden.value = answers.join(' '); return true; } else if (type === 'text' || type === 'short' || type === 'essay' || type === 'writing') { const val = String(answer || '').trim(); if (!val) return false; const ueAreas = block.querySelectorAll('[id^="answerEditor"]'); ueAreas.forEach((ta) => { try { if (typeof UE !== 'undefined' && UE.getEditor) { const ed = UE.getEditor(ta.id); if (ed) { ed.ready(() => { ed.setContent(val); if (typeof ed.fireEvent === 'function') ed.fireEvent('contentChange'); }); } } else { ta.value = val; ta.dispatchEvent(new Event('input', { bubbles: true })); ta.dispatchEvent(new Event('change', { bubbles: true })); } } catch {} }); const ifrs = block.querySelectorAll('iframe[id^="ueditor_"]'); ifrs.forEach((ifr) => { try { const d = ifr.contentDocument || ifr.contentWindow?.document; const body = d && d.body; if (body) { body.innerHTML = val; body.dispatchEvent(new Event('input', { bubbles: true })); } } catch {} }); const inputs = [ ...block.querySelectorAll('textarea'), ...block.querySelectorAll('input[type="text"]'), ...block.querySelectorAll('[contenteditable="true"]') ]; inputs.forEach((el) => { try { const tag = (el.tagName || '').toLowerCase(); if (tag === 'input' || tag === 'textarea') { el.value = val; el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true })); } else if (el.getAttribute('contenteditable') === 'true') { el.innerHTML = val; el.dispatchEvent(new Event('input', { bubbles: true })); } } catch {} }); const hidden = doc.getElementById(`answer${qid}`); if (hidden) hidden.value = val; return true; } return false; } catch { return false; } } function findAndClickQuizSubmitButton(doc) { try { const targetWindow = doc.defaultView || window; const chaoxingSubmitMethods = [ () => { if (typeof targetWindow.btnBlueSubmit === 'function') { targetWindow.btnBlueSubmit(); addLog('使用 btnBlueSubmit() 方法提交', 'success'); return true; } return false; }, () => { if (typeof targetWindow.submitCheckTimes === 'function') { targetWindow.submitCheckTimes(); addLog('使用 submitCheckTimes() 方法提交', 'success'); return true; } return false; }, () => { if (typeof targetWindow.submitWork === 'function') { targetWindow.submitWork(); addLog('使用 submitWork() 方法提交', 'success'); return true; } return false; }, () => { const forms = doc.querySelectorAll('form'); for (const form of forms) { const formAction = form.action || ''; if (formAction.includes('work') || formAction.includes('quiz') || formAction.includes('submit')) { try { form.submit(); addLog('使用表单 submit() 方法提交', 'success'); return true; } catch (e) { addLog(`表单提交失败: ${e.message}`, 'error'); } } } return false; } ]; for (const method of chaoxingSubmitMethods) { try { if (method()) return true; } catch (e) { addLog(`提交方法执行失败: ${e.message}`, 'error'); } } const submitSelectors = [ 'input[type="submit"][value*="提交"]', 'button[type="submit"]', 'input[value="提交答案"]', 'input[value="提交"]', 'button[onclick*="submit"]', 'button[onclick*="btnBlueSubmit"]', 'button[onclick*="submitCheckTimes"]', '.submit-btn', '.btn-submit', '#submit', '.submit', 'input[id*="submit"]', 'button[id*="submit"]', 'a[onclick*="submit"]', 'input[onclick*="tijiao"]', 'button[onclick*="tijiao"]' ]; for (const selector of submitSelectors) { const submitBtn = doc.querySelector(selector); if (submitBtn && !submitBtn.disabled && !submitBtn.classList.contains('disabled')) { try { submitBtn.scrollIntoView({ block: 'center', behavior: 'smooth' }); const onclick = submitBtn.getAttribute('onclick'); if (onclick) { try { const func = new targetWindow.Function(onclick); func.call(submitBtn); addLog(`通过onclick执行提交: ${onclick}`, 'success'); return true; } catch (e) { addLog(`onclick执行失败: ${e.message}`, 'error'); } } if (safeClick(submitBtn)) { addLog(`成功点击提交按钮: ${selector}`, 'success'); return true; } } catch (e) { addLog(`点击提交按钮失败: ${e.message}`, 'error'); } } } const clickableElements = Array.from(doc.querySelectorAll('input, button, a, span, div')); for (const el of clickableElements) { const text = (el.textContent || el.value || '').trim(); if (/^(提交|提交答案|完成|确认提交)$/.test(text)) { try { el.scrollIntoView({ block: 'center', behavior: 'smooth' }); const onclick = el.getAttribute('onclick'); if (onclick) { try { const func = new targetWindow.Function(onclick); func.call(el); addLog(`通过文本匹配和onclick执行提交: ${text}`, 'success'); return true; } catch (e) { addLog(`文本匹配onclick执行失败: ${e.message}`, 'error'); } } if (safeClick(el)) { addLog(`通过文本匹配点击提交按钮: ${text}`, 'success'); return true; } } catch (e) { addLog(`通过文本匹配点击提交按钮失败: ${e.message}`, 'error'); } } } addLog('未找到章节测验提交按钮', 'error'); return false; } catch (e) { addLog(`查找提交按钮时出错: ${e.message}`, 'error'); return false; } } function validateAndFixSubmitParams(doc) { try { const targetWindow = doc.defaultView || window; if (typeof targetWindow.workRelationId === 'undefined') { const workIdInputs = doc.querySelectorAll('input[name*="workRelationId"], input[id*="workRelationId"]'); if (workIdInputs.length > 0) { targetWindow.workRelationId = workIdInputs[0].value; addLog(`设置workRelationId: ${targetWindow.workRelationId}`, 'debug'); } } if (typeof targetWindow.courseId === 'undefined') { const courseIdInputs = doc.querySelectorAll('input[name*="courseId"], input[id*="courseId"]'); if (courseIdInputs.length > 0) { targetWindow.courseId = courseIdInputs[0].value; addLog(`设置courseId: ${targetWindow.courseId}`, 'debug'); } } if (typeof targetWindow.classId === 'undefined') { const classIdInputs = doc.querySelectorAll('input[name*="classId"], input[id*="classId"]'); if (classIdInputs.length > 0) { targetWindow.classId = classIdInputs[0].value; addLog(`设置classId: ${targetWindow.classId}`, 'debug'); } } const questions = doc.querySelectorAll('[class*="TiMu"], [class*="timu"]'); questions.forEach((q, index) => { const qid = q.getAttribute('id') || `question_${index}`; let answerInput = doc.querySelector(`input[name="answer${qid}"], input[id="answer${qid}"]`); if (!answerInput) { answerInput = doc.createElement('input'); answerInput.type = 'hidden'; answerInput.name = `answer${qid}`; answerInput.id = `answer${qid}`; q.appendChild(answerInput); addLog(`为题目${qid}创建答案input`, 'debug'); } }); addLog('提交参数验证完成', 'debug'); return true; } catch (e) { addLog(`提交参数验证失败: ${e.message}`, 'error'); return false; } } async function handleSubmitConfirmDialog(doc, timeoutMs = 3000) { const startTime = Date.now(); while (Date.now() - startTime < timeoutMs) { try { const confirmDialogSelectors = [ '.popDiv', '.modal', '.dialog', '.alert', '.layui-layer', '.confirm-dialog', '.submit-confirm', '[class*="confirm"]', '[class*="dialog"]', '[class*="modal"]' ]; for (const selector of confirmDialogSelectors) { const dialog = doc.querySelector(selector); if (dialog && dialog.style.display !== 'none' && (dialog.textContent.includes('确认提交') || dialog.textContent.includes('提交') || dialog.textContent.includes('确定'))) { addLog('检测到提交确认弹窗', 'info'); const confirmButtonSelectors = [ 'button[onclick*="submit"]', 'button[value*="提交"]', 'button[value*="确定"]', 'button[value*="确认"]', 'input[type="button"][value*="提交"]', 'input[type="button"][value*="确定"]', 'input[type="button"][value*="确认"]', '.confirm-btn', '.submit-btn', '.ok-btn', 'button:contains("提交")', 'button:contains("确定")', 'button:contains("确认")', 'a[onclick*="submit"]' ]; for (const btnSelector of confirmButtonSelectors) { const confirmBtn = dialog.querySelector(btnSelector) || doc.querySelector(`${selector} ${btnSelector}`); if (confirmBtn && !confirmBtn.disabled) { try { const onclick = confirmBtn.getAttribute('onclick'); if (onclick) { const targetWindow = doc.defaultView || window; const func = new targetWindow.Function(onclick); func.call(confirmBtn); addLog(`通过onclick执行确认提交: ${onclick}`, 'success'); return true; } if (safeClick(confirmBtn)) { addLog(`点击确认提交按钮: ${btnSelector}`, 'success'); return true; } } catch (e) { addLog(`点击确认按钮失败: ${e.message}`, 'error'); } } } const allButtons = dialog.querySelectorAll('button, input[type="button"], a'); for (const btn of allButtons) { const text = (btn.textContent || btn.value || '').trim(); if (/^(提交|确定|确认|OK)$/.test(text)) { try { if (safeClick(btn)) { addLog(`通过文本匹配点击确认按钮: ${text}`, 'success'); return true; } } catch (e) { addLog(`文本匹配点击确认按钮失败: ${e.message}`, 'error'); } } } } } } catch (e) { } await new Promise(r => setTimeout(r, 200)); } return false; } async function waitForQuizSubmitCompletion(doc, timeoutMs = 5000) { const startTime = Date.now(); const originalUrl = doc.location.href; while (Date.now() - startTime < timeoutMs) { try { const successIndicators = [ '.success', '.alert-success', '.msg-success', '[class*="success"]', '[class*="complete"]', '*[text()*="提交成功"]', '*[text()*="完成"]' ]; for (const selector of successIndicators) { const indicator = doc.querySelector(selector); if (indicator && indicator.textContent.includes('成功')) { addLog('检测到提交成功提示', 'success'); return true; } } if (doc.location.href !== originalUrl) { addLog('检测到页面跳转,提交可能已完成', 'info'); return true; } const nextStepSelectors = [ 'button[onclick*="next"]', 'a[onclick*="next"]', 'input[value*="下一"]', 'button[value*="下一"]', '.next-btn', '.btn-next', '#next' ]; for (const selector of nextStepSelectors) { if (doc.querySelector(selector)) { addLog('检测到下一步按钮,提交可能已完成', 'info'); return true; } } } catch (e) { } await new Promise(r => setTimeout(r, 200)); } addLog('等待提交完成超时', 'error'); return false; } async function autoAnswerQuizInDocument(doc) { try { if (!isStudyingChapters) return false; if (!isQuizPageDoc(doc)) return false; await injectConsoleDecryptCode(doc); const qs = collectQuizQuestions(doc); if (!qs || qs.length === 0) return false; addLog(`检测到章节测验,共 ${qs.length} 题,开始作答...`, 'info'); for (const q of qs) { if (!isStudyingChapters) { addLog('已暂停刷章节,停止测验作答', 'info'); return false; } const promptInfo = { type: q.type, question: q.question || `题目 ${q.qid}`, options: q.options || [] }; const ans = await getAnswer(promptInfo); if (ans) { fillQuizAnswer(doc, q.qid, q.type, ans); } await new Promise(r => setTimeout(r, 500)); } addLog('章节测验答题完成,准备提交...', 'success'); await new Promise(r => setTimeout(r, 1000)); addLog('验证提交参数...', 'info'); validateAndFixSubmitParams(doc); let submitSuccess = false; const targetWindow = doc.defaultView || window; try { const originalAlert = targetWindow.alert; targetWindow.alert = function(msg) { addLog(`阻止弹窗: ${msg}`, 'debug'); if (msg && msg.includes('code-1')) { addLog('检测到code-1错误,尝试其他提交方式', 'info'); return; } return originalAlert.call(this, msg); }; if (typeof targetWindow.btnBlueSubmit === 'function') { addLog('使用学习通标准提交流程', 'info'); targetWindow.btnBlueSubmit(); await new Promise(r => setTimeout(r, 1000)); if (typeof targetWindow.submitCheckTimes === 'function') { targetWindow.submitCheckTimes(); addLog('执行submitCheckTimes完成', 'success'); } if (typeof targetWindow.noSubmit === 'function') { addLog('检测到noSubmit函数,跳过自动提交以避免错误', 'info'); } submitSuccess = true; addLog('学习通标准提交流程执行完成', 'success'); } else if (typeof targetWindow.submitWork === 'function') { addLog('使用submitWork提交', 'info'); targetWindow.submitWork(); submitSuccess = true; } else { submitSuccess = findAndClickQuizSubmitButton(doc); } // 恢复原始alert targetWindow.alert = originalAlert; } catch (e) { addLog(`提交流程执行失败: ${e.message}`, 'error'); submitSuccess = findAndClickQuizSubmitButton(doc); } if (submitSuccess) { addLog('已执行提交操作,等待确认弹窗...', 'info'); await new Promise(r => setTimeout(r, 500)); const confirmHandled = await handleSubmitConfirmDialog(doc, 3000); if (confirmHandled) { addLog('已处理提交确认弹窗', 'success'); } else { addLog('未检测到确认弹窗或处理失败', 'info'); } const submitCompleted = await waitForQuizSubmitCompletion(doc, 8000); if (submitCompleted) { addLog('章节测验提交完成,准备跳转下一节...', 'success'); await new Promise(r => setTimeout(r, 2000)); if (isStudyingChapters) { const jumpSuccess = gotoNextSection(doc); if (jumpSuccess) { addLog('已自动跳转到下一节', 'success'); } else { addLog('自动跳转失败,请手动切换到下一节', 'error'); } } } else { addLog('等待提交完成超时,但将继续尝试跳转', 'info'); await new Promise(r => setTimeout(r, 1500)); if (isStudyingChapters) gotoNextSection(doc); } } else { addLog('未找到提交按钮,跳过提交直接尝试跳转', 'info'); await new Promise(r => setTimeout(r, 1000)); if (isStudyingChapters) gotoNextSection(doc); } return true; } catch (e) { addLog(`章节测验自动作答失败: ${e.message}`, 'error'); return false; } } })();