// ==UserScript== // @name 华为人才在线课程助手 (Huawei Talent Helper) // @namespace http://tampermonkey.net/ // @version 0.1 // @description 自动完成视频任务,并保存视频字幕 // @author Antigravity // @match *://e.huawei.com/cn/talent/outPage/* // @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); })();