广西教师培训管理信息系统刷课脚本分享
# 平台情况
广西教师培训管理信息系统,网址 https://jspxzx.gxeduyun.edu.cn/portal/ ,这个是广西壮族自治区教育厅搞的教师培训平台。全广西的中小学幼儿园教师应该都用过,上面什么国培计划、区培项目、新教材培训都有,每年都得完成规定的培训学时。
前阵子南宁青秀区的黄老师加我微信,说她在南宁某小学教语文,这个平台上的培训任务把她搞得很烦。黄老师平时教学任务就不轻,备课上课批改作业,还要管班上的纪律,白天根本没空。晚上回家还得辅导自己孩子的功课,等忙完都九点多了,哪还有精力坐电脑前看视频。
黄老师跟我吐槽说,有次她硬着头皮看到十点半,中间去倒了杯水回来,发现视频暂停了,进度也没保存住。她说广西教师培训这个平台吧,界面看着还行,但视频播放器不太好用,没有自动连播功能,每集看完得手动点下一集。而且长时间不操作它会判定你不在线,直接给你退出登录,得重新来。那天早上我刚喝完豆浆就想到这个办法,赶紧给她研究了一下。
我登录平台看了看,这个网站信息还挺多的,什么培训通知、项目申报都有。培训课程方面,教师继续教育的课程量不小,每门课好几集视频,全部看完才能拿到学时。对了,人教版新教材的网络培训资源也在上面,不过回放是不记学时的。
# 脚本功能
针对广西教师培训管理信息系统的特点,脚本实现了以下功能:
视频自动播放,打开课程页面后自动开始播放,不用手动点。自动切换下一节,检测到视频快播完时自动跳到下一个。防掉线模拟,定期模拟鼠标移动,避免系统判定长时间无操作。倍速调节,1倍到2倍速可选。进度实时显示,控制面板上能看到当前状态和已完成数量。课程列表智能识别,自动跳过已经完成的章节。
脚本安装地址: 暂时下架
# 代学服务
提示
如需代学,请联系客服,支持闲鱼交易。

微信联系:yizhituziang

QQ联系:2422270452
- img: /img/weixin.jpg
name: 微信联系:yizhituziang
- img: /img/qq.jpg
name: QQ联系:2422270452
# 使用感受
黄老师用了快两周了,跟我说省心多了。现在她上班前把浏览器挂着,中午在办公室看一眼进度,下班的时候基本就把当天的任务跑完了。她说再也不用半夜守着电脑一集一集点了,之前那种困得眼睛都睁不开还得盯着切换下一集的日子终于结束了。
不过有个事得说一下,广西教师培训有些课程后面带在线考核或者作业提交,脚本暂时帮不了你,得自己做。还有如果你们学校要求人脸核验或者实名认证,那也得自己来。黄老师说她大部分视频课都能自动刷,就几门带考核的自己做了。
对了,黄老师还说了个事,用脚本的时候浏览器窗口不能最小化,得开着挂着。她之前最小化过一次,回来发现视频停了,后来就一直开着窗口缩小放旁边,再没出过问题。
# 使用场景
白天上课晚上还要备课的,像黄老师那样忙得团团转的。课程内容之前就学过的,走个流程拿学时。想省时间早点完成培训任务的,开个1.5倍速挂着跑效率高。
# 技术细节
广西教师培训管理信息系统用的是教育云平台框架,界面风格比较规范。脚本通过定时检测video元素状态来判断播放进度,配合课程列表的DOM结构找到下一节。
防掉线这块比较关键,因为平台对长时间不操作检测比较严格。脚本会生成随机鼠标移动轨迹,间隔时间也做了随机化处理,不会太规律被系统发现。另外加了视频暂停检测,如果视频意外停止会自动尝试恢复播放。还有个问题,这个平台有时候视频加载比较慢,脚本加了等待机制,不会因为加载慢就误判。
整体方案针对广西教师培训平台做了专门适配,黄老师用了两周基本没出什么问题。
# 结束语
广西教师培训管理信息系统是广西地区教师每年都要用的平台,黄老师之前为了刷课经常熬到半夜,用了脚本之后终于不用专门守在电脑前了。广西的教师本来工作就忙,脚本能帮你省去大部分盯屏幕的时间,让你能把精力放在教学上。
# 核心代码
(function() {
'use strict';
const GX = {
domain: 'gxeduyun.edu.cn',
tick: 2500,
hop: 3500,
pulse: 13000,
finish: 91,
key: 'gxjspx_auto'
};
let S = {
on: false,
n: 0,
speed: 1.0,
lastPulse: Date.now(),
ghost: 0,
stallCnt: 0,
lastPct: 0
};
function log(m) { console.log('[广西教师培训] ' + m); }
function loadCfg() {
let r = localStorage.getItem(GX.key);
if (r) { try { S.on = JSON.parse(r).active !== false; } catch(x) { S.on = true; } }
else { S.on = true; }
}
function saveCfg() {
localStorage.setItem(GX.key, JSON.stringify({ active: S.on, speed: S.speed }));
}
function start() {
loadCfg();
if (S.on) { log('广西教师培训自动学习已启动'); loop(); }
buildUI();
}
function getVideo() {
const sels = ['video', '#vPlayer video', '.course-video video',
'.train-video video', '.video-js video', '.vjs-tech', 'video.edu-player'];
for (const s of sels) {
const el = document.querySelector(s);
if (el && el.duration > 0 && el.offsetParent !== null) return el;
}
return null;
}
function getWrap() {
const sels = ['#vPlayer', '.course-player', '.train-player',
'.video-box', '.player-wrap', '.edu-player'];
for (const s of sels) {
const el = document.querySelector(s);
if (el) return el;
}
return document.body;
}
function progress(v) {
if (!v || !v.duration) return 0;
return (v.currentTime / v.duration) * 100;
}
function play(v) {
if (!v) return false;
try {
if (v.paused) {
const p = v.play();
if (p && p.catch) p.catch(() => { v.muted = true; v.play().catch(() => {}); });
}
return true;
} catch(e) { return false; }
}
function setSpeed(v, r) {
if (!v) return;
try { v.playbackRate = r; S.speed = r; log('倍速 ' + r + 'x'); }
catch(e) { log('倍速设置出错'); }
}
function heartbeat() {
const now = Date.now();
if (now - S.lastPulse > GX.pulse) {
const w = getWrap(), b = w.getBoundingClientRect();
const cx = b.left + Math.random() * b.width;
const cy = b.top + Math.random() * b.height;
document.dispatchEvent(new MouseEvent('mousemove', {
clientX: cx, clientY: cy, bubbles: true
}));
setTimeout(() => {
document.dispatchEvent(new MouseEvent('click', {
clientX: cx, clientY: cy, bubbles: true
}));
}, 400);
S.lastPulse = now;
log('心跳模拟完成,保持在线');
}
}
function nextButton() {
const qs = ['.next-btn', '.btn-next', '.next-chapter', '[class*="next"]'];
for (const q of qs) {
const bs = document.querySelectorAll(q);
for (const b of bs) {
if (b.offsetParent !== null && !b.disabled) return b;
}
}
return null;
}
function chapters() {
return document.querySelectorAll(
'.chapter-item,.lesson-item,.course-section,.section-row,.catalog-node'
);
}
function isDone(el) { return el.querySelector('.finished,.done,.complete,.pass') !== null; }
function isCur(el) { return el.classList.contains('active') || el.classList.contains('current'); }
function goNext() {
const btn = nextButton();
if (btn) { btn.click(); S.n++; log('切换下一节,已完成 ' + S.n + ' 节'); setTimeout(loop, GX.hop); return; }
const ls = chapters();
let hit = false;
for (const l of ls) {
if (isCur(l)) { hit = true; continue; }
if (hit && !isDone(l)) { l.click(); S.n++; log('跳转到下一未完成章节'); setTimeout(loop, GX.hop); return; }
}
log('所有章节已完成');
}
function checkStall(p) {
if (Math.abs(p - S.lastPct) < 0.1) {
S.stallCnt++;
if (S.stallCnt > 10) { log('进度可能卡住,刷新页面'); S.stallCnt = 0; location.reload(); }
} else { S.stallCnt = 0; }
S.lastPct = p;
}
function loop() {
const v = getVideo();
if (!v) {
S.ghost++;
if (S.ghost > 15) log('找不到视频,请确认在课程页面');
setTimeout(loop, GX.tick); return;
}
S.ghost = 0;
play(v);
const p = progress(v);
checkStall(p);
if (p >= GX.finish) { log('播放至 ' + p.toFixed(1) + '%,准备跳转'); goNext(); return; }
heartbeat();
setTimeout(loop, GX.tick);
}
function buildUI() {
if (document.getElementById('gx-panel')) return;
const d = document.createElement('div');
d.id = 'gx-panel';
d.style.cssText = 'position:fixed;top:120px;right:20px;width:210px;background:#fff;border-radius:8px;box-shadow:0 2px 12px rgba(0,0,0,0.15);padding:16px;z-index:99999;font-size:14px;';
d.innerHTML = '<div style="font-weight:bold;margin-bottom:12px;color:#333;">广西教师培训自动刷课</div>' +
'<div style="margin-bottom:8px;"><span style="color:#666;">状态:</span><span id="gx-st" style="color:#52c41a;">运行中</span></div>' +
'<div style="margin-bottom:8px;"><span style="color:#666;">完成:</span><span id="gx-dn" style="color:#1890ff;">0</span> 节</div>' +
'<div style="margin-bottom:12px;"><span style="color:#666;">倍速:</span><select id="gx-sp" style="padding:2px 6px;border-radius:4px;"><option value="1">1倍速</option><option value="1.5" selected>1.5倍速</option><option value="2">2倍速</option></select></div>' +
'<button id="gx-tg" style="width:100%;padding:8px;background:#ff4d4f;color:#fff;border:none;border-radius:4px;cursor:pointer;">停止脚本</button>';
document.body.appendChild(d);
document.getElementById('gx-sp').onchange = function() {
S.speed = parseFloat(this.value);
const v = getVideo(); if (v) setSpeed(v, S.speed); saveCfg();
};
document.getElementById('gx-tg').onclick = function() {
S.on = !S.on;
this.textContent = S.on ? '停止脚本' : '启动脚本';
this.style.background = S.on ? '#ff4d4f' : '#52c41a';
document.getElementById('gx-st').textContent = S.on ? '运行中' : '已停止';
document.getElementById('gx-st').style.color = S.on ? '#52c41a' : '#999';
saveCfg(); if (S.on) { log('脚本重新启动'); loop(); }
};
setInterval(() => { const e = document.getElementById('gx-dn'); if (e) e.textContent = S.n; }, 2000);
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start);
else start();
})();