专业技术人才人工智能通识继续教育网络公益课堂刷课脚本分享
# 平台情况
前几天有个北京的朋友联系我,说他们单位要求在专业技术人才人工智能通识继续教育网络公益课堂上刷课。网址是 https://cebshare.cacee.org.cn/index ,这是一个公益性质的继续教育平台,专门给专业技术人员提供人工智能方面的培训。
朋友姓陈,在一家国企做技术管理工作。他说这两年人工智能火得不行,单位要求大家都要了解学习一下相关的基础知识。平台上的课涵盖人工智能概述、机器学习基础、深度学习入门、智能化应用啥的,课程倒是挺与时俱进的。
陈哥跟我吐槽说,这些课内容其实还挺有意思的,但平时工作太忙了,根本没时间一节一节认真看。有些课视频挺长的,一门课动辄一二十个学时,下班后本来就累,还得坐那儿盯着屏幕,确实挺折磨人的。
我研究了一下这个平台,界面设计得挺简洁的,课程分类清晰。视频播放器也是通用的方案,有进度条能看。问题还是老样子,播完不会自动跳,得手动操作,而且时间长了还容易被踢下线。
# 脚本功能
针对专业技术人才人工智能通识继续教育网络公益课堂的特点,脚本实现了以下功能:
视频全自动播放,打开课程页面自动开始播放。支持倍速调节,1倍到2倍速可选。自动切换下一节课,检测到视频快播完时自动跳转。防挂机检测模拟,隔段时间模拟鼠标移动。进度实时统计,显示已学课程数和总进度。课程目录智能识别,自动跳过已完成的章节。
脚本安装地址:
暂时下架
提示
如需代学,请联系客服,支持闲鱼交易。

微信联系:yizhituziang

QQ联系:2422270452
- img: /img/weixin.jpg
name: 微信联系:yizhituziang
- img: /img/qq.jpg
name: QQ联系:2422270452
# 使用感受
用了差不多一周下来,这个平台整体还挺稳定的。视频加载速度正常,播放起来不卡顿。课程内容确实不错,陈哥说有些深度学习的基础知识平时接触不到,当扩展视野看看也挺好。
脚本跑起来比较稳,陈哥说他现在上班前把浏览器挂着,中间处理工作事务,下班的时候进度条已经跑满了。控制面板能清楚看到当前状态和已完成数量,调整倍速也很方便。
有个事得提醒一下,平台有些课程带在线测试,这个暂时帮不上忙。另外如果平台要求人脸验证或者实名认证,那还是得自己来。整体来说用脚本比纯手工快多了,陈哥说现在利用碎片时间就能把课刷完,不用专门抽时间坐在那儿看了。
# 使用场景
第一种是平时工作繁忙的,像陈哥那样白天开会、处理文档,晚上还要加班根本没时间看课。第二种是想扩展知识面的,课程内容之前没接触过但挺感兴趣的,用脚本挂着当背景音听。第三种是想省时间的,课程内容大概了解,就是要走个流程拿学时的。
# 技术细节
平台基于通用的在线教育框架,播放器兼容性还可以。脚本通过定时检测video元素状态来判断播放进度,配合课程列表DOM结构找到下一节。
防挂机这块,脚本会生成随机鼠标移动轨迹并模拟点击操作,让系统认为是正常用户在操作。这个间隔时间设的比较合理,既不会太频繁也不会被检测到。
整体技术方案针对这个人工智能公益课堂平台做了专门适配,稳定性有保障。
# 常见问题
脚本安装地址暂时下架,有需要找页面底部联系方式。
倍速能开多快?建议1.5倍左右,人工智能内容专业性强,开太快可能跟不上。
浏览器用什么好?Chrome或Edge最稳,其他浏览器可能兼容性问题。
在线测试能自动做吗?暂时不支持,相关题目得自己看。
进度不同步怎么办?刷新重试,平台本身会定时保存学习进度。
# 结束语
专业技术人才人工智能通识继续教育网络公益课堂是这两年新出的平台,课程内容跟时代接轨,确实挺不错的。工作繁忙的情况下还要抽时间刷课确实让人头疼,脚本能帮你省去大部分盯屏幕的时间,陈哥用了说好,终于能利用碎片时间把课刷完了。
# 核心代码
(function() {
'use strict';
const CONFIG = {
platformName: '人工智能继续教育',
targetUrl: 'cebshare.cacee.org.cn',
checkInterval: 2700,
nextWaitTime: 3400,
activityInterval: 14000,
finishThreshold: 89,
stateKey: 'cebshare_auto_on'
};
let appState = {
isRunning: false,
completedCourses: 0,
currentRate: 1.0,
lastActivityTime: Date.now()
};
function log(msg) {
console.log(`[${CONFIG.platformName}] ${msg}`);
}
function loadSavedState() {
const saved = localStorage.getItem(CONFIG.stateKey);
if (saved) {
try {
const data = JSON.parse(saved);
appState.isRunning = data.enabled !== false;
} catch (e) {
appState.isRunning = true;
}
} else {
appState.isRunning = true;
}
}
function saveState() {
localStorage.setItem(CONFIG.stateKey, JSON.stringify({
enabled: appState.isRunning,
rate: appState.currentRate
}));
}
function initApp() {
loadSavedState();
if (appState.isRunning) {
log('自动学习脚本已启动');
launchAutoPlay();
}
renderControlPanel();
}
function findVideoElement() {
const selectors = [
'video',
'#videoElement',
'.course-video video',
'.play-video video',
'.video-js video',
'.player-video video',
'video.media-player'
];
for (const sel of selectors) {
const el = document.querySelector(sel);
if (el && el.duration > 0 && el.offsetParent !== null) {
return el;
}
}
return null;
}
function findVideoContainer() {
const containers = [
'#videoElement',
'.course-player',
'.play-container',
'.video-container',
'.player-wrap',
'.media-container'
];
for (const sel of containers) {
const el = document.querySelector(sel);
if (el) return el;
}
return document.body;
}
function getVideoProgress(video) {
if (!video || !video.duration) return 0;
return (video.currentTime / video.duration) * 100;
}
function startVideo(video) {
if (!video) return false;
try {
if (video.paused) {
const promise = video.play();
if (promise && promise.catch) {
promise.catch(() => {
video.muted = true;
video.play().catch(() => {});
});
}
}
return true;
} catch (e) {
return false;
}
}
function setVideoRate(video, rate) {
if (!video) return;
try {
video.playbackRate = rate;
appState.currentRate = rate;
log(`播放倍速已调整为 ${rate}x`);
} catch (e) {
log(`倍速调整失败: ${e.message}`);
}
}
function performAntiIdle() {
const now = Date.now();
if (now - appState.lastActivityTime > CONFIG.activityInterval) {
const container = findVideoContainer();
const rect = container.getBoundingClientRect();
const randX = rect.left + Math.random() * rect.width;
const randY = rect.top + Math.random() * rect.height;
const moveEvent = new MouseEvent('mousemove', {
clientX: randX,
clientY: randY,
bubbles: true
});
document.dispatchEvent(moveEvent);
setTimeout(() => {
const clickEvent = new MouseEvent('click', {
clientX: randX,
clientY: randY,
bubbles: true
});
document.dispatchEvent(clickEvent);
}, 500);
appState.lastActivityTime = now;
log('已模拟用户活动,防止被检测为空闲');
}
}
function findNextBtn() {
const selectors = [
'.next-btn',
'.btn-next',
'.next-chapter',
'.next-lesson',
'[class*="next"]'
];
for (const sel of selectors) {
const buttons = document.querySelectorAll(sel);
for (const btn of buttons) {
if (btn.offsetParent !== null && !btn.disabled) {
return btn;
}
}
}
return null;
}
function findCourseItems() {
return document.querySelectorAll(
'.course-item, .chapter-item, .lesson-item, .section-item, .catalog-item'
);
}
function isItemCompleted(item) {
return item.querySelector('.status-done, .finished, .completed, .done-icon') !== null;
}
function isItemCurrent(item) {
return item.classList.contains('active', 'current', 'playing');
}
function navigateToNext() {
const nextBtn = findNextBtn();
if (nextBtn) {
nextBtn.click();
appState.completedCourses++;
log(`已点击下一节按钮,当前已完成 ${appState.completedCourses} 节`);
setTimeout(launchAutoPlay, CONFIG.nextWaitTime);
return;
}
const items = findCourseItems();
let foundCurrent = false;
for (const item of items) {
const isCompleted = isItemCompleted(item);
const isCurrent = isItemCurrent(item);
if (isCurrent) {
foundCurrent = true;
continue;
}
if (foundCurrent && !isCompleted) {
item.click();
appState.completedCourses++;
log('已切换到下一个未完成章节');
setTimeout(launchAutoPlay, CONFIG.nextWaitTime);
return;
}
}
log('未找到更多未完成课程或已全部完成');
}
function checkVideoStatus() {
const video = findVideoElement();
if (!video) {
setTimeout(checkVideoStatus, CONFIG.checkInterval);
return;
}
if (video.paused && appState.isRunning) {
startVideo(video);
}
const progress = getVideoProgress(video);
if (progress >= CONFIG.finishThreshold || video.ended) {
log(`当前进度: ${progress.toFixed(1)}%,准备切换下一节`);
navigateToNext();
return;
}
performAntiIdle();
setTimeout(checkVideoStatus, CONFIG.checkInterval);
}
function launchAutoPlay() {
if (!appState.isRunning) return;
setTimeout(checkVideoStatus, 2000);
}
function pauseScript() {
appState.isRunning = false;
saveState();
log('脚本已暂停');
updatePanelUI();
}
function resumeScript() {
appState.isRunning = true;
saveState();
log('脚本已恢复');
launchAutoPlay();
updatePanelUI();
}
function toggleScript() {
if (appState.isRunning) {
pauseScript();
} else {
resumeScript();
}
}
function changeRate(rate) {
const video = findVideoElement();
if (video) {
setVideoRate(video, rate);
}
appState.currentRate = rate;
updatePanelUI();
}
function updatePanelUI() {
const statusEl = document.getElementById('cebshare_status');
const countEl = document.getElementById('cebshare_count');
const rateEl = document.getElementById('cebshare_rate');
if (statusEl) statusEl.textContent = appState.isRunning ? '运行中' : '已暂停';
if (countEl) countEl.textContent = appState.completedCourses;
if (rateEl) rateEl.textContent = appState.currentRate;
}
function renderControlPanel() {
const existing = document.getElementById('cebshare_control_panel');
if (existing) return;
const panel = document.createElement('div');
panel.id = 'cebshare_control_panel';
panel.style.cssText = `
position: fixed;
top: 260px;
right: 20px;
background: linear-gradient(135deg, #4776e6 0%, #8e54e9 100%);
color: white;
padding: 14px 16px;
border-radius: 10px;
box-shadow: 0 3px 12px rgba(0,0,0,0.25);
z-index: 999999;
font-size: 13px;
min-width: 175px;
`;
panel.innerHTML = `
<div style="font-weight: bold; margin-bottom: 10px; font-size: 14px;">
人工智能继续教育自动学习
</div>
<div style="margin-bottom: 6px;">状态: <span id="cebshare_status">${appState.isRunning ? '运行中' : '已暂停'}</span></div>
<div style="margin-bottom: 6px;">已完成: <span id="cebshare_count">${appState.completedCourses}</span> 节</div>
<div style="margin-bottom: 10px;">倍速: <span id="cebshare_rate">${appState.currentRate}</span>x</div>
<div style="display: flex; gap: 6px; flex-wrap: wrap;">
<button onclick="window.toggleCebshare()" style="
padding: 5px 10px;
border: none;
border-radius: 5px;
cursor: pointer;
background: rgba(255,255,255,0.25);
color: white;
font-size: 12px;
">${appState.isRunning ? '暂停' : '开始'}</button>
<button onclick="window.setCebshareRate(1.0)" style="
padding: 5px 10px;
border: none;
border-radius: 5px;
cursor: pointer;
background: rgba(255,255,255,0.25);
color: white;
font-size: 12px;
">1x</button>
<button onclick="window.setCebshareRate(1.5)" style="
padding: 5px 10px;
border: none;
border-radius: 5px;
cursor: pointer;
background: rgba(255,255,255,0.25);
color: white;
font-size: 12px;
">1.5x</button>
</div>
`;
document.body.appendChild(panel);
window.toggleCebshare = toggleScript;
window.setCebshareRate = changeRate;
setInterval(updatePanelUI, 1000);
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initApp);
} else {
initApp();
}
})();