使用ytdl-core下载YouTube视频时遭遇403 Forbidden错误
解决ytdl-core下载YouTube视频返回403 Forbidden的问题
常见原因及修复步骤
1. 库版本过时
YouTube会频繁调整视频流的获取逻辑,旧版本的ytdl-core会因不兼容新逻辑触发403错误。
- 执行命令更新到最新版本:
若更新后仍有问题,可尝试安装预发布版本:npm update ytdl-corenpm install ytdl-core@next
2. 代码异步逻辑错误
你的示例代码中ytdl.getInfo是异步函数,直接赋值会得到Promise对象而非实际视频信息,后续调用downloadFromInfo会因参数错误引发异常;同时你未将下载流pipe到文件写入流,无法完成文件写入。修正后的代码:
import { ytdl } from "ytdl-core"; import * as fs from "node:fs"; import { makeSafe } from "./your-utils-file"; // 确保导入你的makeSafe工具函数 // 使用async/await处理异步流程 async function downloadVideo(videoId) { try { // 必须加await获取实际的视频信息 const info = await ytdl.getInfo(videoId); const stream = ytdl.downloadFromInfo(info, { filter: 'videoandaudio', // 模拟浏览器请求头,避免被拦截 requestOptions: { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } } }); // 将下载流导向文件写入流 stream.pipe(fs.createWriteStream(`${makeSafe(info.videoDetails.title)}.mp4`)); // 监听流事件处理完成或错误 stream.on('finish', () => console.log('下载完成')); stream.on('error', (err) => console.error('下载出错:', err)); } catch (err) { console.error('获取视频信息失败:', err); } } // 调用下载函数 downloadVideo("some-video-id");
3. 请求头缺失被拦截
YouTube会验证请求的User-Agent,若请求未携带符合浏览器格式的UA,易被判定为非合法请求返回403。在downloadFromInfo的配置中添加requestOptions.headers设置UA即可(如上述代码所示)。
4. 视频本身的限制
若上述方法均无效,需确认目标视频是否存在版权限制、地区限制或需登录观看的情况。这类视频即使使用浏览器也需要特定权限,ytdl-core无法绕过这类限制。
内容的提问来源于stack exchange,提问作者Hibiscus
相关产品推荐
相关产品推荐

