// ==UserScript== // @name 生态环境云课堂自动学习助手 // @namespace http://onlinelearning.21tb.com/ // @version 3.3 // @description 全国生态环境执法培训云课堂全自动学习:精准关弹窗、自动循环学完所有必修,静音后台运行,修复重复选课/弹窗识别bug // @author study_bot // @match *://onlinelearning.21tb.com/* // @grant none // @run-at document-idle // @noframes // @tag 教育,学习,自动化,网课,云课堂 // @license MIT // ==/UserScript== (function() { 'use strict'; const CONFIG = { checkInterval: 4000, actionCooldown: 12000, storageKey: 'studyBotVisitedCourses' }; const state = { lastActionTime: 0, visitedCourses: new Set(JSON.parse(localStorage.getItem(CONFIG.storageKey) || '[]')), courseCompleted: false }; function log(msg) { try { console.log(`[自动学习v3.3] ${new Date().toLocaleTimeString()} | ${msg}`); } catch(e) {} } function isVisible(el) { return el && el.offsetParent !== null || (getComputedStyle(el).position === 'fixed' && getComputedStyle(el).display !== 'none'); } function saveVisited() { localStorage.setItem(CONFIG.storageKey, JSON.stringify([...state.visitedCourses])); } // 1. 精准关弹窗 function closePopups() { try { document.querySelectorAll('button[aria-label="Close"], .el-dialog__close, .modal-close, .el-icon-close, .close-icon').forEach(btn => { try { if (isVisible(btn)) btn.click(); } catch(e) {} }); } catch(e) {} } // 2. 视频静音播放 function playVideo() { try { document.querySelectorAll('video').forEach(v => { v.muted = true; v.volume = 0; v.playbackRate = 1; if (v.paused) v.play().catch(()=>{}); }); } catch(e) {} } // 3. 首页自动进我的课程 function goCourseList() { const now = Date.now(); if (now - state.lastActionTime < CONFIG.actionCooldown) return; try { if (location.pathname.includes('/student/index')) { const btn = [...document.querySelectorAll('a, div, span, .nav-link')].find(el => el.innerText?.trim() === '我的课程' && isVisible(el) ); if (btn) { log('首页自动进入我的课程'); btn.click(); state.lastActionTime = now; } } } catch(e) {} } // 4. 课程列表自动选未学必修 function pickNextCourse() { const now = Date.now(); if (now - state.lastActionTime < CONFIG.actionCooldown) return; try { if (!location.href.includes('course_manage_user_pc')) return; // 精准选课程卡片 const cards = [...document.querySelectorAll('.course-card, .item-card, .course-item, [class*="course-list"] [class*="card"]')]; for (let c of cards) { const t = c.innerText || ''; if (t.includes('必修') && !t.includes('已完成') && !t.includes('100%')) { const courseName = t.split('\n')[0].trim(); if (state.visitedCourses.has(courseName)) continue; log(`进入未学必修课程: ${courseName}`); c.click(); state.visitedCourses.add(courseName); saveVisited(); state.lastActionTime = now; return; } } } catch(e) {} } // 5. 播放页切章节 function nextSection() { const now = Date.now(); if (now - state.lastActionTime < CONFIG.actionCooldown) return; try { if (!location.href.includes('courseLearning/play')) return; // 找下一节按钮 const nextBtn = [...document.querySelectorAll('button')].find(el => el.innerText?.trim() === '下一节' && isVisible(el) && !el.disabled ); if (nextBtn) { log('点击下一节'); nextBtn.click(); state.lastActionTime = now; return; } // 找右侧未完成章节 const unDone = [...document.querySelectorAll('span, div')].filter(el => el.innerText?.trim() === '未完成' && isVisible(el) ); for (let el of unDone) { let p = el.parentElement; for (let i=0;i<6;i++) { if (!p) break; if (p.tagName === 'LI' || p.tagName === 'A' || p.onclick) { log('点击未完成章节'); p.click(); state.lastActionTime = now; return; } p = p.parentElement; } } // 确认课程全部学完才返回列表 if (document.body.innerText.includes('恭喜你完成本课程')) { log('当前课程全部学完,返回列表选下一门'); state.courseCompleted = true; setTimeout(() => history.back(), 2000); state.lastActionTime = now; } } catch(e) {} } // 6. 自动答题(提高正确率) async function answerQuiz() { try { const qs = document.querySelectorAll('[class*="question-item"], [class*="quiz-item"]'); if (!qs.length) return; log(`检测到${qs.length}道题,开始作答`); for (let q of qs) { const qText = q.innerText || ''; const opts = q.querySelectorAll('label, .el-radio, .el-checkbox-item, .option'); const unsel = [...opts].filter(o => !o.classList.contains('is-checked')); if (!unsel.length) continue; // 判断题优先选"正确" if (qText.includes('正确') && qText.includes('错误')) { const right = unsel.find(o => o.innerText.includes('正确')); if (right) { right.click(); await new Promise(r=>setTimeout(r,200)); continue; } } // 其他题随机选 unsel[Math.floor(Math.random()*unsel.length)].click(); await new Promise(r=>setTimeout(r,200)); } await new Promise(r=>setTimeout(r,1000)); const allDone = [...qs].every(q => q.querySelectorAll('.is-checked').length > 0); if (allDone) { const submit = [...document.querySelectorAll('button')].find(b => b.innerText?.includes('提交') && isVisible(b)); if (submit) { log('所有题目作答完成,提交答卷'); submit.click(); } } } catch(e) {} } // 主循环 async function loop() { closePopups(); playVideo(); goCourseList(); pickNextCourse(); nextSection(); if (document.body.innerText.includes('单选题') || document.body.innerText.includes('判断题')) { await answerQuiz(); } setTimeout(loop, CONFIG.checkInterval); } log('v3.3修复版启动:精准弹窗识别、高正确率答题、不重复选课'); setTimeout(loop, 2000); })();