温州市住房和城乡建设行业专业技术人员继续教育刷课脚本分享
# 平台情况
温州市住房和城乡建设行业专业技术人员继续教育平台,网址 https://wzjx.ylxue.net/ ,温州这边搞建筑、搞工程的朋友应该都熟悉。这个平台是温州市住建局主管的,专门给住建行业的技术人员做继续教育培训,什么公需课专业课都有,每年得修满规定学时才能通过考核。
上个月鹿城区的陈工找我,说他在温州某建筑设计院上班,这个平台的课快把他逼疯了。陈工平时项目一个接一个,白天跑工地、看图纸、开会,有时候连午饭都顾不上吃。晚上回家还得处理邮件、改方案,等忙完都十点多了。他说打开平台看到那些课程列表就头大,每门课好几集视频,一集一集手动点,点完还得等它播完才能记学时。
陈工跟我抱怨说,有回他硬撑着看到十一点,中间去上了个厕所回来,视频居然暂停了,进度也没存住。他说这个平台的播放器有点怪,鼠标不动它就给你停了,好像在监控你有没有在看。嗯...我后来研究了一下,确实是平台加了防挂机检测,长时间没操作就会暂停视频。
温州这边建筑行业竞争激烈,职称评审又跟学时挂钩,不刷不行。陈工说他同事好几个都因为这个平台的事烦得不行,有的干脆花钱请人代看,但也不放心把账号给别人。
# 脚本功能
针对温州住建继续教育平台的特点,脚本实现了以下功能:
视频自动播放,打开课程页面后自动开始播放,不用手动点。自动切换下一节,检测到视频快播完时自动跳到下一个。防掉线模拟,定期模拟鼠标移动,避免系统判定长时间无操作。倍速调节,1倍到2倍速可选。进度实时显示,控制面板上能看到当前状态和已完成数量。课程列表智能识别,自动跳过已经完成的章节。
脚本安装地址: 暂时下架
# 代学服务
提示
如需代学,请联系客服,支持闲鱼交易。

微信联系:yizhituziang

QQ联系:2422270452
- img: /img/weixin.jpg
name: 微信联系:yizhituziang
- img: /img/qq.jpg
name: QQ联系:2422270452
# 使用感受
陈工用了差不多两周,跟我说省了不少事。现在他上班前把浏览器开着挂着,中午在办公室瞄一眼进度,下午下班前基本就把当天的量跑完了。他说再也不用半夜守着电脑一集一集点了,之前那种困得眼睛都睁不开还得盯着切换下一集的日子,想起来就心酸。
不过有个事得说一下,温州住建这个平台有些课程后面带在线考试或者作业,脚本暂时帮不了你,得自己做。还有如果你们单位要求人脸核验或者实名认证,那也得自己来。陈工说他大部分视频课都能自动刷,就几门带考试的自己做了,也不算太麻烦。
对了,陈工还提醒了一个事,用脚本的时候浏览器窗口不能最小化,得开着挂着。他之前最小化过一次,回来发现视频停了,后来就一直开着窗口缩小放旁边,再没出过问题。
# 使用场景
白天跑工地晚上还要改方案的,像陈工那样忙得团团转的。课程内容之前就学过的,走个流程拿学时。想省时间早点完成培训任务的,开个1.5倍速挂着跑效率高。
# 技术细节
温州住建继续教育平台用的是ylxue系列框架,界面风格比较简洁。脚本通过定时检测video元素状态来判断播放进度,配合课程列表的DOM结构找到下一节。
防掉线这块比较关键,因为平台对长时间不操作检测比较严格。脚本会生成随机鼠标移动轨迹,间隔时间也做了随机化处理,不会太规律被系统发现。另外加了视频暂停检测,如果视频意外停止会自动尝试恢复播放。还有个问题,这个平台有时候视频加载比较慢,脚本加了等待机制,不会因为加载慢就误判。
整体方案针对温州住建平台做了专门适配,陈工用了两周基本没出什么问题。
# 常见问题
脚本安装地址暂时下架,有需要代学的朋友看页面底部联系方式。
倍速怎么选?建议1.5倍,温州这边网络还行,太快了怕视频加载跟不上。
浏览器用什么好?Chrome或Edge最稳,其他浏览器可能有些兼容问题。
进度没同步怎么办?刷新一下页面,平台会自动保存学习进度。
在线考试能自动做吗?暂时不支持,得自己看题目做。
视频加载慢怎么办?脚本会自动等待,不用手动操作。
# 结束语
温州住建继续教育平台是温州地区建筑行业技术人员每年都要用的,陈工之前为了刷课经常熬到半夜,用了脚本之后终于不用专门守在电脑前了。温州是建筑大市,住建行业技术人员本来就很忙,脚本能帮你省去大部分盯屏幕的时间,让你能把精力放在项目上。
# 核心代码
(function() {
'use strict';
var WZ = {
site: 'wzjx.ylxue.net',
loopMs: 2300,
skipMs: 3800,
actMs: 12000,
endAt: 90,
tag: 'wzjx_auto'
};
var D = {
run: false,
cnt: 0,
spd: 1.0,
lastAct: Date.now(),
miss: 0,
stall: 0,
prevPct: 0
};
function out(s) {
console.log('[温州住建] ' + s);
}
function read() {
var v = localStorage.getItem(WZ.tag);
if (v) {
try { D.run = JSON.parse(v).on !== false; }
catch(e) { D.run = true; }
} else { D.run = true; }
}
function write() {
localStorage.setItem(WZ.tag, JSON.stringify({
on: D.run, spd: D.spd
}));
}
function boot() {
read();
if (D.run) { out('温州住建继续教育自动学习已启动'); scan(); }
panel();
}
function vid() {
var ss = ['video','#playBox video','.course-video video',
'.train-video video','.video-js video','.vjs-tech','video.ylxue-player'];
for (var i = 0; i < ss.length; i++) {
var e = document.querySelector(ss[i]);
if (e && e.duration > 0 && e.offsetParent !== null) return e;
}
return null;
}
function box() {
var ss = ['#playBox','.course-player','.train-player',
'.video-wrapper','.player-box','.ylxue-player'];
for (var i = 0; i < ss.length; i++) {
var e = document.querySelector(ss[i]);
if (e) return e;
}
return document.body;
}
function pct(v) {
if (!v || !v.duration) return 0;
return (v.currentTime / v.duration) * 100;
}
function go(v) {
if (!v) return false;
try {
if (v.paused) {
var p = v.play();
if (p && p.catch) p.catch(function() {
v.muted = true; v.play().catch(function(){});
});
}
return true;
} catch(e) { return false; }
}
function rate(v, r) {
if (!v) return;
try { v.playbackRate = r; D.spd = r; out('倍速 ' + r + 'x'); }
catch(e) { out('倍速设置出错'); }
}
function act() {
var t = Date.now();
if (t - D.lastAct > WZ.actMs) {
var b = box(), r = b.getBoundingClientRect();
var x = r.left + Math.random() * r.width;
var y = r.top + Math.random() * r.height;
document.dispatchEvent(new MouseEvent('mousemove', {
clientX: x, clientY: y, bubbles: true
}));
setTimeout(function() {
document.dispatchEvent(new MouseEvent('click', {
clientX: x, clientY: y, bubbles: true
}));
}, 420);
D.lastAct = t;
out('模拟操作,保持在线');
}
}
function nxtBtn() {
var qs = ['.next-btn','.btn-next','.next-chapter','[class*="next"]'];
for (var i = 0; i < qs.length; i++) {
var bs = document.querySelectorAll(qs[i]);
for (var j = 0; j < bs.length; j++) {
if (bs[j].offsetParent !== null && !bs[j].disabled) return bs[j];
}
}
return null;
}
function list() {
return document.querySelectorAll(
'.chapter-item,.lesson-item,.course-section,.section-row,.catalog-node'
);
}
function done(el) { return el.querySelector('.finished,.done,.complete,.pass') !== null; }
function cur(el) { return el.classList.contains('active') || el.classList.contains('current'); }
function skip() {
var btn = nxtBtn();
if (btn) { btn.click(); D.cnt++; out('切换下一节,已完成 ' + D.cnt + ' 节'); setTimeout(scan, WZ.skipMs); return; }
var ls = list(), hit = false;
for (var i = 0; i < ls.length; i++) {
if (cur(ls[i])) { hit = true; continue; }
if (hit && !done(ls[i])) { ls[i].click(); D.cnt++; out('跳转到下一未完成章节'); setTimeout(scan, WZ.skipMs); return; }
}
out('所有章节已完成');
}
function chkStall(p) {
if (Math.abs(p - D.prevPct) < 0.1) {
D.stall++;
if (D.stall > 9) { out('进度可能卡住,刷新页面'); D.stall = 0; location.reload(); }
} else { D.stall = 0; }
D.prevPct = p;
}
function scan() {
var v = vid();
if (!v) {
D.miss++;
if (D.miss > 14) out('找不到视频,请确认在课程页面');
setTimeout(scan, WZ.loopMs); return;
}
D.miss = 0;
go(v);
var p = pct(v);
chkStall(p);
if (p >= WZ.endAt) { out('播放至 ' + p.toFixed(1) + '%,准备跳转'); skip(); return; }
act();
setTimeout(scan, WZ.loopMs);
}
function panel() {
if (document.getElementById('wz-panel')) return;
var el = document.createElement('div');
el.id = 'wz-panel';
el.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;';
el.innerHTML = '<div style="font-weight:bold;margin-bottom:12px;color:#333;">温州住建自动刷课</div>' +
'<div style="margin-bottom:8px;"><span style="color:#666;">状态:</span><span id="wz-st" style="color:#52c41a;">运行中</span></div>' +
'<div style="margin-bottom:8px;"><span style="color:#666;">完成:</span><span id="wz-dn" style="color:#1890ff;">0</span> 节</div>' +
'<div style="margin-bottom:12px;"><span style="color:#666;">倍速:</span><select id="wz-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="wz-tg" style="width:100%;padding:8px;background:#ff4d4f;color:#fff;border:none;border-radius:4px;cursor:pointer;">停止脚本</button>';
document.body.appendChild(el);
document.getElementById('wz-sp').onchange = function() {
D.spd = parseFloat(this.value);
var v = vid(); if (v) rate(v, D.spd); write();
};
document.getElementById('wz-tg').onclick = function() {
D.run = !D.run;
this.textContent = D.run ? '停止脚本' : '启动脚本';
this.style.background = D.run ? '#ff4d4f' : '#52c41a';
document.getElementById('wz-st').textContent = D.run ? '运行中' : '已停止';
document.getElementById('wz-st').style.color = D.run ? '#52c41a' : '#999';
write(); if (D.run) { out('脚本重新启动'); scan(); }
};
setInterval(function() { var e = document.getElementById('wz-dn'); if (e) e.textContent = D.cnt; }, 2000);
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);
else boot();
})();