使用JavaScript获取YouTube频道视频字幕遇401错误求助
解决YouTube API获取字幕时的401权限错误
核心问题排查与修复
1. 字幕请求URL格式错误
你请求单个字幕内容的URL里,参数分隔符用错了:
原代码里的https://www.googleapis.com/youtube/v3/captions/${captionId}&key=${...},其中&应该改成?。因为captionId是资源路径的最后一部分,后面的查询参数必须以?开头,否则服务器会把&key=xxx识别为路径的一部分,导致接口解析失败,触发401错误。
2. 认证方式冲突
代码里同时用了API Key和Bearer Token,这两种认证方式二选一即可:
- 用API Key的情况:直接去掉
Authorization请求头,确保你的API Key已经在Google Cloud控制台启用了YouTube Data API v3,并且没有设置错误的访问限制(比如前端使用时,HTTP Referrer限制要匹配你的域名;后端使用时,IP限制要包含你的服务器IP)。 - 用OAuth Access Token的情况:去掉URL里的
key参数,同时确保Token拥有captions.read权限,且未过期。私有视频的字幕必须用OAuth认证,API Key无法访问。
3. 权限与API启用验证
就算你说开通了全部权限,也要确认两点:
- 确认YouTube Data API v3服务已经在Google Cloud控制台中启用(不是只配置权限,要单独启用这个API)。
- 如果目标视频是私有视频,API Key无法获取其字幕,必须使用OAuth认证,且认证用户拥有该视频的访问权限。
修正后的代码示例(API Key版本)
async function getVideoTranscripts(videoId) { try { const response = await axios.get( `https://www.googleapis.com/youtube/v3/captions?part=snippet&videoId=${videoId}&key=${process.env.YOUTUBE_API_KEY}` ); const captionIds = response.data.items.map((item) => item.id); const transcriptPromises = captionIds.map(async (captionId) => { try { // 修正URL参数分隔符,移除多余的Authorization头,指定响应类型为文本 const transcriptResponse = await axios.get( `https://www.googleapis.com/youtube/v3/captions/${captionId}?key=${process.env.YOUTUBE_API_KEY}`, { responseType: 'text' } ); return transcriptResponse.data; } catch (error) { console.error(`Error fetching transcript for caption ${captionId}:`, error); return null; } }); const transcripts = await Promise.all(transcriptPromises); return transcripts.filter(transcript => transcript !== null); } catch (error) { console.error(`Error fetching transcripts for video ${videoId}:`, error); return []; } }
内容的提问来源于stack exchange,提问作者clout_chaser
相关产品推荐
相关产品推荐

