// ==UserScript== // @name 学习通答题刷课小助手 // @namespace http://tampermonkey.net/ // @version 1.0.0 // @description 全面覆盖各类题型,题目识别精准,答案准确率高。支持自动刷课、自动答题。 // @author kaven // @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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0lFBQuaM0lFAC0UUUAFFFFAC0UUUAFFFFABRRRQAtFFFABRRRQAUUUUALRRRQAUUUVIC0UUUwCiiigAooooAWiiigApaSigBaKKKACiiigAooooAKKKKAFooooAKKKKACiiigAooooAWiiigAooooAKKKKACiiigBaKKKCQooooAWiiigAooooAKKKKACiiikMKKKKAFopM0ZoELRSZozQAtFFFAC0UlLQAUUUUAFFFA60ASIKveDdPtdd1bWdNvUBRoI9rd1OW5FU4+laPwub/istV/64R/zaujDq8rHm5hJxp3RzWqadd+HNXbTr8AqDmGX+GRexHv6irMUgYV61408NQ+JdHa3bC3MfzQSejen0NeLoJ7K7ls7xTFNCdjKfbv9DVV6PLqicDi1Wjyy3NMGlqGNw1Sg1ynpi0UUUAFFFFMAooooAWiiigAooooAKWkooCwtLikooJFooooAKKKKAFooooGKDTgajFOzSJJVkxU8cxHeqYNPU4ppkuKZpRTZ71chm96x0fBq1FLWiZhOBtRyAjmpCM1mxS+9XIpc1RxyjYe6VXdKuDkUx0ptApWM519KZirMiVHtqDeMtDz0U8UwU8VTO6KHinCminCs2zVIcKcKaKcKBjqKKKAFooopAFFFFABRRRQAtFFFAC0UUUAFFFFABRRRQAUUUUALRRRQAUUUUALRRRQAUUUUAFFFFAC0UUVIBRRRTAKKKKACiiigBaKKKACiiigAooooAKKKKAFooooAWiiikAUUUUAFFFFMAooooAKKKKACiiigBaKKKQgooooAWiiimIKKKKACiiigBaKKKACiiigAooooAKKKKQAaKDRQAUUUUwFooooAKKKKACgUUUATR9DV74V/wDI6av/ALMMX82qinSr3wr/AOR01n/rjF/Nq6sL8R5WZO1I9iifgVxPxN8H/wBr2x1PTUCahbjJx/y1X0Pv6V2cPQVIe9elOKkrM+XpVZUpqUT50sLjcNrAqwOCp6gjtWmpyAa6L4p+Emsp217SY28tjm6iQdPRwP51yVjdLNGCDkGvJq03Bn2OFxEa8LrcvUU0dKWsDrFooophYKKKKACiiikAUUUUALRSUtMLhS0lFAXFooooEFFFFABRRRQAtFFFAhaKKKAHq2KlR6gpQcGgTVy/DLg1egl6c1jxvVqGXFWmYTpm5DLU2dw4rLhl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KKKAFooooAKKKKACiiigAooooAWiiimAtFFFIAooooAKKKKAFooooAKKKKACiiigQUUUUALQKKBQMWiiigAooooC4UUUUE2FooooGFFFFABRRRQAUUUUAFFFFAC0UUUAFFFFAC0UUVIBRRRQAUUUVQC0UUUAFFFFIAooooAKKKKAFooopgFFFFABRRRUgLRRRQAUUUUAFFFFAC0UUUwCiiigAooooAKKKKADNJQTio2lxQBLSbqpTXir/FVT7c083k2yPPKeiRAs35CqjFvYidSEFds1zNitD4RP5vjXVP7v2dP5motF8BeJtYZZLiJNMgP8UzZbHso/rivQvBngCy8LXNxdpdS3VzcIFdnXAAGeg59a7qFJxd2fPZhjYVI8sTrl6ClpB0p1dh4AlFFFAgpaBRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACUUUUgFopK5/xx4gXQdHeVebiT93Evcsf8Kcnyq5pSpupNRicV8UNfN/erolm37qHElyQeCf4U/qfwrmYk2ADFQ20bktLOxkllYvI5/iY9atAV49Wo5yufa4WgqMFFC0UUVkdQUUUUCFooopgLRRRQIyBTqaKdTNBaKKKACiiigBaKKKAFooooAKKKKACiiigAooooAWiiimAUUUUrgLRRRQAUUUUWAWiiigAooooAKKKKACiiigBaKKKACiiigAooooAWiiigAooooAWiiigAooooAKKKKBBRRRQAtFFFABRRRSAKKKKACiiigBaKKKYC0UUUgCiiigAooooC4UUUUALRRRQAlFFFAC0UUUALRRRQAUUUUAFFFFIAooooAKKSkzQA7mkyajeYL1YCqst+i9DmqUbg2o7l0n3qGScJ/FVC2lu9QlMOnWk11ITjESk/meg/Ouu0X4Y6zqGJdXuE0+I8+Wvzyfjjgfma2jQlI4a2Op0upylxqKx9WA/GrelaB4h1+QDT9PlSJv8AltN8iD8+T+ANeu6D4C0DRyjx2f2mYf8ALWf5m/wrp0UIoVVwo6AcYrqhh0tzxq2bSlpBHmWh/CK3BWTX797p+phg+VAf97qfyFd5pGgaXo0Ij02xhgA7qBn8zzWjRXSoRjsjyJ1p1H7zCiiiqMQooooAKKKKAFooooGFFFFAgooooAKKKKACiiigAooooAKKKKACiiigBKKKKAFooopgQ3M6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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 = 'NS4wMA=='; return atob(b64); } catch { return '5.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;'; const box = document.createElement('div'); box.style.cssText = 'position:fixed;left:50%;top:120px;transform:translateX(-50%);width:420px;background:#fff;border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.2);overflow:hidden;z-index:999999;font-family:system-ui,Segoe UI,Arial;'; const msg = messageText || '试用已用完,打赏5元永久解锁哦'; 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;'; const box = document.createElement('div'); box.style.cssText = 'position:fixed;left:50%;top:120px;transform:translateX(-50%);width:400px;background:#fff;border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.2);overflow:hidden;z-index:999999;font-family:system-ui,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 = '#52c41a'; 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: Dark Glass Theme */ #answer-helper-panel { position: fixed; top: 24px; left: 24px; width: 680px; min-width: 560px; backdrop-filter: blur(12px) saturate(120%); background: linear-gradient(180deg, rgba(22,24,28,0.85), rgba(16,18,22,0.85)); border: 1px solid rgba(255,255,255,0.08); border-radius: 12px; padding: 0; z-index: 9999; box-shadow: 0 8px 32px rgba(0,0,0,0.35); font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; color: #d7d9df; user-select: none; overflow: hidden; } /* Header */ #answer-helper-header { cursor: move; height: 44px; padding: 0 16px; display: flex; align-items: center; justify-content: space-between; background: linear-gradient(180deg, rgba(28,30,34,0.9), rgba(20,22,26,0.9)); border-bottom: 1px solid rgba(255,255,255,0.06); font-size: 15px; letter-spacing: 0.2px; } #answer-helper-header .title { display: inline-flex; align-items: center; gap: 8px; font-weight: 600; color: #e8eaef; } #answer-helper-header .title .accent { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: radial-gradient(circle, #4cc9f0 0%, #4361ee 65%, transparent 66%); box-shadow: 0 0 12px #3a86ff70; } #answer-helper-header .right { display: inline-flex; align-items: center; gap: 8px; } #answer-helper-header .collapse-btn { width: 30px; height: 30px; border-radius: 30px; background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.08); cursor: pointer; color: #cfd3da; display: flex; align-items: center; justify-content: center; transition: transform .15s ease, background .15s ease, color .15s ease; } #answer-helper-header .collapse-btn:hover { background: rgba(67,97,238,0.25); color: #ffffff; transform: scale(1.04); } .collapse-btn-inner { width: 16px; height: 16px; position: relative; } .collapse-icon-bar.horizontal { width: 14px; height: 2px; background: currentColor; border-radius: 2px; position: absolute; left: 1px; top: 7px; } .collapse-icon-bar.vertical { width: 2px; height: 14px; background: currentColor; border-radius: 2px; position: absolute; left: 7px; top: 1px; } /* Content */ #answer-helper-content { padding: 10px 14px; } #answer-helper-panel.collapsed #answer-helper-content { display: none; } #answer-helper-panel.collapsed { width: 220px; min-width: 180px; } /* Two-column body: main + right actions column */ #answer-helper-content .panel-body { display: grid; grid-template-columns: 1fr 200px; gap: 10px; align-items: start; } .panel-main { min-width: 0; } .panel-actions.panel-column { display: flex; flex-direction: column; gap: 8px; } .panel-actions.panel-column .ah-btn { flex: unset; min-height: 56px; padding: 10px 12px; flex-direction: row; align-items: center; justify-content: flex-start; gap: 10px; } .panel-actions.panel-column .button-icon { font-size: 16px; } .panel-actions.panel-column .button-text { font-size: 12.5px; } /* Toast */ #no-task-toast { position: fixed; top: 20px; right: 20px; background: rgba(16,18,22,0.9); border: 1px solid rgba(255,255,255,0.06); color: #e8eaef; padding: 10px 16px; border-radius: 10px; font-size: 13px; z-index: 10000; animation: fadeInOut 3s ease-in-out forwards; font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; } @keyframes fadeInOut { 0% { opacity: 0; transform: translateY(-10px); } 10% { opacity: 1; transform: translateY(0); } 90% { opacity: 1; transform: translateY(0); } 100% { opacity: 0; transform: translateY(-10px); } } /* Terminal Log */ #answer-log { height: 160px; overflow-y: auto; border: 1px solid rgba(255,255,255,0.06); border-radius: 12px; padding: 8px 10px 8px 12px; margin: 8px 0 10px; font-size: 12.5px; line-height: 1.55; font-family: SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; background: radial-gradient(1200px 400px at 10% 10%, rgba(45,47,58,0.85), rgba(24,26,32,0.9)); } #answer-log::-webkit-scrollbar { width: 8px; height: 8px; } #answer-log::-webkit-scrollbar-track { background: rgba(255,255,255,0.04); border-radius: 10px; } #answer-log::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.18); border-radius: 10px; } .log-item { margin-bottom: 8px; padding: 8px 10px; border-radius: 8px; background: rgba(255,255,255,0.03); } .success { color: #90ee90; border-left: 3px solid #36c06a; } .error { color: #ff6b6b; border-left: 3px solid #ef4444; } .debug { color: #7aa2ff; border-left: 3px solid #3a86ff; } .info { color: #aeb4c0; border-left: 3px solid #9aa0a6; } /* Button Grid */ /* (previous grid tile layout removed for right-side column design) */ .ah-btn { flex: 1; padding: 10px 12px; border: 1px solid rgba(255,255,255,0.08); border-radius: 10px; font-size: 13px; font-weight: 600; letter-spacing: 0.2px; cursor: pointer; transition: all .18s ease; display: flex; align-items: center; justify-content: center; gap: 6px; color: #e8eaef; background: rgba(255,255,255,0.06); } .ah-btn:hover { transform: translateY(-1px); background: rgba(67,97,238,0.18); border-color: rgba(67,97,238,0.35); } .ah-primary { background: linear-gradient(180deg, rgba(67,97,238,0.35), rgba(58,86,235,0.25)); } .ah-danger { background: linear-gradient(180deg, rgba(255,77,79,0.35), rgba(255,77,79,0.18)); } .ah-secondary { background: rgba(255,255,255,0.08); color: #d7d9df; } .ah-success { background: linear-gradient(180deg, rgba(54,192,106,0.35), rgba(54,192,106,0.18)); } .button-icon { font-size: 14px; line-height: 1; } /* Speed buttons state */ .speed-button { transition: all .15s ease; } .speed-active { background: linear-gradient(180deg, rgba(67,97,238,0.55), rgba(58,86,235,0.45)); color: #fff; } #playback-speed-controls.segmented { display: flex; gap: 8px; justify-content: flex-end; margin-top: 10px; } #playback-speed-controls.segmented .ah-btn { min-width: 72px; padding: 8px 10px; } /* Misc */ #debug-page{ display:none !important; } #answer-helper-panel .cx-trial-badge{ position: absolute; left: 12px; bottom: 8px; color: #aeb4c0; font-size: 12px; pointer-events: none; } #answer-helper-content { padding-bottom: 18px; } `); function createPanel() { const panel = document.createElement('div'); panel.id = 'answer-helper-panel'; panel.innerHTML = `
研习助手 · CX
检测中...
`; document.body.appendChild(panel); 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 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('免费试用,打赏5元永久解锁哦'); } catch (e) { addLog('打开支付弹窗失败: ' + (e && e.message ? e.message : e), 'error'); } }); } document.getElementById('debug-page')?.addEventListener('click', () => { debugPageStructure(); }); 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; 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; 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(); const buyBtn = document.getElementById('buy-license'); if (buyBtn) { const group = buyBtn.closest('.button-group'); if (licensed) { if (group) group.style.display = 'none'; else buyBtn.style.display = 'none'; } else { if (group) group.style.display = 'flex'; else buyBtn.style.display = 'flex'; } } if (licensed) { el.textContent = '永久激活,感谢赞助'; return; } const used = getFreeUsedCount(); const remain = Math.max(0, getFreeLimit() - used); el.textContent = `试用剩余:${remain}/${getFreeLimit()}`; } 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 = [42,62,35,46,36,44,49,34,53,62,37,46,32]; 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; } } })();