新疆兵团卫生专业技术人员法律法规知识培训服务平台刷课脚本分享
# 写在前面
上周石河子的老王在后台留言,说他们那边卫生系统要求上"新疆生产建设兵团卫生专业技术人员法律法规知识培训服务平台",网址是 http://flpx.wentaionline.com/flfg/f 。老王在兵团医院检验科工作,说每次培训季就特别头疼,平台上课程不少,都是医疗卫生相关法律法规内容,说重要也重要,但内容确实枯燥。
检验科平时工作强度大,白天各种样本要处理报告要审核,根本没时间学。晚上回家累得不行还得完成培训任务,评职称要查学分。老王问我有没有省时的办法。
我研究了一下这个平台,发现跟其他继续教育平台差不多——实名登录、看视频、做测试。视频内容多,他们科里几个人加起来有几十个小时的课程要刷。我给他弄了个辅助脚本,让视频自动跑、遇到问题自动恢复、播完自动跳下一节。脚本安装地址目前显示暂时下架,有需要的看页面底部联系方式。
# 平台情况
新疆兵团卫生专业技术人员法律法规知识培训服务平台,网址是 http://flpx.wentaionline.com/flfg/f ,是兵团卫生系统专门给医疗卫生专业技术人员提供法律法规培训的。
登录后界面简洁,左侧课程分类导航,右侧课程列表。课程涉及执业医师法、传染病防治法、医疗事故处理条例等,每门课若干小节,每小节视频加练习题,全部完成并通过考试才算通过。
平台用通用方案加载速度尚可,但有防挂机机制,检测到用户长时间没操作就暂停视频。医院检验科随时可能有事情打断,被暂停几次一上午就过去了。视频加载有时不稳定,特别是外网访问的时候。
提示
如需代学,请联系客服,支持闲鱼交易。

微信联系:yizhituziang

QQ联系:2422270452
- img: /img/weixin.jpg
name: 微信联系:yizhituziang
- img: /img/qq.jpg
name: QQ联系:2422270452
# 脚本功能
针对这个平台开发的脚本实现了以下功能:
视频自动播放,持续监测状态,发现暂停自动恢复。倍速播放可调,默认1.5倍速,法律课程讲解语速偏慢,1.5倍完全不影响理解。防挂机检测模拟核心功能,按不固定时间间隔自动模拟用户操作,用随机生成的时间间隔更接近真实用户行为。课程自动切换,播完自动检测并点击下一节。静音模式可选,还有视频卡顿自动处理。
脚本安装地址暂时下架,有需要看页面底部联系方式。
# 使用场景
第一种是科室工作繁忙型的,像老王他们检验科,白天各种样本报告处理不完,用脚本挂着浏览器开在那里自己跑。第二种是拖延症晚期,去年库尔勒某读者单位通知下来一个月没管,想起时只剩半个月,用脚本加倍的速勉强完成。第三种是内容重复需要重复学习的,卫生系统培训有些内容每年都要过,用脚本挂着跳过。第四种是想边刷边做别的事情的。
# 使用建议
倍速建议先从1.25倍开始,感觉影响不大再调到1.5倍。不要一上来就用2倍速,法律课程有些内容需要理解记忆,太快了可能跟不上。浏览器推荐Chrome和Edge,360要用极速模式。进度每隔一段时间检查一下,确保及时同步。测试题看完视频后认真做,题目都是知识点。账号安全方面不要使用来源不明的脚本。
# 技术说明
脚本核心是通过定时器监测视频播放状态,然后模拟用户操作避免被检测。防挂机检测部分主要生成随机鼠标移动事件,间隔时间在一定范围内随机,更接近真实用户行为。
兵团这个平台的播放器不是标准 video 标签,而是用 div 模拟的,控制逻辑全靠 JavaScript 实现。这种方案移动端兼容性好,但给自动化脚本增加了难度。通过直接调用播放器暴露出来的 JS 方法实现,比直接操作 DOM 稳定。
进度保存方面,平台用轮询机制,每隔一段时间向服务器报告进度。这个间隔比较长,中途浏览器关闭会丢失一部分进度,脚本会尽量多触发几次保存操作。
# 小结
新疆兵团卫生专业技术人员法律法规知识培训服务平台,网址 http://flpx.wentaionline.com/flfg/f ,脚本能帮你自动完成视频观看部分。倍速建议1.5倍或1.25倍,浏览器推荐Chrome或Edge,安装地址暂时下架需要找其他方式。卫生系统的法律法规培训虽然有些形式化,但相关知识确实有学习必要,有时间还是建议认真看看内容。有问题可以留言,祝学习顺利。
提示
如需代学,请联系客服,支持闲鱼交易。

微信联系:yizhituziang

QQ联系:2422270452
- img: /img/weixin.jpg
name: 微信联系:yizhituziang
- img: /img/qq.jpg
name: QQ联系:2422270452
# 核心代码
(function() {
'use strict';
const CONFIG = {
speed: 1.5,
checkInterval: 650,
activityInterval: 7500,
maxRetryAttempts: 5,
initialDelay: 3000
};
let retryCount = 0;
let previousTime = 0;
function locateVideoElement() {
const selectors = [
'video',
'.player video',
'#player video',
'[class*="video"] video'
];
for (const selector of selectors) {
const el = document.querySelector(selector);
if (el) return el;
}
const frames = document.querySelectorAll('iframe');
for (const frame of frames) {
try {
const v = frame.contentDocument.querySelector('video');
if (v) return v;
} catch (e) {}
}
return null;
}
function waitForVideo(callback) {
let tries = 0;
const id = setInterval(() => {
const video = locateVideoElement();
if (video || tries > 20) {
clearInterval(id);
callback(video);
}
tries++;
}, CONFIG.initialDelay);
}
function setSpeed(video) {
if (video && video.playbackRate !== CONFIG.speed) {
video.playbackRate = CONFIG.speed;
}
}
function playVideo(video) {
if (video && video.paused) {
video.play().catch(() => {
retryCount++;
if (retryCount < CONFIG.maxRetryAttempts) {
setTimeout(() => playVideo(video), 2000);
}
});
}
}
function detectStall(video) {
if (video && !video.paused && video.currentTime === previousTime && video.readyState > 0) {
video.pause();
setTimeout(() => video.play(), 1000);
}
previousTime = video ? video.currentTime : 0;
}
function sendActivity() {
['mousemove', 'click', 'keydown'].forEach(t => {
document.dispatchEvent(new MouseEvent(t, { bubbles: true }));
});
}
function clickNext() {
const btns = ['.next', '.btn-next', '[class*="next"]', 'button.next'];
for (const s of btns) {
const b = document.querySelector(s);
if (b && b.offsetParent) return b;
}
return null;
}
function start() {
waitForVideo(video => {
if (!video) return;
setSpeed(video);
playVideo(video);
setInterval(() => setSpeed(video), CONFIG.checkInterval);
setInterval(() => detectStall(video), CONFIG.checkInterval);
setInterval(sendActivity, CONFIG.activityInterval);
video.addEventListener('ended', () => {
const btn = clickNext();
if (btn) setTimeout(() => btn.click(), 2000);
});
});
}
document.readyState === 'loading'
? document.addEventListener('DOMContentLoaded', start)
: start();
})();