// ==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();
})();