// ==UserScript== // @name 江西专技在线-网梯科技-全自动刷课助手(jxzj.webtrn.cn) // @version 1.0.0 // @description 江西专技在线-网梯科技自动播放,支持公需课/专业课,两个播放器模板 // @author 晓晓 // @match https://jxzj.webtrn.cn/* // @grant GM_getValue // @grant GM_setValue // @license MIT // ==/UserScript== (function () { 'use strict'; var PATH = location.pathname; // ==================== 通用工具 ==================== function $1(s) { return document.querySelector(s); } function $A(s) { return Array.prototype.slice.call(document.querySelectorAll(s)); } function log(msg, type) { var el = $1('#j-panel .j-log'); if (!el) return; var time = new Date().toLocaleTimeString('zh-CN', { hour12: false }); var color = { ok: '#4ade80', info: '#60a5fa', warn: '#fbbf24', err: '#f87171' }[type || 'info'] || '#94a3b8'; var div = document.createElement('div'); div.innerHTML = '[' + time + '] ' + msg + ''; el.appendChild(div); el.scrollTop = el.scrollHeight; } function setStatus(msg) { var el = $1('#j-status'); if (el) el.textContent = msg; } function setBadge(v) { var el = $1('#j-badge'); if (el) { el.textContent = v ? '● 运行中' : '○ 已暂停'; el.style.background = v ? '#10b981' : '#6b7280'; } } function time_to_sec(time) { var t = (time || '').trim(); var parts = t.split(':').map(Number); if (parts.length === 1) return parts[0] || 0; if (parts.length === 2) return parts[0] * 60 + parts[1]; if (parts.length === 3) return parts[0] * 3600 + parts[1] * 60 + parts[2]; return 0; } // ==================== UI面板 ==================== function createPanel() { var existing = $1('#j-panel'); if (existing) existing.remove(); var isRunning = GM_getValue('j_running', false); var el = document.createElement('div'); el.id = 'j-panel'; el.style.cssText = [ 'position:fixed;top:20px;right:20px;z-index:999999;', 'background:linear-gradient(135deg,#1a1a2e,#16213e);', 'color:#e0e0e0;padding:14px 18px;border-radius:12px;', 'min-width:360px;box-shadow:0 8px 32px rgba(0,0,0,0.5);', 'font-family:"PingFang SC","Microsoft YaHei",sans-serif;', 'border:1px solid rgba(255,255,255,0.08);' ].join(''); el.innerHTML = [ '
', '🎓', '
网梯学苑刷课助手
', '
' + (isRunning ? '● 运行中' : '○ 已暂停') + '
', '
', '
准备中...
', '
', '', '
', '
', '💬', 'wkds995', '客服微信', '
', '
' ].join(''); document.body.appendChild(el); $1('#j-btn-toggle').onclick = function () { var running = GM_getValue('j_running', false); if (running) { GM_setValue('j_running', false); setBadge(false); this.textContent = '▶ 开始刷课'; this.style.background = '#1890ff'; log('已暂停', 'warn'); setStatus('已暂停'); } else { GM_setValue('j_running', true); setBadge(true); this.textContent = '⏸ 暂停刷课'; this.style.background = '#ef4444'; log('开始刷课!', 'warn'); setStatus('正在刷课...'); } }; } // ==================== 弹窗自动处理 ==================== function startPopupWatcher() { setInterval(function () { // layui 弹窗确认按钮 if ($('.layui-layer-btn0').length > 0) { $('.layui-layer-btn0').click(); log('弹窗已点击', 'info'); } }, 1000); } // ==================== 模板一(templatetwo)==================== function runTemplatetwo() { log('模板: templatetwo', 'info'); // --- 课程详情页 --- if (PATH === '/learnspace/learn/learn/templatetwo/index.action') { window.onbeforeunload = null; startPopupWatcher(); setInterval(function () { var text = $('.s_mainmenucurrent').text(); if (text && text !== '课件') { $('#courseware_main_menu div').click(); log('切换到课件', 'info'); } }, 5000); log('课程详情页就绪', 'ok'); setStatus('课程详情页'); } // --- 课件列表页 --- if (PATH === '/learnspace/learn/learn/templatetwo/courseware_index.action') { window.isEnd = false; log('课件列表页', 'info'); setInterval(function () { if (!GM_getValue('j_running', false)) return; if (!window.isEnd) return; window.isEnd = false; var len = $('.s_point').length; var found = false; for (var i = 0; i < len; i++) { var el = $('.s_point').eq(i); if (!el.hasClass('s_pointerct') && el.attr('completestate') == '0' && el.attr('itemtype') === 'video') { el.parent().show(); el.click(); log('播放章节: ' + (i + 1), 'ok'); found = true; break; } } if (!found) { log('全部章节播放完成', 'ok'); setStatus('全部完成!'); GM_setValue('j_running', false); } }, 3000); log('课件列表页就绪', 'ok'); setStatus('课件列表页'); } // --- 视频播放页 --- if (PATH === '/learnspace/learn/learn/templatetwo/content_video.action') { log('视频播放页', 'info'); // 静音 setTimeout(function () { try { player.setVolume(0); log('已静音', 'info'); } catch (e) {} }, 3000); // 防暂停 setInterval(function () { if (!GM_getValue('j_running', false)) return; try { if (player.getStatus() !== 'playing') { player.play(); } } catch (e) {} }, 1000); // 关广告 setInterval(function () { if ($('#container_display_button').css('opacity') === '1') { $('#container_display_button').click(); } }, 1000); // 播放完成检测(95%进度) setInterval(function () { if (!GM_getValue('j_running', false)) return; var now = time_to_sec($('.current-time').text()); var total = time_to_sec($('.duration').text()); if (now > 0 && total > 0 && (now / total) > 0.95) { window.parent.isEnd = true; log('本节播放完成', 'ok'); } }, 500); setStatus('视频播放中...'); } // --- 学习助手弹窗 --- if (PATH === '/learnspace/learn/learnhelper/learnHelper-main.action') { setTimeout(function () { try { window.closeLearnHelper(); } catch (e) {} }, 3000); } } // ==================== 模板二(templateeight)==================== function runTemplateeight() { log('模板: templateeight', 'info'); // --- 课程详情页 --- if (PATH === '/learnspace/learn/learn/templateeight/index.action') { window.onbeforeunload = null; startPopupWatcher(); setInterval(function () { var text = $('.learn-menu-cur .learn-menu-text').text(); if (text && text !== '课件') { $('#courseware_main_menu').click(); log('切换到课件', 'info'); } }, 5000); log('课程详情页就绪', 'ok'); setStatus('课程详情页'); } // --- 课件列表页 --- if (PATH === '/learnspace/learn/learn/templateeight/courseware_index.action') { window.isEnd = false; log('课件列表页', 'info'); setInterval(function () { if (!GM_getValue('j_running', false)) return; if (!window.isEnd) return; window.isEnd = false; var len = $('.s_point').length; var lastDoneIdx = -1; for (var i = 0; i < len; i++) { if ($('.s_point').eq(i).hasClass('s_pointerct')) lastDoneIdx = i; } for (var j = lastDoneIdx + 1; j < len; j++) { var el = $('.s_point').eq(j); if (el.attr('completestate') == '0' && el.attr('itemtype') === 'video') { el.parent().parent().show(); el.parent().show(); el.click(); log('播放章节: ' + (j + 1), 'ok'); return; } } log('全部章节播放完成', 'ok'); setStatus('全部完成!'); GM_setValue('j_running', false); }, 3000); log('课件列表页就绪', 'ok'); setStatus('课件列表页'); } // --- 视频播放页 --- if (PATH === '/learnspace/learn/learn/templateeight/content_video.action') { log('视频播放页', 'info'); // 静音 setTimeout(function () { try { $('.screen-player-volume .screen-player-btn').click(); log('已静音', 'info'); } catch (e) {} }, 3000); // 防暂停 setInterval(function () { if (!GM_getValue('j_running', false)) return; if ($('#player_pause').css('display') !== 'none') { $('#player_pause').click(); } }, 1000); // 播放完成检测(95%进度) setInterval(function () { if (!GM_getValue('j_running', false)) return; var now = time_to_sec($('#screen_player_time_1').text()); var total = time_to_sec($('#screen_player_time_2').text()); if (now > 0 && total > 0 && (now / total) > 0.95) { window.parent.isEnd = true; log('本节播放完成', 'ok'); } }, 3000); setStatus('视频播放中...'); } } // ==================== 入口 ==================== function main() { setTimeout(function () { createPanel(); log('网梯学苑刷课助手 v1.0 已就绪', 'ok'); log('当前页面: ' + PATH, 'info'); var running = GM_getValue('j_running', false); if (running) { setBadge(true); setStatus('正在刷课...'); } else { log('点击「开始刷课」手动启动', 'warn'); setStatus('⏸ 点击上方「开始刷课」'); } // 根据路径分发 if (PATH.indexOf('templatetwo') !== -1) { runTemplatetwo(); } else if (PATH.indexOf('templateeight') !== -1) { runTemplateeight(); } else { log('当前页面无刷课任务', 'info'); setStatus('当前页面无刷课任务'); } }, 1500); } main(); })();