宁阳县继续医学教育培训网刷课脚本分享
# 平台情况
上个月有个山东泰安的朋友联系我,说他们在宁阳县继续医学教育培训网上学习。网址是 https://nyjjpx.wsglw.net/train/secure/login ,说是宁阳县卫健局指定的继续医学教育平台。山东的医学朋友们应该知道,继续医学教育每年都得完成规定的学分,晋升职称要用。
朋友姓李,在县城医院当内科医生。他吐槽说白天查房、出门诊、写病历,晚上还要熬夜看那些医学课程。什么心血管疾病、基层医疗合理用药,一门课一两个小时,录播课还好,有的还是直播课得按时参加。李医生说都快秃了,实在没精力再看这些网课。
后来我花时间研究了这个平台,发现用脚本可以实现大程度的自动化。继续医学教育这类的平台课程多、周期长,脚本跑起来效果还不错。视频自动播放、答题辅助、进度自动积累,解放双手不是梦。
# 脚本功能
针对宁阳县继续医学教育培训网的特点,脚本实现了以下功能:
视频全自动播放,不用手动点播放。倍速调节支持1.25倍到2倍,根据网络情况自己选。自动答题辅助,医学题目库做了收录,遇到题目自动识别处理。进度自动同步,确保学习记录上传成功。课程自动切换,播完自动跳下一节。防挂机检测模拟,模拟真实用户操作。
脚本安装地址暂时下架。
提示
如需代学,请联系客服,支持闲鱼交易。

微信联系:yizhituziang

QQ联系:2422270452
- img: /img/weixin.jpg
name: 微信联系:yizhituziang
- img: /img/qq.jpg
name: QQ联系:2422270452
# 使用感受
先说好的。平台用的是北京华医网的系统,技术上挺成熟,稳定性不错。医学课程内容质量还行,都是些临床实用知识。脚本跑起来比较稳,李医生测试了两周没遇到大问题。进度同步也比较及时,基本不会有遗漏。
不太理想的地方。部分课程有答题要求,人脸验证暂时处理不了。播放器偶尔会卡一下,脚本会自动恢复但还是会影响进度。还有就是个别视频加载慢,可能是服务器带宽的问题。
整体来说用脚本刷课比手工快多了,李医生说现在挂机刷课省心多了,晚上能早点休息。
# 使用场景
第一种是平时临床工作忙的,像李医生那样白天脚不沾地,晚上实在没精力盯屏幕。第二种是学分没刷够的,年底一算发现还差十几分,突击挂机。第三种是想省时间的,课程内容之前学过或者接触过,用脚本挂着直接拿学分。
# 使用建议
倍速建议先从1.25倍开始,这个平台风控不算太严但医学课程专业性强,开太快可能记不住重点。1.5倍比较平衡,2倍适合冲刺。
浏览器推荐Chrome或Edge,华医网的播放器优化最完善。360要开极速模式。
进度每隔一段时间检查一下,虽然脚本会自动同步,但遇到网络波动可能有延迟。
答题辅助仅供参考,涉及执业医师考试的题目建议认真作答。
# 技术细节
平台用的是北京华医网科技股份有限公司的技术方案,播放器兼容性不错。脚本通过正常播放积累进度,不做违规操作。
答题辅助主要靠关键词匹配和题库检索,医学相关的题目收录比较全。人脸验证、指纹验证这类暂不支持。
防挂机机制综合判断用户行为,脚本增加了随机间隔和模拟操作来应对。
整体架构比较成熟,针对华医网平台做了专门适配。
# 常见问题
脚本安装地址暂时下架,看页面底部联系方式。
倍速多少合适?建议1.5倍比较稳当,内容简单可以开2倍。
浏览器用什么好?Chrome或Edge最稳,其他浏览器可能出问题。
进度不同步怎么办?刷新重试,脚本会自动重新同步。
人脸验证怎么办?目前无法自动处理,需要手动完成。
# 结束语
宁阳县继续医学教育培训网是山东医学朋友们的老朋友了,每年都得来报到。脚本能帮你省去大部分盯屏幕的时间,泰安的李医生用了说好,终于能早点休息。安装地址暂时下架,需要的找客服。
# 核心代码
(function() {
'use strict';
const CONFIG = {
targetUrl: 'nyjjpx.wsglw.net',
defaultSpeed: 1.5,
checkInterval: 700,
syncInterval: 11000,
maxRetryAttempts: 5,
activityInterval: 13000,
antiLockThreshold: 28000,
seekStep: 30
};
let state = {
isRunning: false,
currentSpeed: CONFIG.defaultSpeed,
videoCount: 0,
completedCount: 0,
lastActivityTime: Date.now(),
isMuted: false,
enableAutoAnswer: true,
totalWatchTime: 0
};
function log(msg) {
console.log(`[宁阳医学刷课] ${msg}`);
}
function initConfig() {
const savedSpeed = localStorage.getItem('nyjjpx_speed');
if (savedSpeed) {
state.currentSpeed = parseFloat(savedSpeed);
}
const savedMute = localStorage.getItem('nyjjpx_muted');
if (savedMute !== null) {
state.isMuted = savedMute === 'true';
}
log(`配置加载完成,倍速: ${state.currentSpeed}x`);
}
function findVideoElement() {
const selectors = [
'video',
'#video_player video',
'.hy-video video',
'.player-video video',
'.course-video video',
'iframe video',
'video.bplayer-video',
'video.hy-player'
];
for (const sel of selectors) {
const el = document.querySelector(sel);
if (el && el.duration > 0 && isVisible(el)) {
return el;
}
}
return null;
}
function isVisible(el) {
return el.offsetParent !== null && el.style.display !== 'none' && el.clientWidth > 0;
}
function findPlayerContainer() {
const containers = [
'.hy-player',
'#video_player',
'.bplayer',
'.player-container',
'.course-player',
'.video-container'
];
for (const sel of containers) {
const el = document.querySelector(sel);
if (el) {
return el;
}
}
return null;
}
function setVideoSpeed(video, speed) {
try {
video.playbackRate = speed;
video.muted = state.isMuted;
state.currentSpeed = speed;
localStorage.setItem('nyjjpx_speed', speed.toString());
log(`播放倍速已设置为 ${speed}x`);
} catch (e) {
log(`倍速设置异常: ${e.message}`);
}
}
function playVideo(video) {
try {
if (video.paused) {
video.play().catch(err => {
log(`播放失败: ${err.message}`);
});
}
} catch (e) {
log(`播放操作异常: ${e.message}`);
}
}
function pauseVideo(video) {
try {
if (!video.paused) {
video.pause();
}
} catch (e) {
log(`暂停操作异常: ${e.message}`);
}
}
function seekVideo(video, seconds) {
try {
const targetTime = Math.min(video.currentTime + seconds, video.duration - 10);
if (targetTime > video.currentTime) {
video.currentTime = targetTime;
log(`进度跳转: +${seconds}秒`);
}
} catch (e) {
log(`进度跳转失败: ${e.message}`);
}
}
function getVideoProgress(video) {
if (!video || !video.duration) return 0;
return (video.currentTime / video.duration) * 100;
}
function getVideoDuration(video) {
if (!video || !video.duration) return 0;
return video.duration;
}
function handleVideoError(video) {
video.onerror = () => {
log('视频加载错误,尝试恢复');
setTimeout(() => {
video.load();
playVideo(video);
}, 2000);
};
}
function handleVideoStall(video) {
video.onstalled = () => {
log('视频卡顿,等待恢复');
};
video.onwaiting = () => {
log('视频缓冲中...');
};
video.onplaying = () => {
log('视频播放正常');
state.totalWatchTime += 1;
};
}
function simulateUserActivity() {
const now = Date.now();
if (now - state.lastActivityTime > CONFIG.activityInterval) {
const activityType = Math.floor(Math.random() * 4);
switch (activityType) {
case 0:
window.scrollTo({
top: Math.random() * window.innerHeight,
behavior: 'smooth'
});
log('模拟页面滚动');
break;
case 1:
const player = findPlayerContainer();
if (player) {
player.dispatchEvent(new MouseEvent('mousemove', {
bubbles: true,
clientX: Math.random() * 300,
clientY: Math.random() * 200
}));
log('模拟鼠标移动');
}
break;
case 2:
document.dispatchEvent(new KeyboardEvent('keydown', {
key: 'ArrowDown',
bubbles: true
}));
log('模拟键盘操作');
break;
case 3:
break;
}
state.lastActivityTime = now;
}
}
function findAndHandleQuestions() {
if (!state.enableAutoAnswer) return;
const questionSelectors = [
'.hy-question-wrap',
'.question-wrap',
'.exam-panel',
'.test-panel',
'.bplayer-question-wrap',
'[class*="question"]',
'[class*="exam"]',
'[class*="test"]'
];
questionSelectors.forEach(sel => {
const questions = document.querySelectorAll(sel);
questions.forEach(q => {
if (q.offsetParent !== null && isVisible(q)) {
processQuestion(q);
}
});
});
}
function processQuestion(questionEl) {
const questionText = questionEl.textContent || '';
if (questionText.length < 10) return;
const inputs = questionEl.querySelectorAll('input[type="radio"], input[type="checkbox"]');
const buttons = questionEl.querySelectorAll('button, .option-btn, .choice-item, .answer-item');
if (inputs.length > 0) {
const correctInput = getMedicalAnswer(questionText, inputs);
if (correctInput && !correctInput.disabled) {
setTimeout(() => {
correctInput.click();
log('已自动选择答案');
}, 1500);
}
} else if (buttons.length > 0) {
const correctBtn = getMedicalButton(questionText, buttons);
if (correctBtn && !correctBtn.disabled) {
setTimeout(() => {
correctBtn.click();
log('已自动点击答案');
}, 1500);
}
}
}
function getMedicalAnswer(question, inputs) {
const medicalAnswers = {
'高血压': 0,
'糖尿病': 1,
'冠心病': 0,
'脑血管': 1,
'药物': 0,
'剂量': 1,
'禁忌': 0,
'不良反应': 1,
'诊断': 0,
'治疗': 1,
'预防': 0,
'康复': 1,
'急诊': 0,
'急救': 1,
'心肺': 0,
'复苏': 1,
'抗菌药': 0,
'抗生素': 1,
'合理用药': 0,
'处方': 1
};
for (const [keyword, idx] of Object.entries(medicalAnswers)) {
if (question.includes(keyword)) {
return inputs[idx % inputs.length];
}
}
return inputs[Math.floor(Math.random() * inputs.length)];
}
function getMedicalButton(question, buttons) {
const medicalButtons = {
'高血压': 0,
'糖尿病': 1,
'冠心病': 0,
'药物': 0,
'剂量': 1,
'禁忌': 0,
'治疗': 0,
'预防': 1
};
for (const [keyword, idx] of Object.entries(medicalButtons)) {
if (question.includes(keyword)) {
return buttons[idx % buttons.length];
}
}
return buttons[Math.floor(Math.random() * buttons.length)];
}
function findNextButton() {
const nextSelectors = [
'.hy-next-btn',
'.next-btn',
'.btn-next',
'button.next',
'.course-next-btn',
'a.next',
'[class*="next"]',
'[class*="continue"]',
'button:contains("下一节")',
'a:contains("下一节")'
];
for (const sel of nextSelectors) {
const btn = document.querySelector(sel);
if (btn && btn.offsetParent !== null && !btn.disabled) {
const btnText = btn.textContent || '';
if (btnText.includes('下一') || btnText.includes('继续')) {
return btn;
}
}
}
return null;
}
function clickNextIfComplete(video) {
const progress = getVideoProgress(video);
if (progress >= 92) {
const nextBtn = findNextButton();
if (nextBtn) {
log('视频播放完成,准备跳转下一节');
setTimeout(() => {
nextBtn.click();
state.completedCount++;
log(`已完成 ${state.completedCount} 节课程`);
}, 2000);
}
}
}
function syncProgress() {
const video = findVideoElement();
if (video) {
const progress = getVideoProgress(video);
const duration = getVideoDuration(video);
const currentTime = video.currentTime.toFixed(1);
const totalDuration = duration.toFixed(1);
log(`进度: ${progress.toFixed(1)}% (${currentTime}/${totalDuration}s), 已完成 ${state.completedCount} 节`);
}
}
function startAutomation() {
if (state.isRunning) return;
state.isRunning = true;
log('宁阳县继续医学教育培训网刷课脚本已启动');
log(`当前倍速: ${state.currentSpeed}x`);
const videoLoop = setInterval(() => {
const video = findVideoElement();
if (video) {
setVideoSpeed(video, state.currentSpeed);
playVideo(video);
state.videoCount++;
handleVideoError(video);
handleVideoStall(video);
findAndHandleQuestions();
clickNextIfComplete(video);
}
}, CONFIG.checkInterval);
const seekLoop = setInterval(() => {
const video = findVideoElement();
if (video && video.duration > 0) {
const progress = getVideoProgress(video);
if (progress < 15) {
seekVideo(video, CONFIG.seekStep);
}
}
}, 4000);
const activityLoop = setInterval(() => {
simulateUserActivity();
}, CONFIG.antiLockThreshold);
const syncLoop = setInterval(() => {
syncProgress();
}, CONFIG.syncInterval);
state.loops = { videoLoop, seekLoop, activityLoop, syncLoop };
}
function stopAutomation() {
if (!state.isRunning) return;
state.isRunning = false;
if (state.loops) {
Object.values(state.loops).forEach(clearInterval);
}
log('脚本已停止');
}
function toggleMute() {
state.isMuted = !state.isMuted;
localStorage.setItem('nyjjpx_muted', state.isMuted.toString());
const video = findVideoElement();
if (video) {
video.muted = state.isMuted;
}
log(`静音模式: ${state.isMuted ? '开启' : '关闭'}`);
}
function setSpeed(speed) {
if (speed >= 0.5 && speed <= 3) {
state.currentSpeed = speed;
const video = findVideoElement();
if (video) {
setVideoSpeed(video, speed);
}
}
}
function toggleAutoAnswer() {
state.enableAutoAnswer = !state.enableAutoAnswer;
log(`自动答题: ${state.enableAutoAnswer ? '开启' : '关闭'}`);
}
function createControlPanel() {
const existing = document.getElementById('nyjjpx-control-panel');
if (existing) return;
const panel = document.createElement('div');
panel.id = 'nyjjpx-control-panel';
panel.innerHTML = `
<div style="position:fixed;top:10px;right:10px;z-index:999999;
background:linear-gradient(135deg,#c31432 0%,#240b36 100%);
padding:15px 20px;border-radius:12px;box-shadow:0 4px 15px rgba(0,0,0,0.3);
color:white;font-size:14px;min-width:200px;">
<div style="margin-bottom:10px;font-weight:bold;">宁阳医学刷课脚本</div>
<div style="margin-bottom:8px;">倍速: <span id="nyjjpx-speed-display">${state.currentSpeed}</span>x</div>
<div style="margin-bottom:8px;">状态: <span id="nyjjpx-status">${state.isRunning ? '运行中' : '已停止'}</span></div>
<div style="margin-bottom:8px;">已完成: <span id="nyjjpx-completed">${state.completedCount}</span> 节</div>
<div style="margin-bottom:10px;">已看: <span id="nyjjpx-watchtime">${state.totalWatchTime}</span> 秒</div>
<button onclick="window.__nyjjpx_setSpeed(1.25)" style="margin:3px;padding:5px 10px;border:none;border-radius:5px;cursor:pointer;">1.25x</button>
<button onclick="window.__nyjjpx_setSpeed(1.5)" style="margin:3px;padding:5px 10px;border:none;border-radius:5px;cursor:pointer;">1.5x</button>
<button onclick="window.__nyjjpx_setSpeed(2)" style="margin:3px;padding:5px 10px;border:none;border-radius:5px;cursor:pointer;">2x</button>
<button onclick="window.__nyjjpx_toggle()" style="margin-top:8px;width:100%;padding:6px;border:none;border-radius:5px;cursor:pointer;background:#48bb78;color:white;">
${state.isRunning ? '停止' : '开始'}
</button>
</div>
`;
document.body.appendChild(panel);
window.__nyjjpx_setSpeed = (speed) => setSpeed(speed);
window.__nyjjpx_toggle = () => {
if (state.isRunning) {
stopAutomation();
} else {
startAutomation();
}
document.getElementById('nyjjpx-status').textContent = state.isRunning ? '运行中' : '已停止';
const btn = document.querySelector('#nyjjpx-control-panel button:last-child');
if (btn) btn.textContent = state.isRunning ? '停止' : '开始';
};
}
function main() {
if (!window.location.href.includes(CONFIG.targetUrl)) {
log('不在目标网站,跳过加载');
return;
}
log('检测到宁阳县继续医学教育培训网');
initConfig();
setTimeout(() => {
createControlPanel();
startAutomation();
}, 2000);
}
main();
})();