// ==UserScript==
// @name 华为人才在线课程助手 (Huawei Talent Helper)
// @namespace http://tampermonkey.net/
// @version 0.2
// @description 自动完成视频任务,并保存视频字幕
// @author Antigravity
// @match *://e.huawei.com/cn/talent/*
// @match *://talent.shixizhi.huawei.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 状态 management
const state = {
autoNext: true,
playSpeed: 2.0,
subtitles: [],
lastVideoId: null
};
// UI 控制面板
function createUI() {
if (document.getElementById('huawei-helper-panel')) return;
const panel = document.createElement('div');
panel.id = 'huawei-helper-panel';
panel.style = `
position: fixed;
top: 20px;
right: 20px;
z-index: 10000;
background: #fff;
border: 1px solid #ccc;
padding: 10px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
font-family: Arial, sans-serif;
font-size: 14px;
width: 180px;
`;
panel.innerHTML = `
华为人才助手
播放倍速:
`;
document.body.appendChild(panel);
// 事件绑定
document.getElementById('auto-next-btn').addEventListener('change', (e) => {
state.autoNext = e.target.checked;
});
document.getElementById('play-speed-input').addEventListener('input', (e) => {
state.playSpeed = parseFloat(e.target.value) || 1.0;
applySpeed();
});
document.getElementById('download-sub-btn').addEventListener('click', () => {
downloadSubtitles();
});
}
// 设置倍速
function applySpeed() {
const video = document.querySelector('video');
if (video) {
video.playbackRate = state.playSpeed;
}
}
// 监控视频状态
function monitorVideo() {
const video = document.querySelector('video');
if (!video) return;
if (video.playbackRate !== state.playSpeed) {
video.playbackRate = state.playSpeed;
}
if (video.paused && !video.ended) {
// 尝试自动播放
video.play().catch(() => {});
}
if (video.ended && state.autoNext) {
video.ended = false; // 重置
goToNext();
}
}
// 下一讲
function goToNext() {
console.log('Video ended, trying to find next lesson...');
const nextBtn = document.querySelector('.course-next-item') ||
Array.from(document.querySelectorAll('span, div')).find(el => el.innerText.includes('下一讲'));
if (nextBtn) {
nextBtn.click();
} else {
console.warn('Next lesson button not found.');
}
}
// 拦截 API 获取字幕
const originXHR = window.XMLHttpRequest;
window.XMLHttpRequest = function() {
const xhr = new originXHR();
const send = xhr.send;
xhr.send = function() {
this.addEventListener('load', function() {
if (this.responseURL.includes('querySubtitleContent')) {
try {
const data = JSON.parse(this.responseText);
if (data && data.data) {
state.subtitles = data.data;
updateSubBtnCount();
}
} catch (e) {
console.error('Failed to parse subtitle JSON', e);
}
}
});
return send.apply(this, arguments);
};
return xhr;
};
function updateSubBtnCount() {
const btn = document.getElementById('download-sub-btn');
if (btn) {
btn.innerText = `下载字幕 (${state.subtitles.length})`;
}
}
// JSON 转 SRT
function convertToSRT(subs) {
return subs.map((s, i) => {
const start = formatTime(s.startTime);
const end = formatTime(s.endTime);
return `${i + 1}\n${start} --> ${end}\n${s.content}\n\n`;
}).join('');
}
function formatTime(seconds) {
const date = new Date(0);
date.setSeconds(Math.floor(seconds));
const time = date.toISOString().substr(11, 8);
const ms = Math.floor((seconds % 1) * 1000).toString().padStart(3, '0');
return `${time},${ms}`;
}
// 下载字幕文件
function downloadSubtitles() {
if (state.subtitles.length === 0) {
alert('尚未捕获到字幕,请确保视频正在播放。');
return;
}
const srtContent = convertToSRT(state.subtitles);
const blob = new Blob([srtContent], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `subtitle_${Date.now()}.srt`;
a.click();
URL.revokeObjectURL(url);
}
// 初始化驱动
setInterval(() => {
createUI();
monitorVideo();
applySpeed();
}, 2000);
})();