// ==UserScript== // @name 生态环境云课堂自动学习助手 // @namespace http://onlinelearning.21tb.com/ // @version 3.9 // @description 全国生态环境执法培训云课堂全自动学习:自动识别未完成必修、静音播放、自动切换章节、自动关弹窗、课后题全答完提交、学完自动切下一门 // @author study_bot // @match *://onlinelearning.21tb.com/* // @grant none // @run-at document-idle // @tag 教育,学习,自动化,网课,云课堂 // ==/UserScript== (function() { 'use strict'; const CONFIG = { checkInterval: 4000, actionCooldown: 15000 }; const state = { lastActionTime: 0, visitedCourses: new Set(JSON.parse(localStorage.getItem('visitedCourses') || '[]')) }; function log(msg) { console.log(`[自动学习v3.9] ${new Date().toLocaleTimeString()} | ${msg}`); } function getAllDocs() { const docs = [document]; document.querySelectorAll('iframe').forEach(fr => { try { if (fr.contentDocument) docs.push(fr.contentDocument); } catch(e) {} }); return docs; } function closePopups() { getAllDocs().forEach(doc => { try { doc.querySelectorAll('button[aria-label="Close"], .el-dialog__close, .el-icon-close').forEach(btn => { if (btn.offsetParent) btn.click(); }); [...doc.querySelectorAll('button')].forEach(btn => { const t = (btn.innerText || '').trim(); if (btn.offsetParent && (t === '关闭窗口' || t === '知道了' || t === '关 闭')) { btn.click(); log('关闭弹窗'); } }); doc.querySelectorAll('.el-dialog__wrapper, .el-overlay').forEach(m => { if (getComputedStyle(m).display !== 'none') m.click(); }); } catch(e) {} }); } function playVideo() { getAllDocs().forEach(doc => { doc.querySelectorAll('video').forEach(v => { v.muted = true; v.volume = 0; v.playbackRate = 1.0; if (v.paused) v.play().catch(()=>{}); }); }); } function pickNextCourse() { const now = Date.now(); if (now - state.lastActionTime < CONFIG.actionCooldown) return; getAllDocs().forEach(doc => { try { if (!doc.location.href.includes('course_manage_user_pc')) return; const cards = [...doc.querySelectorAll('div, button')].filter(el => { if (!el.innerText || !el.offsetParent) return false; const t = el.innerText; return t.includes('必修') && t.includes('学习进度') && t.includes('0.0%') && !t.includes('已完成') && t.length < 300; }); for (let c of cards) { const key = c.innerText.slice(0,40); if (!state.visitedCourses.has(key)) { log('自动选未完成必修课: ' + c.innerText.split('\n')[0]); c.click(); state.visitedCourses.add(key); localStorage.setItem('visitedCourses', JSON.stringify([...state.visitedCourses])); state.lastActionTime = now; return; } } } catch(e) {} }); } function nextSection() { const now = Date.now(); if (now - state.lastActionTime < CONFIG.actionCooldown) return; getAllDocs().forEach(doc => { try { if (!doc.location.href.includes('courseLearning/play')) return; const nextBtn = [...doc.querySelectorAll('button')].find(el => (el.innerText || '').trim() === '下一节' && el.offsetParent && !el.disabled); if (nextBtn) { nextBtn.click(); state.lastActionTime = now; log('点击下一节'); return; } const unDoneBtns = [...doc.querySelectorAll('button')].filter(el => (el.innerText || '').trim() === '未完成' && el.offsetParent); if (unDoneBtns.length > 0) { log(`发现${unDoneBtns.length}个未完成章节,点击第一个`); unDoneBtns[0].click(); state.lastActionTime = now; return; } const closeBtn = [...doc.querySelectorAll('button')].find(el => (el.innerText || '').trim() === '关 闭' && el.offsetParent); if (closeBtn && !doc.body.innerText.includes('未完成')) { log('本课程全部学完,关闭返回课程列表'); closeBtn.click(); state.lastActionTime = now; } } catch(e) {} }); } async function answerQuiz() { getAllDocs().forEach(async doc => { try { const qs = doc.querySelectorAll('[class*=question-item], [class*=quiz-item]'); if (!qs.length) return; log(`检测到${qs.length}道题,开始作答`); for (let q of qs) { const opts = q.querySelectorAll('label, .el-radio, .el-checkbox-item'); const unsel = [...opts].filter(o => !o.classList.contains('is-checked')); if (unsel.length) { unsel[Math.floor(Math.random()*unsel.length)].click(); await new Promise(r=>setTimeout(r,300)); } } await new Promise(r=>setTimeout(r,1500)); const allDone = [...qs].every(q => q.querySelectorAll('.is-checked').length > 0); if (allDone) { const submit = [...doc.querySelectorAll('button')].find(b => b.innerText?.includes('提交') && b.offsetParent); if (submit) { submit.click(); log('全部题目答完,提交试卷'); } } } catch(e) {} }); } async function loop() { closePopups(); playVideo(); pickNextCourse(); nextSection(); const hasQuiz = getAllDocs().some(d => d.body.innerText.includes('单选题') || d.querySelectorAll('[class*=question-item]').length > 0); if (hasQuiz) await answerQuiz(); setTimeout(loop, CONFIG.checkInterval); } log('v3.9启动:永久自动学习,刷新不失效'); setTimeout(loop, 3000); })();