山西省专业技术人员继续教育网络平台刷课脚本分享
山西省专业技术人员继续教育网络平台
# 脚本介绍
该油猴脚本用于 山西省专业技术人员继续教育网络平台 的辅助看课,使用JavaScript编写,适配网址:https://shanxi.chinamde.cn/
脚本功能如下:
- 视频自动播放
- 加速视频播放
- 自动完成课程测验
- 防止挂机超时
- 自动标记课程完成
脚本安装地址:
暂时下架
如果不会安装脚本,请按照下面安装教程来操作。
# 代学服务
提示
如需代学,请联系客服,支持闲鱼交易。

微信联系:yizhituziang

QQ联系:2422270452
- img: /img/weixin.jpg
name: 微信联系:yizhituziang
- img: /img/qq.jpg
name: QQ联系:2422270452
# 安装教程
# 1.安装浏览器扩展插件
首先需要给我们的浏览器安装上脚本猫插件,这是运行所有用户脚本的基础,如果浏览器已经安装过了脚本猫或者油猴插件,那么可以跳过这一步。推荐使用edge浏览器,安装插件更方便。
浏览器打开网址:https://docs.scriptcat.org/ (opens new window)
这里用edge浏览器作为示范,点击 "添加到Edge浏览器"

接着点击 "获取"

在右上角弹出的窗口,点击 "添加扩展"

等待几秒钟,会提示已经安装好脚本猫插件了。

# 2.安装刷课脚本
打开脚本安装地址后,在页面点击 "安装脚本" 按钮,接着在弹出的窗口点击 "安装" ,之后就会提示"安装成功"。
# 3.体验脚本功能
安装脚本后,需要重新进入学习站点,如果之前已经打开课程学习页面,那么需要刷新页面后脚本才会生效。
# 核心代码
(function() {
'use strict';
const PLATFORM_NAME = '山西省专业技术人员继续教育网络平台';
const VERSION = '1.5.0';
const LOG_PREFIX = `[${PLATFORM_NAME}]`;
console.log(`${LOG_PREFIX} 脚本 v${VERSION} 已启动`);
const CONFIG = {
AUTO_PLAY: true,
PLAYBACK_RATE: 2.0,
AUTO_NEXT: true,
AUTO_QUIZ: true,
PREVENT_TIMEOUT: true,
SIMULATE_ACTIVITY: true,
CHECK_INTERVAL: 2000,
ACTIVITY_INTERVAL: 60000
};
const utils = {
log: function(...args) {
console.log(LOG_PREFIX, ...args);
},
sleep: function(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
},
randomInt: function(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
},
randomFloat: function(min, max) {
return Math.random() * (max - min) + min;
}
};
function bypassAntiCheat() {
utils.log('正在初始化反作弊绕过...');
const originalAddEventListener = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(type, listener, options) {
const blockedEvents = ['visibilitychange', 'pagehide', 'blur', 'focusout'];
if (blockedEvents.includes(type)) {
utils.log(`已拦截 ${type} 事件`);
return function() {};
}
return originalAddEventListener.call(this, type, listener, options);
};
const hiddenDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'hidden');
if (hiddenDescriptor && hiddenDescriptor.configurable) {
Object.defineProperty(document, 'hidden', {
get: () => false,
configurable: false
});
}
const visibilityDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'visibilityState');
if (visibilityDescriptor && visibilityDescriptor.configurable) {
Object.defineProperty(document, 'visibilityState', {
get: () => 'visible',
configurable: false
});
}
window.onblur = null;
window.onfocusout = null;
utils.log('反作弊绕过完成');
}
function getVideoElement() {
const selectors = [
'video',
'video[src]',
'.video-wrapper video',
'.player video',
'#videoPlayer video',
'.course-video video'
];
for (const selector of selectors) {
const video = document.querySelector(selector);
if (video) return video;
}
const iframes = document.querySelectorAll('iframe');
for (const iframe of iframes) {
try {
const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
const video = iframeDoc.querySelector('video');
if (video) return video;
} catch (e) {
continue;
}
}
return null;
}
function setupVideoPlayer(video) {
if (!video) return;
utils.log('正在设置视频播放器...');
video.muted = false;
Object.defineProperty(video, 'playbackRate', {
configurable: true,
enumerable: true,
get: () => CONFIG.PLAYBACK_RATE,
set: (value) => {
utils.log(`尝试设置播放速度为 ${value}x,已强制保持为 ${CONFIG.PLAYBACK_RATE}x`);
}
});
video.addEventListener('pause', (e) => {
if (CONFIG.AUTO_PLAY && !video.ended) {
utils.log('视频被暂停,正在恢复播放...');
setTimeout(() => {
video.play().catch(err => {
utils.log('自动播放失败:', err);
});
}, 100);
}
});
video.addEventListener('ended', () => {
utils.log('视频播放完成');
if (CONFIG.AUTO_NEXT) {
utils.log('准备切换到下一课');
goToNextLesson();
}
});
video.addEventListener('waiting', () => {
utils.log('视频正在缓冲...');
});
if (CONFIG.AUTO_PLAY && video.paused) {
video.play().catch(err => {
utils.log('初始自动播放失败:', err);
});
}
utils.log('视频播放器设置完成');
}
function goToNextLesson() {
utils.log('正在查找下一课按钮...');
const nextButtonSelectors = [
'.next-lesson-btn',
'.next-chapter',
'#nextLesson',
'[class*="next"]',
'[id*="next"]',
'button:has(span:contains("下一课"))',
'a:has(span:contains("下一章"))'
];
for (const selector of nextButtonSelectors) {
const btn = document.querySelector(selector);
if (btn && !btn.disabled && btn.offsetParent !== null) {
utils.log('找到下一课按钮,点击中...');
btn.click();
return;
}
}
const lessonList = document.querySelectorAll('.lesson-item, .chapter-item, .course-item');
for (let i = 0; i < lessonList.length; i++) {
const item = lessonList[i];
if (item.classList.contains('active') || item.classList.contains('current') || item.classList.contains('playing')) {
if (i + 1 < lessonList.length) {
utils.log('在列表中找到下一课,点击中...');
lessonList[i + 1].click();
return;
}
}
}
utils.log('未找到下一课');
}
function autoAnswerQuiz() {
if (!CONFIG.AUTO_QUIZ) return;
setInterval(() => {
const quizContainer = document.querySelector('.quiz-container, .test-container, .question-container');
if (!quizContainer) return;
const options = quizContainer.querySelectorAll('input[type="radio"], input[type="checkbox"]');
if (options.length > 0) {
utils.log('检测到测验题目,自动作答中...');
const randomIndex = utils.randomInt(0, options.length - 1);
options[randomIndex].checked = true;
const submitBtn = quizContainer.querySelector('button[type="submit"], .submit-btn, .confirm-btn, [class*="submit"]');
if (submitBtn) {
setTimeout(() => {
submitBtn.click();
utils.log('已提交答案');
}, 500);
}
}
}, 3000);
}
function simulateUserActivity() {
if (!CONFIG.SIMULATE_ACTIVITY) return;
const activities = [
() => {
const scrollAmount = utils.randomInt(-20, 20);
window.scrollBy(0, scrollAmount);
},
() => {
const x = utils.randomInt(0, window.innerWidth);
const y = utils.randomInt(0, window.innerHeight);
const event = new MouseEvent('mousemove', {
clientX: x,
clientY: y,
bubbles: true,
cancelable: true
});
document.dispatchEvent(event);
},
() => {
const event = new KeyboardEvent('keydown', {
key: 'Control',
bubbles: true,
cancelable: true
});
document.dispatchEvent(event);
},
() => {
const x = utils.randomInt(0, window.innerWidth);
const y = utils.randomInt(0, window.innerHeight);
const event = new MouseEvent('click', {
clientX: x,
clientY: y,
bubbles: true,
cancelable: true
});
const element = document.elementFromPoint(x, y);
if (element && !element.closest('button') && !element.closest('a')) {
element.dispatchEvent(event);
}
}
];
setInterval(() => {
const activityIndex = utils.randomInt(0, activities.length - 1);
activities[activityIndex]();
utils.log('模拟用户活动');
}, CONFIG.ACTIVITY_INTERVAL);
}
function preventTimeout() {
if (!CONFIG.PREVENT_TIMEOUT) return;
setInterval(() => {
const timeoutWarning = document.querySelector('.timeout-warning, .inactivity-warning, [class*="timeout"], [class*="inactive"]');
if (timeoutWarning) {
utils.log('检测到超时警告,尝试解除');
const stayBtn = timeoutWarning.querySelector('button, a');
if (stayBtn) {
stayBtn.click();
}
}
const video = getVideoElement();
if (video && video.paused && !video.ended) {
video.play().catch(() => {});
}
}, 5000);
}
function monitorVideo() {
setInterval(() => {
const video = getVideoElement();
if (video) {
setupVideoPlayer(video);
}
}, CONFIG.CHECK_INTERVAL);
}
function init() {
utils.log('正在初始化脚本...');
bypassAntiCheat();
monitorVideo();
autoAnswerQuiz();
simulateUserActivity();
preventTimeout();
utils.log('脚本初始化完成');
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();