// ==UserScript== // @name 生态环境云课堂自动学习助手v2.9 // @namespace http://onlinelearning.21tb.com/ // @version 2.9 // @description 自动关弹窗、自动进我的课程、自动选未学必修、自动播放切章节、自动答题,静音后台运行 // @author study_bot // @match *://onlinelearning.21tb.com/* // @grant none // @run-at document-idle // @tag 教育,学习,自动化 // @license MIT // ==/UserScript== (function() { 'use strict'; const CHECK_INTERVAL = 4000; const ACTION_COOLDOWN = 10000; let lastActionTime = 0; function log(msg) { try { console.log(`[自动学习v2.9] ${new Date().toLocaleTimeString()} ${msg}`); } catch(e) {} } // 1. 关所有弹窗 function closePopups() { try { document.querySelectorAll('.el-dialog__close, .el-message-box__close, .close-btn, .el-icon-close').forEach(b => { try{b.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 goToCourseList() { const now = Date.now(); if (now - lastActionTime < ACTION_COOLDOWN) return; try { if (location.pathname.includes('/student/index')) { const myCourse = [...document.querySelectorAll('a, div, span')].find(el => el.innerText && el.innerText.trim() === '我的课程' && el.offsetParent !== null ); if (myCourse) { log('在首页,点击进入我的课程'); myCourse.click(); lastActionTime = now; } } } catch(e) {} } // 4. 课程列表自动选未学习必修 function pickNextCourse() { const now = Date.now(); if (now - lastActionTime < ACTION_COOLDOWN) return; try { const cards = [...document.querySelectorAll('[class*=course-item], [class*=card], .list-item')]; for (let card of cards) { const txt = card.innerText; if (txt.includes('必修') && !txt.includes('已完成') && !txt.includes('100%')) { log('点击未学习必修课程: ' + txt.slice(0,40)); card.click(); lastActionTime = now; return; } } } catch(e) {} } // 5. 播放页自动点下一节 function clickNextSection() { const now = Date.now(); if (now - lastActionTime < ACTION_COOLDOWN) return; try { const nextBtn = [...document.querySelectorAll('button, div')].find(el => el.innerText && el.innerText.trim() === '下一节' && el.offsetParent !== null ); if (nextBtn) { log('点击下一节'); nextBtn.click(); lastActionTime = now; return; } const unDone = [...document.querySelectorAll('span, div')].filter(el => el.innerText && el.innerText.trim() === '未完成' && el.offsetParent !== null ); for (let el of unDone) { let parent = el.parentElement; for (let i=0;i<6;i++) { if (!parent) break; if (parent.tagName === 'LI' || parent.tagName === 'A' || parent.onclick) { log('选择未完成章节'); parent.click(); lastActionTime = now; return; } parent = parent.parentElement; } } } catch(e) {} } // 6. 自动答题 async function autoAnswer() { try { const questions = document.querySelectorAll('[class*=question]'); if (!questions.length) return; log(`检测到${questions.length}道题,开始作答`); for (let q of questions) { const opts = q.querySelectorAll('label, .option-item, .el-radio, .el-checkbox'); 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,200)); } } await new Promise(r=>setTimeout(r,1000)); const allDone = [...questions].every(q => q.querySelectorAll('.is-checked').length > 0); if (allDone) { const submit = [...document.querySelectorAll('button')].find(b => b.innerText.includes('提交')); if (submit) submit.click(); } } catch(e) {} } // 7. 主循环 async function loop() { closePopups(); playVideo(); goToCourseList(); if (location.href.includes('course_manage_user_pc')) pickNextCourse(); else clickNextSection(); if (document.body.innerText.includes('单选题')) await autoAnswer(); setTimeout(loop, CHECK_INTERVAL); } log('自动学习v2.9启动:首页自动进课程、自动选未学课程'); setTimeout(loop, 2000); })();