// ==UserScript== // @name 山东教师教育网2026学习助手完美版 // @namespace 鉴紫 // @version 4.0.1 // @description 修复了偶尔掉线的问题。 // @author 鉴紫 // @license MIT // @match *://player.qlteacher.com/* // @match *://yxjc.qlteacher.com/* // @match *://*.qlteacher.com/* // @match *://qlteacher.com/* // @grant none // @run-at document-end // ==/UserScript== (function () { 'use strict'; /* ====================================================================== * 配置 * ==================================================================== */ const POLL_MS = 1000; // 轮询间隔 const VIDEO_WAIT = 60000; // 等视频出现的上限 const NO_VIDEO_GRACE = 25000; // 非视频类活动(文档/图文)停留时间 const FINISH_GRACE = 40000; // 视频播完后等平台记为"已完成"的宽限时间 const ACT_TIMEOUT = 3 * 3600e3; // 单节最长占用时间,防卡死 const MAX_ATTEMPT = 3; // 视频类节点最多重试次数,超过则跳过 const NONVIDEO_ATTEMPT = 5; // 测试/图文类节点多给几次机会(题目要多做几遍才能过) const STORE_KEY = 'qlte_auto_v2'; const AUTO_CLOSE_MS = 5000; // 卡住的提示弹窗:5 秒没人点就自动关掉,回列表继续下一门 const GIVEUP_MS = 10 * 60000; // 判定“平台不认账”的课程,10 分钟内不再重试 const LASTCARD_MS = 3 * 60000; // 从课程列表点进去的记录,3 分钟内有效 const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); const rand = (a, b) => Math.floor(a + Math.random() * (b - a)); // 模拟真人的随机停顿 const log = (...a) => console.log('[全自动刷课]', ...a); /* ====================================================================== * 本地记录(刷新/跳转后仍然记得进度) * ==================================================================== */ function loadState() { try { const s = JSON.parse(localStorage.getItem(STORE_KEY) || '{}'); return { projectId: isProjectId(s.projectId) ? s.projectId : '', finished: s.finished || {}, // courseId -> 完成时间戳 attempts: s.attempts || {}, // "courseId/actId" -> 次数 skipped: s.skipped || [], // 跳过的活动描述 lastCourse: s.lastCourse || '', lastCourseAt: s.lastCourseAt || 0, visitedCourses: s.visitedCourses || [], lastCard: s.lastCard || null, // 列表里刚点进去的卡片 { title, at } giveUp: s.giveUp || {}, // courseId -> 放弃时间戳 giveUpCard: s.giveUpCard || {}, // 卡片标题 -> 放弃时间戳(列表里先绕开这几门) answerKey: s.answerKey || {}, // 题干指纹 -> 正确答案字母(第二遍照着答) quizKey: s.quizKey || {}, // 视频弹题指纹 -> 试出来的正确选项组合 blindPick: s.blindPick || {}, // 题干指纹 -> 最近几轮盲选过的组合(防止每轮都选同一组) paused: !!s.paused, // 暂停开关(刷新后保持暂停) projects: (s.projects || []).filter(isProjectId), // 确认过「有课程卡片」的项目号,最近的在前 badProjects: s.badProjects || {}, // 旧版的黑名单,保留兼容 noEnroll: s.noEnroll || {}, // 显示过「尚未报名」的学段 -> 时间戳(永久排除) myStage: isProjectId(s.myStage) ? s.myStage : '', // 我的学段(读到课程卡片才锁定,之后不再乱跳) lastProject: isProjectId(s.lastProject) ? s.lastProject : '', // 最近一次打开的项目页 probe: s.probe || null, // 找学段的尝试记录(保证跳几次就停,不来回转圈) }; } catch (e) { return { projectId: '', finished: {}, attempts: {}, skipped: [], lastCourse: '', lastCourseAt: 0, visitedCourses: [], lastCard: null, giveUp: {}, giveUpCard: {}, answerKey: {}, quizKey: {}, blindPick: {}, paused: false, projects: [], badProjects: {}, noEnroll: {}, myStage: '', lastProject: '', probe: null }; } } const STATE = loadState(); function saveState() { try { localStorage.setItem(STORE_KEY, JSON.stringify(STATE)); } catch (e) {} } /* ====================================================================== * 学段 / 项目号:小学 xx2026、初中 cz2026、高中 gz2026 * 这门课三种学段的老师都在用,项目号绝不能写死成高中 —— 以前兜底写 gz2026, * 小学/初中的老师一刷完章节就被扔到高中的项目页(还显示「尚未报名」), * 只能手动退回来。 * 认项目的顺序:确认过有课程卡片的项目 → 当前网址 → 页面标题里的学段 → 都试一遍 * ==================================================================== */ const STAGE_PROJECT = { '小学': 'xx2026', '初中': 'cz2026', '高中': 'gz2026' }; const STAGE_NAME = { xx2026: '小学', cz2026: '初中', gz2026: '高中' }; const ALL_PROJECTS = ['xx2026', 'cz2026', 'gz2026']; /* 项目号长这样:gz2026 / cz2026 / xx2026。课程 id 是 24 位十六进制, * 一旦拿课程 id 去拼项目地址,就会落到「尚未报名」那种空页面上。 */ function isProjectId(pid) { return !!pid && /^[a-z]{2,3}\d{4}$/i.test(pid); } function stageLabel(pid) { return STAGE_NAME[pid] || (pid ? pid : '未知'); } /* 学段必须跨子域共享:课程列表在 yxjc.qlteacher.com,单元列表/播放页在 * player.qlteacher.com,两个站的 localStorage 是彼此独立的两份。 * 以前只存 localStorage,播放页那一份永远是空的 —— 一门课学完,播放页 * 按「不知道学段」的兜底跳到了小学的课程列表,小学页又显示「尚未报名」, * 于是弹回高中;下一门课学完再跳小学……表现就是在高中和小学之间乱跳。 * 存在 .qlteacher.com 的 cookie 里,两个子域就都能读到同一份。 */ const STAGE_COOKIE = 'qlte_stage_2026'; function readStageCookie() { try { const m = ('; ' + (document.cookie || '')).match( new RegExp(';\\s*' + STAGE_COOKIE + '=([0-9a-zA-Z]+)')); return m && isProjectId(m[1]) ? m[1] : ''; } catch (e) { return ''; } } function writeStageCookie(pid) { try { const dom = /(^|\.)qlteacher\.com$/i.test(location.hostname) ? '; domain=.qlteacher.com' : ''; const val = isProjectId(pid) ? pid : ''; document.cookie = STAGE_COOKIE + '=' + val + '; path=/' + dom + '; max-age=' + (val ? 60 * 86400 : 0) + '; SameSite=Lax'; } catch (e) {} } /* 播放页自己没有学段,但它的 referrer 是 yxjc 的 /learning/gz2026/{课程id}, * 这一跳是平台自己做的,referrer 基本都在,是播放页唯一可靠的学段来源。 * 只许播放页用:在 yxjc 的页面上,referrer 是「上一个页面」(可能就是刚被判未报名 * 的那个学段),拿它当依据会把错的学段锁死,然后开始来回跳。 */ function stageFromReferrer() { if (location.hostname !== 'player.qlteacher.com') return ''; try { const r = document.referrer || ''; const m = r.match(/\/learning\/([a-z]{2,3}\d{4})\//i); return m && isProjectId(m[1]) ? m[1] : ''; } catch (e) { return ''; } } /* 项目页有两种写法:/project/{学段}/…(课程中心、课程列表) * 和 /pre-project/{学段}(项目首页,未报名时平台就停在这儿)。两个都要认。 */ function projectFromUrl() { const m = location.pathname.match(/^\/(?:pre-)?project\/([0-9a-zA-Z]+)/); return m && isProjectId(m[1]) ? m[1] : ''; } // 页面标题或顶部横幅写着「高中--2026年山东省…」,据此认这一页属于哪个学段。 // 只认「学段--2026」这种写在一起的标题,别去正文里瞎搜 —— 站内导航常把三个学段 // 名字都列一遍,一搜就会认错。 function projectFromStage() { let t = ''; try { t = (document.title || '') + ' ' + (document.body ? document.body.innerText.slice(0, 600) : ''); } catch (e) {} const m = t.match(/(小学|初中|高中)\s*[--—~~]{1,3}\s*(?:2026|二〇二六)/); if (m) return STAGE_PROJECT[m[1]] || ''; try { const ti = (document.title || '').replace(/\s+/g, ''); const m2 = ti.match(/(小学|初中|高中)/); if (m2 && /2026/.test(ti)) return STAGE_PROJECT[m2[1]] || ''; } catch (e) {} return ''; } /* 我的学段:先看本地记录,再看跨子域的 cookie(播放页只能靠 cookie)。 * 一旦写上就是死的,只有两种东西能改它: * ① 在某个学段的课程列表里真的读到了课程卡片(那是报名证据); * ② 用户自己点面板上的学段按钮。 */ function myStage() { if (isProjectId(STATE.myStage)) return STATE.myStage; const c = readStageCookie(); return isProjectId(c) ? c : ''; } // 记下最近打开的项目页:没有确认过的学段时,它比瞎猜顺序靠谱 function rememberProjectInUrl() { const p = projectFromUrl(); if (!p) return; if (STATE.lastProject !== p) { STATE.lastProject = p; saveState(); } } /* 记下学段。force 只有两处会给:读到课程卡片的列表页、用户手动切学段。 * 其它地方(单元列表地址、参考页标题)只用来补空,绝不覆盖已经定下来的学段 —— * 以前这里谁调都改,一次误入别的学段页就把锁改了,然后开始两头跑。 */ function markProjectGood(pid, force) { if (!isProjectId(pid)) return false; if (isNoEnroll(pid) && !force) { log('学段', pid, '在未报名名单里,不采用(真要是它,请点面板上的学段按钮手动选)'); return false; } if (force) delete noEnrollMap()[pid]; // 用户手动指定 = 重新认可这个学段 const lock = myStage(); if (lock && lock !== pid && !force) { log('学段已经锁定为', lock, '(' + stageLabel(lock) + '),这次看到的', pid, '不采用;要换学段请点面板上的学段按钮'); return false; } STATE.myStage = pid; // 锁定学段 STATE.myStageAt = Date.now(); STATE.projectId = pid; STATE.probe = null; // 找到学段了,试错记录清零 delete STATE.attempts['#notEnroll']; STATE.badProjects = STATE.badProjects || {}; delete STATE.badProjects[pid]; const list = (STATE.projects || []).filter(x => x !== pid); list.unshift(pid); STATE.projects = list.slice(0, 4); writeStageCookie(pid); // 播放页(player 子域)靠它拿到学段 saveState(); try { refreshStageChip(); } catch (e) {} return true; } /* 显示过「您尚未报名参与本次研修项目」的学段 = 不是这个用户的学段,永久排除。 * 这是全脚本最硬的一条规则:只要那一页出现过,往后任何跳转都不许再回到它, * 连已经锁定的学段也一样 —— 锁定只是猜测,未报名页是事实。 */ function noEnrollMap() { STATE.noEnroll = STATE.noEnroll || {}; return STATE.noEnroll; } function isNoEnroll(pid) { return !!pid && !!noEnrollMap()[pid]; } function markNoEnroll(pid) { if (!isProjectId(pid)) return; const m = noEnrollMap(); m[pid] = Date.now(); STATE.projects = (STATE.projects || []).filter(x => x !== pid); if (STATE.projectId === pid) STATE.projectId = ''; if (STATE.lastProject === pid) STATE.lastProject = ''; if (STATE.myStage === pid) { STATE.myStage = ''; // 锁错了就当场解开 writeStageCookie(''); } saveState(); log('排除学段:', pid, '(' + stageLabel(pid) + ')显示未报名,以后不再往这里跳'); try { refreshStageChip(); } catch (e) {} } /* 候选学段:我的学段 → 读过卡片的项目 → 最近打开的项目页 → 当前网址 → 页面写明的学段 → 剩下两个。 * 显示过未报名的学段整个剔掉,连兜底都不给 —— 那正是来回跳的根源。 */ function projectCandidates() { const out = []; const push = (p) => { if (isProjectId(p) && !isNoEnroll(p) && out.indexOf(p) < 0) out.push(p); }; push(myStage()); (STATE.projects || []).forEach(push); push(STATE.projectId); push(STATE.lastProject); push(projectFromUrl()); push(projectFromStage()); ALL_PROJECTS.forEach(push); return out; } /* 找学段的尝试记录:用来保证「最多跳几次就停」,不会在三个学段之间来回转圈 */ function probeState() { const p = STATE.probe || {}; if (!p.at || Date.now() - p.at > 20 * 60 * 1000) { return { at: Date.now(), hops: 0, tried: [] }; } return { at: p.at, hops: p.hops || 0, tried: p.tried || [] }; } /* 认不出学段时去哪儿:绝不写死某个学段,按已知信息挑最像的一个。 * 顺序里特意把「参考页地址」放在兜底之前 —— 播放页虽然自己没有学段, * 但它是从 /learning/gz2026/{课程id} 跳过来的。显示过未报名的学段一律跳过。 */ function homeProject() { const cands = [ myStage(), (STATE.projects || [])[0], isProjectId(STATE.projectId) ? STATE.projectId : '', isProjectId(STATE.lastProject) ? STATE.lastProject : '', projectFromUrl(), stageFromReferrer(), projectFromStage(), readStageCookie(), ]; for (const p of cands) if (isProjectId(p) && !isNoEnroll(p)) return p; for (const p of ALL_PROJECTS) if (!isNoEnroll(p)) return p; return ALL_PROJECTS[0]; // 三个都显示过未报名:兜底,同时会弹窗让人手动选 } function projectListUrl(pid) { return 'https://yxjc.qlteacher.com/project/' + (isProjectId(pid) ? pid : homeProject()) + '/lesson/learn'; } /* 这一页写着「您尚未报名参与本次研修项目」= 开成了别的学段,不是自己报名的项目。 * 别在首屏加载时误判:页面上只要有课程中心的痕迹(展开/课程学习/学时),就不算。 */ function notEnrolledPage() { let t = ''; try { t = (document.body ? document.body.innerText : '').slice(0, 3000); } catch (e) {} if (!/尚未报名|未报名参与|暂无报名|没有报名/.test(t)) return false; if (/课程学习|课程学时|温故知新|继续学习|开始学习/.test(t)) return false; let hasCards = false; try { hasCards = learnCards().length > 0; } catch (e) {} if (hasCards) return false; try { if ([...document.querySelectorAll('a, button')].some(a => (a.textContent || '').trim() === '展开')) return false; } catch (e) {} return true; } /* 看到「未报名」页怎么办。规则只有一条:这一页是哪个学段,哪个学段就作废, * 当场拉黑,之后所有跳转都不许再回到它(包括原本锁定的那个)。 * 当前页不是锁定学段 → 拉黑它,一步回到锁定学段; * 当前页就是锁定学段 → 拉黑它并解锁(锁定只是猜测,这页是事实),再挑别的学段; * 三个都黑完 → 弹窗,把三条链接列出来让人自己点。 */ function bounceToRightProject(reason) { const cur = projectFromUrl(); let lock = myStage(); if (cur && !isNoEnroll(cur)) { /* 锁定学段第一次被判未报名,先给 8 秒复核 —— 首屏没渲染完时页面也可能 * 只剩这句提示,冤枉一次就要多转一圈。复核还是这页,就拉黑。 */ const k = '#notEnroll'; if (lock === cur && (STATE.attempts[k] || 0) < 1) { STATE.attempts[k] = 1; saveState(); panelApi && panelApi.set(stageLabel(cur) + '页面显示未报名,8 秒后复核'); log('锁定学段', cur, '这一页显示未报名,8 秒后确认一次'); setTimeout(() => { if (!PAUSED) main(); }, 8000); return; } markNoEnroll(cur); // 未报名 = 这个学段跟本用户无关,永久排除 lock = myStage(); // 锁错了的话这里已经被清空 } // 还有锁定学段:它是唯一合法的去处,一步回去 if (lock && lock !== cur) { panelApi && panelApi.set('这是' + stageLabel(cur) + '的页面(未报名),回' + stageLabel(lock) + '课程中心'); log('学段不对:', cur, '→ 返回已锁定学段', lock); NAV_PENDING = true; location.href = projectListUrl(lock); return; } const probe = probeState(); const rest = projectCandidates().filter(p => p !== cur && probe.tried.indexOf(p) < 0); if (probe.hops >= 3 || !rest.length) { panelApi && panelApi.set('三个学段都显示未报名,请手动打开自己的课程页'); const gone = Object.keys(noEnrollMap()).map(p => stageLabel(p)).join('、') || '无'; showModal('没找到已报名的学段', (reason ? reason + '

' : '') + '已经显示过「尚未报名参与本次研修项目」的学段:' + gone + ',这些学段以后不会再跳了。' + '剩下没试过的也都试完了。请手动打开你自己学段的那一个,脚本在哪个页面都能接着干:' + '

· 小学:
yxjc.qlteacher.com/project/xx2026/lesson/learn' + '

· 初中:
yxjc.qlteacher.com/project/cz2026/lesson/learn' + '

· 高中:
yxjc.qlteacher.com/project/gz2026/lesson/learn' + '

打开后如果学段认错了,点右下角面板上的「学段」两个字就能切换。', 'warn'); return; } const next = rest[0]; probe.hops++; if (cur && probe.tried.indexOf(cur) < 0) probe.tried.push(cur); STATE.probe = probe; saveState(); panelApi && panelApi.set((cur ? stageLabel(cur) + '页面未报名,' : '') + '转到' + stageLabel(next)); log('当前项目未报名:', cur || '?', '→', next, '(第', probe.hops, '次尝试)'); NAV_PENDING = true; location.href = projectListUrl(next); } /* ====================================================================== * 通用工具 * ==================================================================== */ function waitFor(fn, timeout = 10000, interval = 300) { return new Promise((resolve) => { const t0 = Date.now(); const iv = setInterval(() => { let r = null; try { r = fn(); } catch (e) { r = null; } if (r) { clearInterval(iv); resolve(r); } else if (Date.now() - t0 > timeout) { clearInterval(iv); resolve(null); } }, interval); }); } function visible(el) { if (!el) return false; if (el.offsetParent === null && !el.getClientRects().length) return false; const r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0; } function textOf(el) { return ((el && el.innerText) || '').replace(/\s+/g, ''); } /* ====================================================================== * 屏蔽验证:把 learnVerify 之类的人脸/验证请求在源头掐掉 * ==================================================================== */ function blockVerification() { if (window.__qlteVerifyBlocked) return; window.__qlteVerifyBlocked = true; const hit = (u) => /learnVerify|faceVerify|verify\/face|captcha/i.test(u || ''); const origFetch = window.fetch ? window.fetch.bind(window) : null; if (origFetch) { window.fetch = function (input, init) { const url = (typeof input === 'string') ? input : (input && input.url) || ''; if (hit(url)) { return Promise.resolve(new Response( JSON.stringify({ code: 0, msg: null, data: { status: 0 } }), { status: 200, headers: { 'content-type': 'application/json' } } )); } return origFetch(input, init); }; } const origOpen = XMLHttpRequest.prototype.open; const origSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.open = function (m, u, ...rest) { this.__qlte_url = u; return origOpen.call(this, m, u, ...rest); }; XMLHttpRequest.prototype.send = function (...a) { if (hit(this.__qlte_url)) { setTimeout(() => { try { this.abort(); } catch (e) {} }, 0); return; } return origSend.apply(this, a); }; } /* ====================================================================== * 假装页面一直可见:平台会在切后台时自动暂停视频 * ==================================================================== */ function fakeVisible() { if (window.__qlteVisibleFaked) return; window.__qlteVisibleFaked = true; try { Object.defineProperty(document, 'hidden', { configurable: true, get: () => false }); Object.defineProperty(document, 'visibilityState', { configurable: true, get: () => 'visible' }); Object.defineProperty(document, 'webkitHidden', { configurable: true, get: () => false }); } catch (e) {} try { document.addEventListener('visibilitychange', (e) => e.stopImmediatePropagation(), true); window.addEventListener('visibilitychange', (e) => e.stopImmediatePropagation(), true); } catch (e) {} } /* ====================================================================== * 状态面板 * ==================================================================== */ let panelApi = null; let PAUSED = !!STATE.paused; // 刷新后如果上次是暂停状态,继续保持暂停 const AL_SVG = { bolt: '', play: '', stop: '', }; // 轻提示:不挡操作、8 秒自动消失(只在某门课反复点不开时用一次,避免打扰) let LAST_TOAST = 0; function showToast(msg) { if (Date.now() - LAST_TOAST < 60000) return; LAST_TOAST = Date.now(); const t = document.createElement('div'); t.style.cssText = 'position:fixed;left:50%;bottom:86px;transform:translateX(-50%);' + 'z-index:2147483646;max-width:420px;padding:10px 16px;border-radius:12px;' + 'background:rgba(24,32,46,.93);color:#fff;font:12.5px/1.6 -apple-system,BlinkMacSystemFont,' + "'Segoe UI',system-ui,'PingFang SC','Microsoft YaHei',sans-serif;" + 'box-shadow:0 10px 28px rgba(0,0,0,.28);opacity:1;transition:opacity .4s;pointer-events:none;'; t.textContent = msg; (document.body || document.documentElement).appendChild(t); setTimeout(() => { t.style.opacity = '0'; setTimeout(() => { try { t.remove(); } catch (e) {} }, 420); }, 8000); } function setPaused(p) { PAUSED = p; STATE.paused = p; saveState(); // 同步面板外观 const panel = document.getElementById('auto-learn-panel'); if (panel) { panel.classList.toggle('al-paused', p); panel.title = p ? '已停止:点 ▶ 继续自动刷课' : '正在自动刷课,点 ■ 停止'; const btn = panel.querySelector('#auto-pause'); if (btn) { btn.innerHTML = p ? AL_SVG.play : AL_SVG.stop; btn.title = p ? '继续' : '停止'; } const tag = panel.querySelector('.al-tagline'); if (tag) tag.textContent = p ? '已停止 · 点 ▶ 继续' : '2026 远程研修 · 全自动挂机'; } if (p) { CURRENT_TOKEN++; // 让所有正在运行的自动流程立刻中断 log('已停止:脚本终止一切自动操作'); } else { // 从暂停恢复:计数清零,并在当前页面重新接管,避免卡在“已停下”的状态 TEST_KEY_TRIES = 0; TEST_RETRY_CLICKS = 0; TEST_KEY_SUBS = 0; TEST_SUBMITS = 0; TEST_PASSED = false; STATE.giveUp = {}; // 手动继续时,重新试一遍之前放弃的课 // 当前课程各节点的重试次数也清零,否则刚点继续就又触发「放弃」判定 const cur = courseIdOf() || STATE.lastCourse; if (cur) { Object.keys(STATE.attempts).forEach(k => { if (k.indexOf(cur + '#') === 0) delete STATE.attempts[k]; }); } saveState(); try { document.getElementById('auto-done-modal')?.remove(); } catch (e) {} setTimeout(() => main(), 400); } } /* 面板上的学段按钮:显示当前锁定的学段,点开可以选择。 * 有它就不怕「学段认错了」—— 用户一句话都不用问,自己点一下就能改回来。 */ function refreshStageChip() { const b = document.getElementById('auto-stage'); if (!b) return; const s = myStage(); b.textContent = s ? stageLabel(s) : '学段'; b.title = '当前学段:' + (s ? stageLabel(s) + '(' + s + ')' : '还没确定') + ' · 点击选择自己的学段'; } function switchStage(pid) { if (!isProjectId(pid)) return; log('手动切换学段:', pid, '(' + stageLabel(pid) + ')'); STATE.badProjects = {}; STATE.probe = null; STATE.attempts = {}; STATE.giveUp = {}; delete noEnrollMap()[pid]; // 用户亲口说了是这个学段,就不再排除它 markProjectGood(pid, true); refreshStageChip(); CURRENT_TOKEN++; // 打断正在跑的流程,直接换页 NAV_PENDING = true; location.href = projectListUrl(pid); } function showStagePicker() { const old = document.getElementById('auto-stage-pick'); if (old) { old.remove(); return; } const panel = document.getElementById('auto-learn-panel'); if (!panel) return; const rect = panel.getBoundingClientRect(); const cur = myStage() || projectFromUrl(); const box = document.createElement('div'); box.id = 'auto-stage-pick'; box.style.cssText = 'position:fixed;right:' + Math.max(8, Math.floor(window.innerWidth - rect.right)) + 'px;bottom:' + Math.floor(window.innerHeight - rect.top + 8) + 'px;z-index:2147483647;' + 'background:#fff;border-radius:13px;box-shadow:0 12px 34px rgba(15,23,42,.28);padding:7px;' + "font:12.5px/1.4 -apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,'PingFang SC','Microsoft YaHei',sans-serif;" + 'min-width:200px;'; box.innerHTML = '
选择你报名的学段
' + ALL_PROJECTS.map(p => { const off = isNoEnroll(p); return ''; }).join(''); (document.body || document.documentElement).appendChild(box); box.addEventListener('click', (e) => { const b = e.target.closest('button[data-p]'); if (!b) return; e.stopPropagation(); box.remove(); switchStage(b.getAttribute('data-p')); }); setTimeout(() => { const away = (ev) => { if (!box.isConnected) { document.removeEventListener('click', away, true); return; } if (!box.contains(ev.target)) { box.remove(); document.removeEventListener('click', away, true); } }; document.addEventListener('click', away, true); }, 0); } function buildPanel() { if (document.getElementById('auto-learn-panel')) return; if (!document.getElementById('auto-learn-style')) { const st = document.createElement('style'); st.id = 'auto-learn-style'; st.textContent = '#auto-learn-panel{position:fixed;right:16px;bottom:18px;z-index:2147483646;' + 'display:inline-flex;align-items:center;gap:9px;padding:8px 9px 8px 10px;' + 'border-radius:15px;color:#fff;user-select:none;' + 'background:linear-gradient(120deg,#7c3aed 0%,#4f46e5 52%,#2563eb 100%);' + 'box-shadow:0 10px 26px rgba(67,56,202,.34),inset 0 1px 0 rgba(255,255,255,.22);' + "font:12px/1.3 -apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,'PingFang SC','Microsoft YaHei',sans-serif;" + 'transition:box-shadow .25s}' + '#auto-learn-panel *{box-sizing:border-box;margin:0;padding:0;font-family:inherit}' + '#auto-learn-panel.al-paused{background:linear-gradient(120deg,#8b8fa6 0%,#6b7280 55%,#4b5563 100%);' + 'box-shadow:0 8px 22px rgba(71,85,105,.3),inset 0 1px 0 rgba(255,255,255,.16)}' + '.al-icon{width:28px;height:28px;flex:none;border-radius:9px;background:rgba(255,255,255,.18);' + 'display:flex;align-items:center;justify-content:center;' + 'box-shadow:inset 0 0 0 1px rgba(255,255,255,.3)}' + '.al-text{display:flex;flex-direction:column;justify-content:center;min-width:0}' + '.al-title{font-size:12.5px;font-weight:700;letter-spacing:.4px;line-height:1.2;white-space:nowrap}' + '.al-tagline{font-size:9.5px;font-weight:500;letter-spacing:.2px;line-height:1.25;' + 'opacity:.82;margin-top:2.5px;white-space:nowrap}' + '#auto-pause{width:28px;height:28px;flex:none;margin-left:3px;border:none;border-radius:9px;' + 'display:flex;align-items:center;justify-content:center;cursor:pointer;' + 'background:linear-gradient(135deg,#f76e7d,#e11d48);' + 'box-shadow:0 2px 8px rgba(225,29,72,.4),inset 0 1px 0 rgba(255,255,255,.28);' + 'transition:transform .16s,filter .16s,box-shadow .16s}' + '#auto-pause:hover{transform:translateY(-1px);filter:brightness(1.08);' + 'box-shadow:0 4px 12px rgba(225,29,72,.5),inset 0 1px 0 rgba(255,255,255,.28)}' + '#auto-pause:active{transform:translateY(0) scale(.94)}' + '#auto-stage{height:28px;min-width:38px;padding:0 9px;flex:none;border:none;border-radius:9px;' + 'cursor:pointer;background:rgba(255,255,255,.2);color:#fff;font-size:11.5px;font-weight:700;' + 'letter-spacing:.3px;box-shadow:inset 0 0 0 1px rgba(255,255,255,.35);' + 'transition:transform .16s,background .16s}' + '#auto-stage:hover{background:rgba(255,255,255,.34);transform:translateY(-1px)}' + '#auto-stage:active{transform:translateY(0) scale(.95)}' + '.al-paused #auto-pause{background:linear-gradient(135deg,#3ddc97,#059669);' + 'box-shadow:0 2px 8px rgba(5,150,105,.4),inset 0 1px 0 rgba(255,255,255,.28)}'; (document.head || document.documentElement).appendChild(st); } const panel = document.createElement('div'); panel.id = 'auto-learn-panel'; panel.title = PAUSED ? '已停止:点 ▶ 继续自动刷课' : '正在自动刷课,点 ■ 停止'; panel.innerHTML = '' + AL_SVG.bolt + '' + '
' + '
智能学习助手
' + '
' + (PAUSED ? '已停止 · 点 ▶ 继续' : '2026 远程研修 · 全自动挂机') + '
' + '
' + '' + ''; if (PAUSED) panel.classList.add('al-paused'); (document.body || document.documentElement).appendChild(panel); panel.querySelector('#auto-pause').addEventListener('click', (e) => { e.stopPropagation(); setPaused(!PAUSED); }); panel.querySelector('#auto-stage').addEventListener('click', (e) => { e.stopPropagation(); showStagePicker(); }); refreshStageChip(); // 条上没有状态区,运行细节仍写控制台;鼠标悬停可看当前进度 // 双击面板 = 立刻重扫一次(等退避等太久时可以手动催一下) panel.addEventListener('dblclick', () => { if (PAUSED) return; LIST_RETRY = 0; LIST_NEXT_AT = 0; LIST_HEART = Date.now(); Object.keys(STATE.attempts).forEach(k => { if (k.indexOf('L/') === 0) delete STATE.attempts[k]; }); saveState(); log('手动触发:重新扫描课程列表'); main(); }); // 副标题直接显示脚本此刻在做什么,不用悬停也能看出有没有在动 panelApi = { set(msg) { log(msg); const p = document.getElementById('auto-learn-panel'); if (!p) return; p.title = '智能学习助手 · ' + msg + '(双击立即重扫)'; if (PAUSED) return; const tag = p.querySelector('.al-tagline'); if (tag && msg) { const t = String(msg).replace(/\s+/g, ' '); tag.textContent = t.length > 22 ? t.slice(0, 22) + '…' : t; } }, sub(msg) { if (msg) log(' ' + msg); }, }; } /* ====================================================================== * 弹窗 * ==================================================================== */ // 完成弹窗里展示的公众号二维码(图片已内嵌为 base64,不联网、不依赖外链) const QR_IMG = 'data:image/jpeg;base64,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'; function showModal(title, html, tone, opts) { if (document.getElementById('auto-done-modal')) return; const autoNext = !!(opts && opts.autoNext); const color = tone === 'warn' ? '#d97706' : '#16a34a'; const isDone = tone !== 'warn'; const qrBlock = isDone ? '公众号:鉴紫' + '
' + '您已完成全部学习任务,欢迎关注公众号“鉴紫”,也可以在小红书搜索同名账号,分享更多有用的工具!
' : ''; const overlay = document.createElement('div'); overlay.id = 'auto-done-modal'; overlay.style.cssText = 'position:fixed;inset:0;z-index:2147483647;background:rgba(0,0,0,.5);' + 'display:flex;align-items:center;justify-content:center;font-family:-apple-system,' + 'BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;'; const tipBlock = autoNext ? '
' + Math.round(AUTO_CLOSE_MS / 1000) + ' 秒后自动关闭,回课程列表继续下一门…
' : ''; overlay.innerHTML = '
' + '
' + (isDone ? '🎉' : '⚠️') + '
' + '
' + title + '
' + qrBlock + '
' + html + '
' + tipBlock + '' + '
'; (document.body || document.documentElement).appendChild(overlay); let timer = null; const close = () => { if (timer) { clearInterval(timer); timer = null; } try { overlay.remove(); } catch (e) {} if (autoNext) goNextCourse(); }; overlay.querySelector('#auto-done-ok').addEventListener('click', close); // 卡住的提示:5 秒内没人点“知道了”,就自己关掉并回课程列表继续下一门 if (autoNext) { let left = Math.round(AUTO_CLOSE_MS / 1000); timer = setInterval(() => { // 弹窗已被别的途径关掉(比如点了面板的「继续」)就别再跳转 if (!overlay.isConnected) { clearInterval(timer); timer = null; return; } left -= 1; const tip = overlay.querySelector('#auto-done-tip'); if (left > 0) { if (tip) tip.textContent = left + ' 秒后自动关闭,回课程列表继续下一门…'; return; } if (tip) tip.textContent = '正在返回课程列表…'; close(); }, 1000); } } function doneSummary(extra) { const list = Object.keys(STATE.finished); let html = ''; if (extra) html += extra + '
'; html += '本次自动完成:' + list.length + ' 门
' + '(课程完成后平台通常还需要 1~2 分钟结算学时,稍后可在“我的学习”里核对。)'; if (STATE.skipped.length) { html += '

以下内容脚本没能自动完成,建议手动看一眼:
' + STATE.skipped.slice(-6).map(s => '· ' + s).join('
'); } return html; } /* ====================================================================== * 页面类型 * ==================================================================== */ let CURRENT_TOKEN = 0; /* 三种地址要分清(用户确认过的): * 课程列表 yxjc.qlteacher.com/project/gz2026/lesson/learn * 单元列表 yxjc.qlteacher.com/learning/gz2026/{课程id} ← 这一段带学段 * 具体视频 player.qlteacher.com/learning/{课程id}/{单元id} ← 没有学段 * 所以只有 yxjc 的 /learning/{学段}/… 这一段能直接读出学段,播放页读不出来,别硬猜。 */ function pathParts() { return location.pathname.split('/').filter(Boolean); } // yxjc /learning/gz2026/{课程id} 里的学段 function stageFromPath() { if (location.hostname !== 'yxjc.qlteacher.com') return ''; const parts = pathParts(); if (parts[0] !== 'learning') return ''; return isProjectId(parts[1]) ? parts[1] : ''; } /* 单元列表的地址是平台自己按用户学段生成的,等于平台告诉我们「你是这个学段」。 * 但这里只用来「补空」:已经锁定的学段不会被它改掉,免得开错一个页面就串学段。 * 要改学段只有两条路 —— 在某个学段的列表里读到课程卡片,或者用户点面板按钮。 */ function lockStageFromPath() { const st = stageFromPath(); if (!st) return; if (myStage() === st) return; if (myStage()) { log('地址里的学段是', stageLabel(st), ',但已锁定', stageLabel(myStage()), ',保持锁定'); return; } markProjectGood(st); log('从地址确认学段:', st, '(' + stageLabel(st) + ')'); } function getMode() { const host = location.hostname; const path = location.pathname; // 掉登录的登录页:不管哪个子域,先认它。 // 密码框在 = 要输账号密码;没有密码框但有「继续」= 浏览器记住了账号的中间页。 // 地址本身就是登录页(比如 passport.qlteacher.com 渲染慢半拍)也认, // 绝不能当成「无关页面」跳走 —— 那样会在登录页和课程列表之间来回窜。 const lp = loginPageState(); if (lp.form || lp.cont || loginishUrl()) return 'login'; if (host === 'player.qlteacher.com') { const m = path.match(/^\/learning\/([0-9a-zA-Z]+)(?:\/([0-9a-zA-Z]+))?/); if (!m) return null; return m[2] ? 'video' : 'course'; } if (host === 'yxjc.qlteacher.com') { const m = path.match(/^\/learning\/([0-9a-zA-Z]+)/); if (m) return 'jump'; // 课程 id,不是项目号;学段由 stageFromPath() 单独认 const p = path.match(/^\/(?:pre-)?project\/([0-9a-zA-Z]+)/); if (p) { // 这里不直接记成 projectId:项目号要等看到课程卡片才算数 if (/\/lesson\/learn\/?$/.test(path)) return 'lessonlist'; return 'workbench'; // /pre-project/{学段} 项目首页也走工作台流程(含未报名判断) } } return null; } /* 课程 id / 单元 id:/learning/{课程id}[/{单元id}],单元列表多一段学段前缀, * 以前会把 gz2026 当成课程 id,进度、跳转全跟着错。 */ function courseIdOf() { const parts = pathParts(); if (parts[0] !== 'learning') return ''; if (isProjectId(parts[1])) return parts[2] || ''; return parts[1] || ''; } function actIdOf() { const parts = pathParts(); if (parts[0] !== 'learning') return ''; const off = isProjectId(parts[1]) ? 1 : 0; // 单元列表地址多一段学段 return parts[1 + off + 1] || ''; } /* ====================================================================== * 播放页:把当前这一节播完 * ==================================================================== */ function findVideo() { const vids = [...document.querySelectorAll('video')].filter(v => { if (!visible(v)) return false; return !!(v.src || v.currentSrc || v.readyState > 0 || v.querySelector('source')); }); if (!vids.length) return null; const playing = vids.find(v => !v.paused && !v.ended); if (playing) return playing; return vids.sort((a, b) => (b.clientWidth * b.clientHeight) - (a.clientWidth * a.clientHeight))[0]; } function keepPlaying(video) { if (!video) return; try { video.muted = true; video.volume = 0; } catch (e) {} // 平台不提供倍速(playbackRates 为空),这里只做兜底:保证是 1x 原速 if (video.playbackRate !== 1) { try { video.playbackRate = 1; } catch (e) {} } if (PAUSED) { if (!video.paused) { try { video.pause(); } catch (e) {} } return; } if (video.paused && !video.ended) { video.play().catch(() => {}); const btn = document.querySelector('.vjs-paused .vjs-big-play-button, .vjs-big-play-button'); if (btn && visible(btn)) { fireClick(btn); } } } /* ---------------------------------------------------------------------- * 视频中途的「答题后继续观看」弹题 * * 这是视频里的关卡:答不对就红字提示「你的题目没有答对,请重新作答」, * 视频一直停着,这一节就永远学不完。旧版的做法是每组只勾第一个选项, * 而且已经勾过就不再动,于是多选题永远只选 A,一直错、一直卡。 * * 现在改成:把选项组合挨个试(多选从「全选」开始往下试,因为这类 * 「包括哪些」的题答案常常是全部),用红字提示判断对错,答对以后把 * 「题目 → 正确组合」存进 localStorage,下次遇到同一题直接照抄。 * -------------------------------------------------------------------- */ const OPT_SEL = 'label[nz-checkbox], label[nz-radio], .ant-checkbox-wrapper, ' + '.ant-radio-wrapper, [nz-checkbox], [nz-radio]'; let QUIZ_BUSY = false; let QUIZ_SIG = ''; let QUIZ_NEXT = 0; // 去掉被外层同类元素包住的,避免 ng-zorro 套两层时重复计数 function outerOnly(list) { return list.filter(el => !list.some(o => o !== el && o.contains(el))); } function optionsIn(scope) { return outerOnly([...scope.querySelectorAll(OPT_SEL)]); } function isMultiOpt(opt) { if (opt.hasAttribute && opt.hasAttribute('nz-checkbox')) return true; if (/checkbox/i.test(opt.className || '')) return true; return !!opt.querySelector('input[type=checkbox], .ant-checkbox-inner'); } // 弹层容器(标准化测试也是弹窗弹出来的,所以这两种要能分开认) const MODAL_SEL = '.ant-modal-wrap, .ant-modal, .ant-modal-content, nz-modal-container, ' + '[class*=modal], [class*=dialog], [class*=popup], [class*=layer], [class*=drawer]'; /* 判断一个弹层里装的是「整卷测试」还是视频中途的「答题后继续观看」弹题。 * 两者长得很像(都有【多选题】+ 选项 + 提交),只能靠这几条区分: * · 只有正式测试卷才有「重新答题」「交卷」「【正确答案】」这些东西; * · 视频弹题一定有「继续观看」,而且只有一道题; * · 正式卷一般好几道题(题组 ≥ 2)。 */ function isTestPaperPanel(el) { if (!el) return false; const t = textOf(el); if (/继续观看/.test(t)) return false; // 视频弹题,交给 solveQuiz if (/标准化测试|标准化测评|重新答题|交卷|【正确答案】|答案解析|我的答案|你的答案/.test(t)) return true; // 播放页上的「(模块4)测试」可能只有一道题、只有一颗「提交」, // 旧规则会把它当成视频弹题让给 solveQuiz,结果既不答也不交。 // 标题里写了 测试/考试/测评,就按正式卷子处理。 if (/(^|[\s((【\[])第?\s*\d+\s*[、.]|测试|考试|测评|考核/.test(t) && /【单选题】|【多选题】|【判断题】|单选题|多选题|判断题/.test(t)) return true; if (testQuestions(el).length >= 2) return true; // 多道题 → 整卷 // 只剩一道题:播放页上的多半是「答题后继续观看」,课程页上的就是正式测试 return getMode() !== 'video' && /【单选题】|【多选题】|【判断题】/.test(t); } function inModal(el) { return !!(el && el.closest && el.closest(MODAL_SEL)); } // 做完弹窗测试后把弹层关掉,别挡着后面的章节点击 function closeTestPanel() { const x = [...document.querySelectorAll( '.ant-modal-close, .ant-modal-close-x, [class*=modal] [class*=close], [class*=dialog] [class*=close]' )].filter(visible)[0]; if (x) { fireClick(x); return true; } const btns = [...document.querySelectorAll('button, [role=button], .ant-btn')] .filter(visible) .filter(el => /^(关闭|知道了|完成|返回|退出)$/.test(textOf(el))); const b = btns[btns.length - 1]; if (b) { fireClick(b); return true; } return false; } function findQuizModal() { // 这个弹题不一定用 ant-design,玩家自定义弹层也可能,所以按「文字 + 选项 + 提交键」 // 来找,并在所有命中的容器里挑最靠里的那个(避免抓到一个包住整页的大壳子) const cands = [...document.querySelectorAll( '.ant-modal-wrap, .ant-modal, .ant-modal-content, nz-modal-container, ' + '[class*=modal], [class*=dialog], [class*=popup], [class*=layer]' )].filter(visible); let best = null, bestSize = Infinity; for (const m of cands) { const t = textOf(m); if (!/答题|继续观看|作答/.test(t)) continue; if (!/提交|确定/.test(t)) continue; if (!optionsIn(m).length) continue; // 标准化测试也弹窗,但它是整卷,走两遍法;这里别抢 if (isTestPaperPanel(m)) continue; const size = m.querySelectorAll('*').length; if (size < bestSize) { best = m; bestSize = size; } } return best; } // 题目指纹:题干 + 每个选项的原文。同一道题重进也能认出来 function quizSig(modal) { const opts = optionsIn(modal); const optTxt = opts.map(o => textOf(o)); const stem = textOf(modal).replace(optTxt.join(''), '') .replace(/你的题目没有答对[^。]*/g, '').replace(/请重新作答/g, ''); return stem.slice(0, 80) + '|' + optTxt.join('|').slice(0, 160); } function quizFailed(modal) { return /请重新作答|没有答对|回答错误|答案错误|答案不正确/.test(textOf(modal)); } // 多选从「全选」开始往下试,单选就按 A、B、C… 顺序试 function combosOf(n, multi) { if (!multi) return Array.from({ length: n }, (_, i) => [i]); const out = []; if (n > 6) { for (let i = 0; i < n; i++) out.push([i]); for (let i = 0; i < n; i++) for (let j = i + 1; j < n; j++) out.push([i, j]); out.push(Array.from({ length: n }, (_, i) => i)); return out; } for (let mask = (1 << n) - 1; mask >= 1; mask--) { const arr = []; for (let i = 0; i < n; i++) if (mask & (1 << i)) arr.push(i); out.push(arr); } out.sort((a, b) => b.length - a.length); return out; } async function applyCombo(opts, combo) { for (let i = 0; i < opts.length; i++) { const want = combo.includes(i); if (optChecked(opts[i]) === want) continue; await optClick(opts[i]); await sleep(rand(250, 750)); } } function quizSubmitBtn(modal) { return [...modal.querySelectorAll('button')].filter(visible) .find(b => /提交|确定|继续观看|下一题|完成/.test(textOf(b))) || null; } // 答对后平台有时会留一个「继续观看」按钮,点掉让视频接着播 function clickResume() { const btns = [...document.querySelectorAll( '.ant-modal button, .ant-modal-wrap button, nz-modal-container button, ' + '[class*=modal] button, [class*=dialog] button, [class*=popup] button' )].filter(visible); const b = btns.find(x => /^继续观看$/.test(textOf(x))); if (b) { fireClick(b); log('已点「继续观看」'); return true; } return false; } async function solveQuiz(modal) { if (QUIZ_BUSY) return; QUIZ_BUSY = true; try { scrollThrough(modal); let opts = optionsIn(modal).filter(visible); if (!opts.length) return; const multi = isMultiOpt(opts[0]); const sig = quizSig(modal); if (sig !== QUIZ_SIG) { QUIZ_SIG = sig; QUIZ_NEXT = 0; } const combos = combosOf(opts.length, multi); log('弹题:' + (multi ? '多选' : '单选') + ' ' + opts.length + ' 个选项,指纹 ' + sig.slice(0, 30)); // 以前答对过就直接照抄 const learned = (STATE.quizKey || {})[sig]; if (learned && learned.length) { panelApi && panelApi.set('弹题:按记住的答案作答'); await applyCombo(opts, learned); await sleep(rand(600, 1200)); const b0 = quizSubmitBtn(modal); if (b0) fireClick(b0); await sleep(1600); if (!modal.isConnected || !quizFailed(modal)) return; log('记住的答案这次不对,继续试其它组合'); } let i = QUIZ_NEXT; while (i < combos.length) { if (!modal.isConnected) return; opts = optionsIn(modal).filter(visible); if (!opts.length) return; panelApi && panelApi.set('弹题:正在试第 ' + (i + 1) + '/' + combos.length + ' 种组合'); await applyCombo(opts, combos[i]); await sleep(rand(700, 1400)); const btn = quizSubmitBtn(modal); if (!btn) return; fireClick(btn); // 等平台给结果:红字=答错,弹窗消失/提交键没了=通过 let verdict = 'timeout'; for (let k = 0; k < 10; k++) { await sleep(400); if (!modal.isConnected) { verdict = 'gone'; break; } if (quizFailed(modal)) { verdict = 'wrong'; break; } if (!quizSubmitBtn(modal)) { verdict = 'gone'; break; } } if (verdict === 'gone') { STATE.quizKey = STATE.quizKey || {}; STATE.quizKey[sig] = combos[i]; const qk = Object.keys(STATE.quizKey); if (qk.length > 200) { STATE.quizKey = Object.fromEntries(qk.slice(-150).map(k => [k, STATE.quizKey[k]])); } saveState(); log('弹题答对了,答案已记住:', combos[i]); panelApi && panelApi.set('弹题已通过 ✅'); return; } log('第', i + 1, '种组合不对(' + verdict + '),换下一种'); i++; QUIZ_NEXT = i; await sleep(rand(600, 1200)); } log('所有组合都试完了,弹题仍没通过'); panelApi && panelApi.set('弹题没试出来,需要手动看一眼'); } catch (e) { log('弹题处理出错:', e && e.message); } finally { QUIZ_BUSY = false; } } // 播放页右上角会给一个「已完成 / 已通过」的小标签(文本、图文、文档类节点读完就有)。 // 这类页面里根本没有