You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ytdl-core下载YouTube视频时遭遇403 Forbidden错误

解决ytdl-core下载YouTube视频返回403 Forbidden的问题

常见原因及修复步骤

1. 库版本过时

YouTube会频繁调整视频流的获取逻辑,旧版本的ytdl-core会因不兼容新逻辑触发403错误。

  • 执行命令更新到最新版本:
    npm update ytdl-core
    
    若更新后仍有问题,可尝试安装预发布版本:
    npm 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:00:08