// ==UserScript== // @name TOD🚀全平台网课助手【学习通 U校园ai 知到 英华 仓辉 雨课堂 职教云】【学起 青书 柠檬 睿学 慕享 出头科技 慕华】【国开 广开 上海开放大学】等平台 客服微信:WKWK796 自动刷课 // @namespace https://github.com/wkwk796 // @version 2.7.3 // @description 🐯全网免费仅做一款脚本🐯】、【🚀已完美兼容、智慧树、中国大学mooc、慕课、雨课堂、新国开、超星、学习通、知到、国家开放大学、蓝墨云、职教云、智慧职教、云班课精品课、山东专技、西财在线剩余网站仅支持部分功能🚀】【半兼容、绎通云、U校园、学堂在线】、【😎完美应付测试,全自动答题,一键完成所有资源学习(视频挨个刷时长不存在滴)、视频倍速😎】、 // @author Wkwk796 // @match *://*.chaoxing.com/* // @match *://*.zhihuishu.com/* // @match *://*.chaoxing.com/* // @match *://mooc1.chaoxing.com/nodedetailcontroller/* // @match *://*.chaoxing.com/mooc-ans/work/doHomeWorkNew* // @match *://*.chaoxing.com/work/doHomeWorkNew* // @match *://*.edu.cn/work/doHomeWorkNew* // @match *://*.asklib.com/* // @match *://*.chaoxing.com/* // @match *://*.hlju.edu.cn/* // @match *://lms.ouchn.cn/* // @match *://xczxzdbf.moodle.qwbx.ouchn.cn/* // @match *://tongyi.aliyun.com/qianwen/* // @match *://chatglm.cn/* // @match *://*.zhihuishu.com/* // @match *://course.ougd.cn/* // @match *://moodle.syxy.ouchn.cn/* // @match *://moodle.qwbx.ouchn.cn/* // @match *://elearning.bjou.edu.cn/* // @match *://whkpc.hnqtyq.cn:5678/* // @match *://study.ouchn.cn/* // @match *://www.51xinwei.com/* // @match *://*.w-ling.cn/* // @match *://xuexi.jsou.cn/* // @match *://*.edu-edu.com/* // @match *://xuexi.jsou.cn/* // @match *://spoc-exam.icve.com.cn/* // @match *://*.icve.com.cn/* // @match *://zice.cnzx.info/* // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @grant GM_info // @grant GM_addStyle // @grant unsafeWindow // @grant none // @license MIT // @icon https://static.zhihuishu.com/static/img/favicon.ico // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 配置项 const config = { autoPlay: GM_getValue('autoPlay', true), autoMute: GM_getValue('autoMute', true), autoNext: GM_getValue('autoNext', true), showContact: GM_getValue('showContact', true), customSpeed: parseFloat(GM_getValue('customSpeed', 1.0)), skipCompleted: GM_getValue('skipCompleted', true), disableMonitor: GM_getValue('disableMonitor', false), contactInfo: 'wkwk796' }; // 保存配置 function saveConfig() { try { GM_setValue('autoPlay', config.autoPlay); GM_setValue('autoMute', config.autoMute); GM_setValue('autoNext', config.autoNext); GM_setValue('showContact', config.showContact); GM_setValue('customSpeed', config.customSpeed); GM_setValue('skipCompleted', config.skipCompleted); GM_setValue('disableMonitor', config.disableMonitor); } catch (e) { console.error('保存配置失败:', e); } } // 显示通知 function showNotification(message, type = 'info') { try { if (!document || !document.body) return; const notification = document.createElement('div'); notification.className = 'chaoxing-notification notification-' + type; notification.textContent = message; document.body.appendChild(notification); setTimeout(() => { notification.classList.add('fade-out'); setTimeout(() => { if (document.body && document.body.contains(notification)) { document.body.removeChild(notification); } }, 300); }, 3000); } catch (e) { console.error('显示通知失败:', e); } } // 创建控制面板 function createControlPanel() { try { if (!document || !document.body) return; // 检查是否已存在控制面板 const existingPanel = document.getElementById('chaoxing-auto-play-panel'); if (existingPanel) { existingPanel.style.display = 'block'; return; } const panel = document.createElement('div'); panel.id = 'chaoxing-auto-play-panel'; // 使用字符串拼接避免语法问题 let panelHTML = ''; panelHTML += '
'; panelHTML += '

学习通视频助手控制面板

'; panelHTML += ' '; panelHTML += '
'; panelHTML += '
'; panelHTML += '
'; panelHTML += ' '; panelHTML += '
'; panelHTML += '
'; panelHTML += ' '; panelHTML += '
'; panelHTML += '
'; panelHTML += ' '; panelHTML += '
'; panelHTML += '
'; panelHTML += ' '; panelHTML += '
'; panelHTML += '
'; panelHTML += ' '; panelHTML += '
'; panelHTML += '
'; panelHTML += ' '; panelHTML += '
'; // 添加联系方式 panelHTML += '
'; panelHTML += '

开发者联系方式: ' + config.contactInfo + '

'; panelHTML += '
'; panelHTML += ' '; panelHTML += '
'; panel.innerHTML = panelHTML; document.body.appendChild(panel); // 添加事件监听器 setupPanelEventListeners(panel); } catch (e) { console.error('创建控制面板失败:', e); } } // 设置面板事件监听器 function setupPanelEventListeners(panel) { try { const closeBtn = document.getElementById('chaoxing-close-panel'); if (closeBtn) { closeBtn.addEventListener('click', () => { panel.style.display = 'none'; }); } const autoPlayCheckbox = document.getElementById('chaoxing-auto-play'); if (autoPlayCheckbox) { autoPlayCheckbox.addEventListener('change', (e) => { config.autoPlay = e.target.checked; saveConfig(); if (config.autoPlay) { checkAndPlayVideos(); } }); } const autoMuteCheckbox = document.getElementById('chaoxing-auto-mute'); if (autoMuteCheckbox) { autoMuteCheckbox.addEventListener('change', (e) => { config.autoMute = e.target.checked; saveConfig(); // 如果启用静音,立即将所有视频设为静音 if (config.autoMute && document) { const videos = document.querySelectorAll('video'); videos.forEach(video => { if (video && video.volume !== undefined) { video.muted = true; } }); } }); } const autoNextCheckbox = document.getElementById('chaoxing-auto-next'); if (autoNextCheckbox) { autoNextCheckbox.addEventListener('change', (e) => { config.autoNext = e.target.checked; saveConfig(); }); } const skipCompletedCheckbox = document.getElementById('chaoxing-skip-completed'); if (skipCompletedCheckbox) { skipCompletedCheckbox.addEventListener('change', (e) => { config.skipCompleted = e.target.checked; saveConfig(); }); } const disableMonitorCheckbox = document.getElementById('chaoxing-disable-monitor'); if (disableMonitorCheckbox) { disableMonitorCheckbox.addEventListener('change', (e) => { config.disableMonitor = e.target.checked; saveConfig(); if (config.disableMonitor) { disablePageMonitor(); } }); } const playbackSpeedSelect = document.getElementById('chaoxing-playback-speed'); if (playbackSpeedSelect) { playbackSpeedSelect.addEventListener('change', (e) => { config.customSpeed = parseFloat(e.target.value); saveConfig(); setPlaybackSpeed(); }); } const toggleContactBtn = document.getElementById('chaoxing-toggle-contact'); if (toggleContactBtn) { toggleContactBtn.addEventListener('click', () => { config.showContact = !config.showContact; saveConfig(); const contactInfo = document.querySelector('.chaoxing-contact-info'); if (contactInfo) { contactInfo.style.display = config.showContact ? 'block' : 'none'; } toggleContactBtn.textContent = config.showContact ? '隐藏联系方式' : '显示联系方式'; }); } const refreshVideoBtn = document.getElementById('chaoxing-refresh-video'); if (refreshVideoBtn) { refreshVideoBtn.addEventListener('click', () => { checkAndPlayVideos(); showNotification('视频检测已刷新', 'success'); }); } } catch (e) { console.error('设置面板事件监听器失败:', e); } } // 检查并播放视频 function checkAndPlayVideos() { try { if (!document || !config.autoPlay) return; // 查找所有视频元素 const videos = document.querySelectorAll('video'); videos.forEach(video => { if (!video || !video.tagName) return; // 设置静音 if (config.autoMute && video.muted !== undefined) { video.muted = true; } // 设置播放速度 if (video.playbackRate !== undefined) { video.playbackRate = config.customSpeed; } // 自动播放 if (video.paused && video.play !== undefined) { try { video.play().catch(err => { console.log('视频播放失败,尝试备用方法:', err); // 尝试模拟用户交互后播放 setTimeout(() => { try { video.play(); } catch (e) { console.error('备用播放方法也失败:', e); } }, 100); }); } catch (e) { console.error('播放视频时出错:', e); } } }); // 处理学习通特有的播放器 handleChaoxingPlayers(); } catch (e) { console.error('检查并播放视频失败:', e); } } // 处理学习通特有的播放器 function handleChaoxingPlayers() { try { if (!document) return; // 查找学习通播放器容器 const playerContainers = document.querySelectorAll('.vjs-tech, #video, .d_player, .video-box'); playerContainers.forEach(container => { if (!container) return; // 查找播放按钮并点击 const playButtons = container.querySelectorAll('.vjs-play-control, .vjs-big-play-button, .d-play-btn, .playBtn, .startBtn'); playButtons.forEach(btn => { if (btn && !btn.disabled && btn.style.display !== 'none') { try { btn.click(); } catch (e) { // 静默失败 } } }); }); // 处理进度条拖拽(跳过广告或已观看内容) if (config.skipCompleted) { const progressBars = document.querySelectorAll('.vjs-progress-control, .d-progress-bar, .progress-bar, .progress'); progressBars.forEach(bar => { if (bar) { try { const rect = bar.getBoundingClientRect(); // 模拟点击进度条中间位置 const clickEvent = new MouseEvent('click', { clientX: rect.left + rect.width * 0.5, clientY: rect.top + rect.height * 0.5, bubbles: true, cancelable: true }); bar.dispatchEvent(clickEvent); } catch (e) { // 静默失败 } } }); } } catch (e) { console.error('处理学习通播放器失败:', e); } } // 设置播放速度 function setPlaybackSpeed() { try { if (!document) return; // 设置所有视频元素的播放速度 const videos = document.querySelectorAll('video'); videos.forEach(video => { if (video && video.playbackRate !== undefined) { video.playbackRate = config.customSpeed; } }); // 尝试通过学习通的速度控制功能设置 const speedControls = document.querySelectorAll('.speed-btn, .playback-speed'); speedControls.forEach(control => { if (control) { try { // 尝试点击速度控制按钮 control.click(); // 然后选择对应速度的选项 const speedOptions = document.querySelectorAll('.speed-option, .speed-item'); speedOptions.forEach(option => { if (option && option.textContent && option.textContent.includes(config.customSpeed + 'x')) { setTimeout(() => option.click(), 100); } }); } catch (e) { // 静默失败 } } }); } catch (e) { console.error('设置播放速度失败:', e); } } // 禁用页面监控 function disablePageMonitor() { try { // 禁用常见的窗口失焦检测 if (unsafeWindow) { // 备份原始方法 const originalBlur = unsafeWindow.onblur; const originalVisibilityChange = document.visibilityState; // 覆盖失焦检测 Object.defineProperty(document, 'visibilityState', { get: () => 'visible', configurable: true }); document.addEventListener('visibilitychange', (e) => { e.stopPropagation(); e.preventDefault(); }, true); window.addEventListener('blur', (e) => { e.stopPropagation(); e.preventDefault(); }, true); window.addEventListener('focusout', (e) => { e.stopPropagation(); e.preventDefault(); }, true); } // 阻止页面卸载确认 window.addEventListener('beforeunload', (e) => { e.stopPropagation(); e.preventDefault(); }, true); showNotification('多端监控已禁用', 'success'); } catch (e) { console.error('禁用页面监控失败:', e); } } // 检查是否需要自动播放下一节 function checkNextVideo() { try { if (!document || !config.autoNext) return; // 检测视频是否播放完毕 const videos = document.querySelectorAll('video'); let allVideosEnded = true; videos.forEach(video => { if (video && !video.ended) { allVideosEnded = false; } }); // 如果所有视频都播放完毕,尝试查找并点击下一节按钮 if (allVideosEnded) { const nextButtons = document.querySelectorAll( '.next-btn, .nextChapter, .nextVideo, .next-step, ' + '[id*="next"], [class*="next"], [data-role="next"], ' + '.ant-btn-next, .btn-next, .next-btn-primary' ); nextButtons.forEach(btn => { if (btn && !btn.disabled && btn.style.display !== 'none') { try { btn.click(); showNotification('自动播放下一节', 'success'); } catch (e) { // 静默失败 } } }); } } catch (e) { console.error('检查下一节视频失败:', e); } } // 处理动态加载的内容 function handleDynamicContent() { try { // 使用 MutationObserver 监控 DOM 变化 const observer = new MutationObserver((mutations) => { mutations.forEach(mutation => { if (mutation.addedNodes && mutation.addedNodes.length > 0) { // 检查是否有新的视频元素被添加 let hasVideo = false; mutation.addedNodes.forEach(node => { if (node.nodeType === 1) { // Element node if (node.tagName === 'VIDEO' || node.querySelector('video')) { hasVideo = true; } // 检查学习通特有的播放器容器 const playerSelectors = '.vjs-tech, #video, .d_player, .video-box'; if (node.querySelector(playerSelectors)) { hasVideo = true; } } }); if (hasVideo) { setTimeout(checkAndPlayVideos, 500); } } }); }); // 开始监控 observer.observe(document.body, { childList: true, subtree: true }); } catch (e) { console.error('处理动态内容失败:', e); } } // 添加样式 function addStyles() { try { GM_addStyle(` /* 控制面板样式 */ #chaoxing-auto-play-panel { position: fixed; top: 50px; right: 20px; width: 300px; background: rgba(255, 255, 255, 0.95); border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); z-index: 999999; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; } .chaoxing-panel-header { padding: 15px; background: #4CAF50; color: white; border-radius: 8px 8px 0 0; display: flex; justify-content: space-between; align-items: center; } .chaoxing-panel-header h3 { margin: 0; font-size: 16px; font-weight: 600; } #chaoxing-close-panel { background: none; border: none; color: white; font-size: 24px; cursor: pointer; padding: 0; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: background 0.2s; } #chaoxing-close-panel:hover { background: rgba(255, 255, 255, 0.2); } .chaoxing-panel-body { padding: 20px; } .chaoxing-control-item { margin-bottom: 15px; display: flex; align-items: center; } .chaoxing-control-item label { display: flex; align-items: center; cursor: pointer; user-select: none; font-size: 14px; color: #333; } .chaoxing-control-item input[type="checkbox"] { margin-right: 8px; width: 16px; height: 16px; cursor: pointer; } .chaoxing-control-item select { margin-left: 8px; padding: 4px 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; cursor: pointer; } .chaoxing-contact-info { margin: 20px 0; padding: 10px; background: #f5f5f5; border-radius: 4px; text-align: center; } .chaoxing-contact-info p { margin: 0; font-size: 14px; color: #666; } .chaoxing-panel-footer { display: flex; justify-content: space-between; margin-top: 20px; } .chaoxing-panel-footer button { padding: 8px 16px; background: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; transition: background 0.2s; } .chaoxing-panel-footer button:hover { background: #45a049; } /* 通知样式 */ .chaoxing-notification { position: fixed; top: 20px; right: 20px; padding: 15px 20px; background: #333; color: white; border-radius: 4px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); z-index: 999999; font-size: 14px; transition: opacity 0.3s, transform 0.3s; transform: translateY(0); } .chaoxing-notification.notification-success { background: #4CAF50; } .chaoxing-notification.notification-error { background: #f44336; } .chaoxing-notification.notification-warning { background: #ff9800; } .chaoxing-notification.fade-out { opacity: 0; transform: translateY(-10px); } `); } catch (e) { console.error('添加样式失败:', e); } } // 主函数 function init() { try { // 等待页面加载完成 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { addStyles(); createControlPanel(); handleDynamicContent(); // 初始检查视频 setTimeout(checkAndPlayVideos, 1000); // 定期检查视频状态 setInterval(() => { checkAndPlayVideos(); checkNextVideo(); }, 3000); }); } else { // 页面已经加载完成 addStyles(); createControlPanel(); handleDynamicContent(); // 初始检查视频 setTimeout(checkAndPlayVideos, 1000); // 定期检查视频状态 setInterval(() => { checkAndPlayVideos(); checkNextVideo(); }, 3000); } // 注册菜单命令 try { GM_registerMenuCommand('显示控制面板', () => { const panel = document.getElementById('chaoxing-auto-play-panel'); if (panel) { panel.style.display = 'block'; } else { createControlPanel(); } }); GM_registerMenuCommand('刷新视频检测', checkAndPlayVideos); } catch (e) { console.log('GM_registerMenuCommand 不可用:', e); } } catch (e) { console.error('初始化脚本失败:', e); } } // 启动脚本 init(); })();