如何通过浏览器控制台或Node.js批量上传YouTube视频?
实现文件夹自动上传YouTube视频的JavaScript方案
有两种可行的方案,分别适配浏览器控制台和Node.js环境,具体说明如下:
浏览器控制台方案
浏览器出于安全限制无法直接读取本地文件夹的所有文件,但可以在YouTube Studio上传页面的控制台中运行脚本,配合手动选择文件夹的操作实现批量上传:
- 打开YouTube Studio上传页面,按下F12打开控制台。
- 运行以下脚本,它会创建支持文件夹选择的输入框,选中文件夹后自动将所有视频文件分批添加到上传队列:
// 创建文件夹选择输入框 const input = document.createElement('input'); input.type = 'file'; input.webkitdirectory = true; input.accept = 'video/*'; // 监听文件选择事件 input.addEventListener('change', async (e) => { const files = Array.from(e.target.files); // 筛选视频格式文件 const videoFiles = files.filter(file => file.type.startsWith('video/')); // 定位页面上传输入框(页面结构若更新需重新调整选择器) const uploadInput = document.querySelector('input[type="file"][accept="video/*"]'); if (!uploadInput) { console.error('未找到上传输入框,请检查页面结构'); return; } // 按YouTube Studio批量限制(15个/批)分批上传 for (let i = 0; i < videoFiles.length; i += 15) { const batch = videoFiles.slice(i, i + 15); // 模拟文件选择操作 const dataTransfer = new DataTransfer(); batch.forEach(file => dataTransfer.items.add(file)); uploadInput.files = dataTransfer.files; // 触发上传事件 uploadInput.dispatchEvent(new Event('change', { bubbles: true })); // 等待当前批次上传完成(根据视频大小调整等待时长) await new Promise(resolve => setTimeout(resolve, 60000)); // 示例等待60秒 } }); // 触发文件夹选择 input.click();
注意:YouTube Studio的页面结构可能会更新,若脚本失效需重新定位上传输入框的选择器;该方式仍受限于页面的批量上传限制,需等待每批上传完成后再进行下一批。
Node.js环境方案
Node.js有两种实现思路,分别适配不同的需求场景:
1. 基于YouTube Data API v3
使用官方googleapis库实现上传,但受限于API每日6个的配额限制:
const { google } = require('googleapis'); const fs = require('fs'); const path = require('path'); // 初始化OAuth2客户端(需提前在Google Cloud Console创建凭据) const oauth2Client = new google.auth.OAuth2( 'YOUR_CLIENT_ID', 'YOUR_CLIENT_SECRET', 'YOUR_REDIRECT_URI' ); // 设置授权凭据(通过OAuth2授权流程获取refresh_token) oauth2Client.setCredentials({ refresh_token: 'YOUR_REFRESH_TOKEN' }); const youtube = google.youtube({ version: 'v3', auth: oauth2Client }); // 批量上传文件夹内的视频 async function uploadVideosFromFolder(folderPath) { const files = fs.readdirSync(folderPath).filter(file => { const ext = path.extname(file).toLowerCase(); return ['.mp4', '.mov', '.avi'].includes(ext); }); for (const file of files) { const filePath = path.join(folderPath, file); try { const response = await youtube.videos.insert({ part: 'snippet,status', requestBody: { snippet: { title: path.basename(file, path.extname(file)), description: '自动上传的视频' }, status: { privacyStatus: 'private' // 可改为public/unlisted } }, media: { body: fs.createReadStream(filePath) } }); console.log(`上传成功:${response.data.id}`); // 间隔上传避免触发配额限制 await new Promise(resolve => setTimeout(resolve, 30000)); } catch (error) { console.error(`上传失败 ${file}:`, error.message); } } } // 调用上传函数,传入目标文件夹路径 uploadVideosFromFolder('./your-video-folder');
使用前需在Google Cloud Console创建项目并启用YouTube Data API v3,完成OAuth2授权流程获取相关凭据。
2. 模拟YouTube Studio上传(绕过API配额限制)
使用puppeteer无头浏览器模拟手动上传流程,每次批量上传15个视频:
const puppeteer = require('puppeteer'); const fs = require('fs'); const path = require('path'); async function uploadViaYouTubeStudio(folderPath) { const browser = await puppeteer.launch({ headless: false }); // 设为true则无头运行 const page = await browser.newPage(); // 跳转至YouTube Studio,手动完成登录 await page.goto('https://studio.youtube.com/'); console.log('请在浏览器中完成登录,登录后按回车继续...'); await new Promise(resolve => process.stdin.once('data', resolve)); // 读取文件夹内的视频文件 const files = fs.readdirSync(folderPath) .map(file => path.resolve(folderPath, file)) .filter(file => { const ext = path.extname(file).toLowerCase(); return ['.mp4', '.mov', '.avi'].includes(ext); }); // 按15个/批分批上传 for (let i = 0; i < files.length; i += 15) { const batch = files.slice(i, i + 15); await page.goto('https://studio.youtube.com/creation/upload'); // 等待上传输入框加载并上传文件 const fileInput = await page.waitForSelector('input[type="file"][accept="video/*"]'); await fileInput.uploadFile(...batch); // 等待当前批次上传完成(根据视频大小调整等待时长) console.log(`等待批次 ${Math.floor(i/15)+1} 上传完成...`); await new Promise(resolve => setTimeout(resolve, 120000)); // 示例等待2分钟 } await browser.close(); } // 调用上传函数 uploadViaYouTubeStudio('./your-video-folder');
注意:首次运行需手动完成登录,若要实现自动登录可通过保存浏览器cookie实现;需根据视频大小调整等待时间,避免未上传完成就开始下一批。
内容的提问来源于stack exchange,提问作者Shezan
相关产品推荐
相关产品推荐

