Files
study-tool/src/study_tool/plugins/gdgxk/script/2026广东公需课·全自动完美版(后台保活+10分钟刷新).js
T
study-tool aa48145557 feat: 故障推送 / 公需课自动重学 / 插件解耦,发版 v0.0.8
体检修复:启动日志不再打印 AUTH_TOKEN、密钥可清空、推送失败不占整段冷却、目录名与文案统一成 plugins/。
2026-11-01 17:47:22 +08:00

522 lines
30 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ==UserScript==
// @name 2026广东公需课·全自动完美版(后台保活+10分钟刷新)
// @namespace http://tampermonkey.net/
// @version 1.3
// @description 超强防掉线+后台保活不暂停+10分钟刷新+题库优先+自动考试
// @author 广东数学张叔
// @match https://jsxx.gds.edu.cn/*
// @grant none
// @run-at document-end
// @license MIT
// ==/UserScript==
(function () {
'use strict';
// 基础配置
const QUICK_DELAY_MIN = 600;
const QUICK_DELAY_MAX = 1400;
let panel = null, progressText = null;
let isAnswering = false;
let activeTimer = null;
// 兜底遍历(仅视频题使用)
let bruteForceRound = 0;
const MAX_BRUTE_ROUND = 12;
// 强制看完视频再下一节
const FORCE_WATCH_END = true;
let videoWatched = false;
// 脚本开关
let scriptEnabled = true;
let isMinimized = false;
// ==============================================
// 后台保活:防止浏览器后台暂停脚本
// ==============================================
function enableBackgroundKeepAlive() {
setInterval(() => { }, 1000);
document.addEventListener('visibilitychange', () => {
if (document.hidden) {
console.log('页面进入后台,继续保活');
} else {
console.log('页面回到前台');
}
});
window.addEventListener('blur', () => {
setTimeout(() => {
window.dispatchEvent(new Event('focus'));
}, 500);
});
}
// ==============================================
// 自动刷新:每10分钟刷新一次页面
// ==============================================
const REFRESH_INTERVAL = 10 * 60 * 1000;
let lastRefreshTime = Date.now();
function checkAutoRefresh() {
if (!scriptEnabled) return;
if (Date.now() - lastRefreshTime > REFRESH_INTERVAL) {
console.log("已挂机10分钟,自动刷新保活");
location.reload();
}
}
// ==============================================
// 考核答案:双套识别逻辑【已反转,解决反了问题】
// ==============================================
function getExamAnswers() {
const idVal = document.querySelector('.aidHidden.ing')?.value;
if (idVal === 'a_22f272254f7a427e8b7a6d2373753caf') {
// 现在这里放第二套答案
return [
'A','D','B','B','A','D','B','B','D','B',
'ABCD','ABCDE','ABC','ACD','ABC','ABCD','ABCD','ABD','ABCD','ABC',
'A','A','B','B','B','B','A','A','A','B'
];
} else {
// 现在这里放第一套答案
return [
'A','C','D','D','B','D','B','B','D','B',
'ABC','ABC','AB','ABC','ABCD','ABCD','ABCD','BCD','BCD','ABC',
'A','B','A','B','B','B','A','B','B','A'
];
}
}
// ==============================================
// 视频题库
// ==============================================
const videoBank = new Map();
// 专题1
videoBank.set("生成式人工智能(GenAI)目前还没有在教育领域得到广泛应用。", "B");
videoBank.set("人工智能(AI)是指计算机系统模拟类似人类的认知能力,如学习、决策和解决问题的能力。", "A");
videoBank.set("生成式人工智能工具没有任何局限性,可以完全替代人类完成创作工作。", "B");
videoBank.set("ChatGPT 生成的参考文献、作者、URL等,有可能是编造的、不存在的。", "A");
videoBank.set("早期的机器人关节以一体化关节为主,将电机、减速器等部件深度融合设计。", "B");
videoBank.set("具身智能只需要实现视觉能力,不需要语言和行动能力。", "B");
videoBank.set("OpenClaw本身是收费软件,使用时会直接产生高额费用。", "B");
videoBank.set("为保障安全,建议不要在主电脑上直接运行 OpenClaw,可在专用备用电脑、云服务器或Docker 容器中运行。", "A");
videoBank.set("传统科研与AI驱动科研的之间关键转变 : 从“ 人驱动\"到 ”AI智能 \" 驱动。", "A");
videoBank.set("人工智能驱动的新型科研范式,本质上是在提升科研活动的系统效率、认知效率和处理效率。", "A");
videoBank.set("科学大模型建设的三大意义:支撑前沿科学问题研究、支撑交叉学科融合创新、支撑从科研到应用的衔接。", "A");
videoBank.set("未来科研平台竞争维度包括:硬件竞争、数据能力竞争、模型能力竞争、智能协同能力竞争。", "A");
videoBank.set("创新研发模式五大支柱:数据、模型、模仿、实验、反馈。", "B");
videoBank.set("6G不只是更快的通信,更重要的是网络、感知、计算、智能全面融合。", "A");
videoBank.set("社科研究的原因:技术发展速度远超伦理规范制定速度,技术能力边界扩大带来责任边界扩大,缺乏价值引导的技术可能走向“ 恶” 的方向。", "A");
videoBank.set("AI是道德中立的工具,它携带了开发者的价值观与社会偏见。", "A");
videoBank.set("执行型智能体不具备感知能力,仅能执行任务。", "B");
videoBank.set("OpenClaw集成的物理信息神经网络(PINNs)技术,属于物理信息机器学习的范畴。", "A");
videoBank.set("售前AI推送是根据用户的消费行为、兴趣爱好等信息,向用户推送个性化商品或服务的智能方式。", "A");
videoBank.set("仿真设定的参数仅包含激光功率和扫描速度,不涉及基板预热温度。", "B");
videoBank.set("智能AI质检中,运用卷积神经网络和目标检测模型可实现缺陷图像的特征识别及分类。", "A");
videoBank.set("三条训练损失曲线从高位快速下降后出现明显反弹波动,说明模型学习过程正常,未出现过拟合欠拟合。", "B");
videoBank.set("AI视觉系统仅能识别田间的杂草,无法识别病害斑点,因此无法实现精准施药。", "B");
videoBank.set("系统可根据实时水质监测数据,远程控制增氧泵、底部增氧机等设备,实现水质的远程调控。", "A");
videoBank.set("2025 年 12月,字节推出了 “豆包手机助手 ”正式版,合作伙伴包含中兴努比亚(M153工程机)。", "A");
videoBank.set("AI+消费在技术层面的核心挑战,仅包含多模态大模型消费应用的自主可控能力建设。", "B");
videoBank.set("家政服务机器人3.0时代的目标是打造具备通用家务能力的人形机器人,成为家庭“全面手” 。", "A");
videoBank.set("家用服务机器人的 “安全性 ” 特质,仅需避免物理碰撞,无需完善的主动安全防护机制。", "B");
videoBank.set("智能家居行业竞争的核心,目前仍局限于单一产品的功能参数比拼。", "B");
videoBank.set("MOVVA 推出的追觅 “ 天穹” 系列芯片尚未量产,还处于研发测试阶段。", "B");
videoBank.set("“ 脑机捕捉意图 ” 的核心作用是直接生成个性化数字内容,完成交互闭环的最后一步。", "B");
videoBank.set("伦理制度化的核心目标,是推动行业监管从原则倡导向制度化落地转变。", "A");
videoBank.set("ChatGPT 的本质是一个拥有过亿参数的大模型,其参数可通过机器学习自动找出。", "A");
videoBank.set("代码生成模块的能力包含根据需求生成 Python 、 JavaScript等语言的代码片段,以及自动补全与注释生成。", "A");
videoBank.set("使用DeepSeek推理模型时,需通过显式步骤拆解任务,强行拆解步骤能更好发挥能力。", "A");
videoBank.set("根据DeepSeek提示词技巧,提示词表达越模糊越像日常对话,就能获得更好效果。", "B");
videoBank.set("18世纪普鲁士人最先实施发明的课堂教学模式中,核心形式是学生自主讲解知识,教师负责聆听指导。", "B");
videoBank.set("生成式AI目前已具备人类的数学直觉能力,可完全替代人类进行创造性数学研究。", "B");
videoBank.set("人工智能+金融阶段的发展,建立在 IT信息系统稳定可靠、互联网环境成熟基础之上。", "A");
videoBank.set("2018 年谷歌借鉴 ELMo和GPT,推出大规模语言模型BERT,掀起NLP第二次大变革,进入魔改BERT时代。", "A");
videoBank.set("CTF-Net 是纯 CNN架构网络,专门解决纯Transformer架构全局感受野不足问题。", "A");
videoBank.set("城市交通系统是规模巨大、关联复杂、随机性强、混合交通流的大系统,利用交通大数据解决预报控制难题极具挑战性。", "A");
videoBank.set("MBA-Net模型需要依赖辅助模型,才能为被遮挡行人图像生成鲁棒表示特征。", "B");
videoBank.set("数据科学进步,推动复杂系统研究从数据机理融合驱动,向经验驱动、机理驱动范式变革。", "B");
videoBank.set("针对新建光伏电站历史运行数据不足,方案提出基于迁移学习的模型微调,可借同类站点提升发电量预测精度。", "A");
videoBank.set("人工智能大模型工程伦理问题,核心仅涉及科技法律二维,与权利、道德、生命维度无关。", "B");
videoBank.set("《人工智能能力建设普惠计划》2025年12月正式发布,聚焦发展中国家AI能力,缩小数字鸿沟。", "A");
videoBank.set("世界人工智能合作组织倡议2025年7月提出,总部拟设于上海。", "B");
videoBank.set("中国人工智能2025—2026重点:多模态突破、类脑智能、国产算力、产业落地。", "A");
videoBank.set("中国AI发展理念:以技术为本、智能向快。", "B");
videoBank.set("中国大模型首次用于地震救援,DeepSeek仅用7小时开发中缅应急系统。", "A");
videoBank.set("中国AI诊所落地沙特,全球首个AI诊所,覆盖30种呼吸疾病,诊断准确率近100%。", "A");
videoBank.set("AI技术法国家庭节电25%-30%,为联合国气候平台首批伙伴。", "A");
videoBank.set("未来AI注重普惠,缩小数字鸿沟、均衡发展。", "A");
videoBank.set("核心技术依赖进口、产品同质化;中小企业研发强度1.3%,远低于发达国家3%,难破高端市场。", "A");
videoBank.set("2025年基础理论重大突破、部分技术世界领先,成为产业升级经济转型主要动力。", "B");
videoBank.set("《“人工智能+制造”专项行动》保障:推进机制、资金支持、应用推广、监测评估。", "A");
videoBank.set("工业母机柔性化:AI深度融入数控,实现自适应作业、智能诊断、智能调度,大幅提升利用率精度。", "A");
videoBank.set("数据治理五步法:汇聚、清洗、标注、增强、治理。", "A");
videoBank.set("AI价值:驱动“新三样”从规模出海转向高质量出海,构建全球竞争壁垒。", "A");
videoBank.set("未来工厂三大特征:全流程自主运行、虚实实时同步、智能持续迭代。", "A");
videoBank.set("正视挑战、技术创新、标准统一,释放工业数据价值,实现智能化转型跨越。", "A");
// 专题2
videoBank.set("广东区域创新能力连续9年全国第一。", "A");
videoBank.set("广东高技术制造业占规上工业比重不足三成。", "B");
videoBank.set("耐心资本渠道:财政专项资金、政府投资基金、地方政府专项债、超长期特别国债。", "A");
videoBank.set("成长期赛道企业可在北交所、广东区域性股权市场上市。", "B");
videoBank.set("战略性新兴产业是新质生产力主要载体。", "A");
videoBank.set("核心驱动力:新质生产力推动战略性新兴产业持续升级。", "A");
videoBank.set("广东游戏营收、数字出版产值、动漫产值、电影票房等指标全国第一。", "A");
videoBank.set("截至2023年底,广东激光与增材制造产业有效发明专利全国第一。", "A");
videoBank.set("广东战略性新兴产业指导思想:加快从制造大省到制造强省转变。", "A");
videoBank.set("广东战略性新兴产业定位:打造世界先进水平产业基地。", "A");
videoBank.set("新质生产力理论是马克思主义生产力理论创新,丰富发展政治经济学。", "A");
videoBank.set("产业集群成长期竞争优势完全成熟,全球领先。", "B");
videoBank.set("新质生产力支撑仅含技术创新,不含数字化转型与人才支撑。", "B");
videoBank.set("2024年广东数字经济增加值占GDP持续提升,连续多年全国第一。", "B");
videoBank.set("工业机器人上游核心零部件:减速器、伺服电机、控制器,技术壁垒最高。", "A");
videoBank.set("小六轴机器人参与者少,国内暂无优势。", "B");
videoBank.set("腾讯音乐涨价短期拉动营收,不影响付费转化率。", "B");
videoBank.set("东伦敦科技城经验:无政府资金支持相关设施。", "B");
videoBank.set("新质生产力以数据为关键要素,强调知识创新应用。", "A");
videoBank.set("产业布局是产业发展规律体现,指一国地区产业空间分布组合。", "A");
videoBank.set("智能化技术底座:人工智能、大数据、云计算、5G、互联网。", "B");
videoBank.set("转型成效评估:结构优化、创新驱动、集群发展质量。", "A");
videoBank.set("家电产业链行为:产品差异化、并购、研发、价格行为。", "A");
videoBank.set("全球传统产业转移趋势:区域化、成本化、绿色化、多元化。", "A");
videoBank.set("广东传统产业升级原则:创新驱动、重点突破、开放合作、畅通循环、质效优先、绿色发展、市场主导、政府引导。", "B");
videoBank.set("构建高效服务业体系:推动传统服务向现代服务转型。", "A");
videoBank.set("佛山南海开通全国常态化无人机外卖航线。", "A");
videoBank.set("服务业4.0:大数据、AI、IoT驱动无缝服务演进。", "A");
videoBank.set("大都市创新城市:战略性新兴产业与服务业融合,推动产业升级高质量发展。", "A");
videoBank.set("2015-2020广东服务业增加值全国第一。", "A");
videoBank.set("广东服务业人才瓶颈:金融、信息、科研等领域高端人才短缺。", "A");
videoBank.set("现代服务业与先进制造、现代农业深度融合是优质服务业体系重点。", "A");
videoBank.set("服务业监管:企业自律+行业自律+政府监管+社会参与多元共治。", "A");
videoBank.set("1978-1999中国家电研发强、核心器件自主,不依赖进口。", "B");
videoBank.set("2019中国家电零售8910亿,行业成熟。", "A");
videoBank.set("2018-2024小米IoT与生活消费品收入占比25.1%→28.5%,结构多元。", "A");
videoBank.set("小米家电早期高性价比:入门定价、核心功能聚焦、快速抢占份额。", "A");
videoBank.set("2024小米之家约1.5万家,构建人车家全生态。", "A");
videoBank.set("小米电视低价互联网模式:硬件不赚钱,软件盈利。", "A");
videoBank.set("改革开放初期家电政策核心:扩大内需、全球化发展。", "B");
videoBank.set("2011-2019家电线上渠道10.4%→25.4%,社交电商、直播带货增长。", "A");
videoBank.set("我国人口转变特征:迅速性、政策干预、不彻底、不稳定、不平衡。", "A");
videoBank.set("广东20个战略性产业集群增加值占GDP17%,全国约40%。", "B");
videoBank.set("我国人口最多,人口发展事关民族复兴。", "A");
videoBank.set("中国人口转变2050年呈倒U型。", "A");
videoBank.set("人口高质量发展核心:规模、结构、质量、分布四维。", "B");
videoBank.set("经济高质量发展是中国式现代化物质根基与核心支撑。", "A");
videoBank.set("欧盟《新电池法》2024.8.17生效,禁止供应链碳足迹追溯。", "B");
videoBank.set("绿色转型阵痛:传统产业退出导致失业、地方财政下行等短期压力。", "A");
videoBank.set("截至2025年底氢燃料电池汽车销量近4万,实现0-1产业化突破。", "A");
videoBank.set("AI巡检提升效率8倍,成本降15%-30%。", "A");
videoBank.set("2026政策逻辑从控碳转向控能,核心惩罚能耗总量、限制发展空间。", "B");
videoBank.set("碳市场扩容后覆盖碳排放占比60%→30%+。", "B");
videoBank.set("高质量、绿色共生:摒弃高耗能高污染,实现经济生态协同。", "A");
videoBank.set("第一次生产力革命(蒸汽)标志:蒸汽机使用。", "A");
videoBank.set("工业5.0是工业4.0延续,新增绿色可持续与人机协作。", "A");
videoBank.set("欧盟模式核心武器:硅谷+华尔街,对标美国法条标准。", "B");
videoBank.set("上海土地充足、生活成本低,传统劳动密集产业有优势。", "B");
videoBank.set("合肥创新模式:市场雨林型,靠供应链与市场活力。", "B");
// ==============================================
// 悬浮面板
// ==============================================
function initDragPanel() {
panel = document.createElement('div');
panel.style.cssText = `position:fixed;top:10px;right:10px;z-index:999999;background:#ECFDF5;color:#065F46;border-radius:12px;box-shadow:0 6px 18px rgba(0,0,0,0.2);min-width:280px;user-select:none;overflow:hidden;`;
const dragBar = document.createElement('div');
dragBar.style.cssText = `padding:10px 14px;background:#10B981;color:white;font-size:14px;font-weight:bold;cursor:move;display:flex;justify-content:space-between;align-items:center;`;
dragBar.innerText = "公需课全自动(后台保活版)";
const miniBtn = document.createElement('button');
miniBtn.innerText = "−";
miniBtn.style.cssText = `background:none;border:none;color:white;font-size:16px;cursor:pointer;`;
const toggleBtn = document.createElement('button');
toggleBtn.style.cssText = `margin:8px 12px;padding:8px 12px;width:calc(100% - 24px);border:none;border-radius:8px;font-size:14px;font-weight:bold;background:#10B981;color:white;cursor:pointer;`;
toggleBtn.innerText = "✅ 运行中|点击暂停";
const contentWrap = document.createElement('div');
progressText = document.createElement('div');
progressText.style.cssText = "padding:12px 14px;font-size:15px;line-height:1.5;text-align:center;";
progressText.textContent = '✅ 准备就绪 | 支持后台';
contentWrap.appendChild(progressText);
contentWrap.appendChild(toggleBtn);
dragBar.appendChild(miniBtn);
panel.appendChild(dragBar);
panel.appendChild(contentWrap);
document.body.appendChild(panel);
let drag = false, ox, oy;
dragBar.onmousedown = e => { drag = true; ox = e.clientX - panel.getBoundingClientRect().left; oy = e.clientY - panel.getBoundingClientRect().top; panel.style.left = panel.getBoundingClientRect().left + "px"; panel.style.top = panel.getBoundingClientRect().top + "px"; panel.style.right = "auto"; };
document.onmousemove = e => { if (!drag) return; panel.style.left = e.clientX - ox + "px"; panel.style.top = e.clientY - oy + "px"; };
document.onmouseup = () => drag = false;
miniBtn.onclick = () => {
isMinimized = !isMinimized;
contentWrap.style.display = isMinimized ? "none" : "block";
miniBtn.innerText = isMinimized ? "□" : "−";
dragBar.innerText = isMinimized ? "公需课(后台挂着)" : "公需课全自动(后台保活版)";
dragBar.appendChild(miniBtn);
};
toggleBtn.onclick = () => {
scriptEnabled = !scriptEnabled;
const v = document.querySelector('video');
if (scriptEnabled) {
toggleBtn.innerText = "✅ 运行中|点击暂停";
toggleBtn.style.background = "#10B981";
v?.play().catch(() => { });
progressText.textContent = "✅ 继续运行 | 支持后台";
} else {
toggleBtn.innerText = "⏸ 已暂停|点击启动";
toggleBtn.style.background = "#6B7280";
v?.pause();
progressText.textContent = "⏸ 已暂停";
}
};
}
// ==============================================
// 超强真人行为模拟(防掉线)
// ==============================================
function humanLikeActivity() {
if (!scriptEnabled) return;
try {
const w = window.innerWidth, h = window.innerHeight;
const x = Math.random() * w * 0.8 + w * 0.1;
const y = Math.random() * h * 0.8 + h * 0.1;
document.dispatchEvent(new MouseEvent('mousemove', { clientX: x, clientY: y, bubbles: true }));
} catch (e) {}
try {
if (Math.random() > 0.6) {
window.scrollBy({ top: (Math.random() > 0.5 ? 1 : -1) * (Math.random() * 20 + 5), behavior: 'smooth' });
}
} catch (e) {}
try {
if (Math.random() > 0.85) {
const tg = document.querySelectorAll('body,div,section')[Math.floor(Math.random() * document.querySelectorAll('body,div,section').length)];
if (tg && !tg.closest('.layui-layer,.mylayer')) tg.dispatchEvent(new MouseEvent('click', { bubbles: true }));
}
} catch (e) {}
clearTimeout(activeTimer);
activeTimer = setTimeout(humanLikeActivity, Math.floor(Math.random() * 14000) + 13000);
}
function randDelay() {
return Math.floor(Math.random() * (QUICK_DELAY_MAX - QUICK_DELAY_MIN)) + QUICK_DELAY_MIN;
}
// ==============================================
// 视频答题:优先题库 → 多选组合火力覆盖
// ==============================================
function videoAnswer() {
if (!scriptEnabled || isAnswering) return;
const v = document.querySelector('video');
if (v && v.paused && !document.querySelector('.layui-layer,.mylayer-wrap')) {
v.play().catch(() => { });
}
const txt = document.body.innerText;
if (txt.includes('你已完成') || txt.includes('已完成观看')) {
bruteForceRound = 0;
const n = document.querySelector('#studySelectAct .next');
if (n) n.click();
return;
}
if (txt.includes('正确') || txt.includes('错误') || txt.includes('回答') || txt.includes('确定')) {
bruteForceRound = 0;
const btn = document.querySelector('.layui-layer-btn0,.layui-layer-btn1,.mylayer-btn');
if (btn) btn.click();
return;
}
const box = document.querySelector('.layui-layer,.mylayer-wrap');
if (!box) return;
const content = box.querySelector('.layui-layer-content,.mylayer-content');
const submit = box.querySelector('button[type="submit"],.btn,.layui-layer-btn0');
const radio = content?.querySelectorAll('input[type="radio"]');
const check = content?.querySelectorAll('input[type="checkbox"]');
if (!content || !submit || (radio.length < 2 && check.length < 2)) return;
isAnswering = true;
progressText.textContent = "📝 视频答题中";
const clean = s => s.replace(/\s+/g, '').replace(/[()()【】]/g, '');
const t = clean(content.innerText);
let ans = null;
for (const [k, v] of videoBank) {
const keyClean = clean(k);
if (keyClean.includes(t) || t.includes(keyClean)) {
ans = v;
break;
}
}
if (ans) {
setTimeout(() => {
if (radio.length >= 2) {
const target = ans === 'A' ? radio[0] : radio[1];
target.checked = true;
target.click();
target.dispatchEvent(new Event('change', { bubbles: true }));
}
submit.click();
setTimeout(() => { isAnswering = false; progressText.textContent = "✅ 答题成功"; }, 500);
}, randDelay());
return;
}
// 题库未命中 → 火力覆盖(单选+多选组合试错)
progressText.textContent = `⚠️ 题库未命中,遍历第${bruteForceRound + 1}轮`;
if (radio.length >= 2) {
radio.forEach(r => r.checked = false);
const idx = bruteForceRound % radio.length;
radio[idx].checked = true;
radio[idx].click();
} else if (check.length >= 2) {
check.forEach(c => c.checked = false);
let sel = [];
switch(bruteForceRound){
case 0: sel=[0]; break;
case 1: sel=[1]; break;
case 2: sel=[0,1]; break;
case 3: sel=[2]; break;
case 4: sel=[0,2]; break;
case 5: sel=[1,2]; break;
case 6: sel=[0,1,2]; break;
case 7: sel=[3]; break;
case 8: sel=[0,3]; break;
case 9: sel=[1,3]; break;
case 10: sel=[2,3]; break;
case 11: sel=[0,1,2,3]; break;
}
sel.forEach(i=>{ if(check[i]){ check[i].checked=true; check[i].click(); } });
}
submit.click();
bruteForceRound = (bruteForceRound + 1) % MAX_BRUTE_ROUND;
setTimeout(() => { isAnswering = false; }, 500);
}
// ==============================================
// 【多选题终极修复】不会消失、不会被清空
// ==============================================
function examAutoInOrder() {
if (!scriptEnabled || isAnswering) return;
const topicList = document.getElementById('topicList');
if (!topicList) return;
const ansList = getExamAnswers();
const items = Array.from(topicList.querySelectorAll('.m-topic-item'));
if (items.length < 10) return;
progressText.textContent = `📝 考核答题中(共${items.length}题)`;
const map = { A: 0, B: 1, C: 2, D: 3, E: 4 };
(async () => {
isAnswering = true;
for (let i = 0; i < items.length; i++) {
const item = items[i];
const ans = ansList[i]?.trim().toUpperCase();
if (!ans) continue;
progressText.textContent = `第${i + 1}题:${ans}`;
const r = item.querySelectorAll('input[type="radio"]');
const c = item.querySelectorAll('input[type="checkbox"]');
// 单选不变
if (r.length > 0) {
r.forEach(x => x.checked = false);
const idx = map[ans[0]];
if (idx !== undefined && r[idx]) {
r[idx].checked = true;
r[idx].click();
}
}
// 多选:强制锁定勾选,网站无法清空
if (c.length > 0) {
// 先解除网站监听
c.forEach(x => {
x.onchange = null;
x.onclick = null;
});
c.forEach(x => x.checked = false);
for (let ch of ans) {
const idx = map[ch];
if (idx !== undefined && c[idx]) {
c[idx].checked = true;
c[idx].dispatchEvent(new Event('click', { bubbles: true }));
}
}
}
await new Promise(resolve => setTimeout(resolve, randDelay()));
}
progressText.textContent = "✅ 已全部答完,请手动提交";
isAnswering = false;
})();
}
// ==============================================
// 视频监控 & 自动下一节
// ==============================================
function videoMonitor() {
if (!scriptEnabled) return;
const v = document.querySelector('video');
if (!v) {
if (document.body.innerText.includes('考核') || document.getElementById('topicList')) {
progressText.textContent = "⏳ 进入考核,自动答题";
setTimeout(examAutoInOrder, 1000);
} else {
progressText.textContent = "⏳ 等待视频加载";
}
return;
}
const p = v.duration ? Math.round(v.currentTime / v.duration * 100) : 0;
progressText.textContent = `▶ 观看进度 ${p}% | 后台可挂`;
if (p >= 100) videoWatched = true;
const next = document.querySelector('#studySelectAct .next');
if (FORCE_WATCH_END && !videoWatched && next) {
next.style.pointerEvents = 'none';
next.style.opacity = '0.5';
} else if (next) {
next.style.pointerEvents = 'auto';
next.style.opacity = '1';
}
}
function autoNext() {
if (!scriptEnabled) return;
const v = document.querySelector('video');
const popup = document.querySelector('.layui-layer,.mylayer-wrap');
if (v && !popup && v.ended && videoWatched) {
const n = document.querySelector('#studySelectAct .next');
if (n && !n.innerText.includes('考核')) n.click();
}
}
// ==============================================
// 主循环
// ==============================================
function main() {
checkAutoRefresh();
videoAnswer();
videoMonitor();
}
// 启动
enableBackgroundKeepAlive();
initDragPanel();
humanLikeActivity();
setInterval(main, 700);
setInterval(autoNext, 1000);
})();