使用YouTube API v3传入正确Channel ID却返回其他频道视频问题
问题:Node.js脚本调用YouTube API查询指定频道视频却返回其他频道内容
我写了个Node.js脚本,用来获取指定频道的所有上传视频。脚本接收channelId作为输入,查询到频道视频后把首个视频ID传给另一个函数打印标题。我已经从YouTube账户设置里复制了正确的Channel ID(UCyFpI1Ft7ZhxA06je0R3MDg),但运行脚本时一直返回NBC Sports的视频,所有请求都正常完成没报错,怀疑是getVids()函数有问题导致查错了频道,求帮忙排查。
代码示例
const axios = require('axios'); const { resolve } = require('path'); var apiKey = '~~~got api key from google cloud~~~' var channelId = 'UCyFpI1Ft7ZhxA06je0R3MDg' //^^ my channel id, see: https://youtube.com/channel/UCyFpI1Ft7ZhxA06je0R3MDg getVids(channelId) //get all videos for channel async function getVids() { const options = { method: 'GET', url: `https://youtube.googleapis.com/youtube/v3/search? part=snippet&maxResults=50&id=${channelId}&key=${apiKey}` }; const result = await axios(options); let videoId = result.data.items[0].id.videoId let videoData = await getVideoData(videoId) console.log(videoData) } //get video metadata (title, date uploaded, etc..) for video id async function getVideoData(videoId){ console.log(`getting video data for ${videoId}`) const options = { method: 'GET', url: `https://youtube.googleapis.com/youtube/v3/videos?part=snippet&id=${videoId}&key=${apiKey}` }; const result = await axios(options); return('video title=',result.data.items[0].snippet.title) }
运行输出
getting video data for lLEZnKAobD8 TVF's Sixer - New Web Series | Episode 3 - Match Day Live
问题排查与修复
核心错误点
- 函数未接收参数:你调用
getVids(channelId)但函数定义async function getVids()没接收参数,导致内部根本没用到你传入的正确频道ID。 - Search API参数错误:
- 用Search API查频道视频时,不能用
id参数(id是用来搜特定视频/播放列表ID的),必须用channelId参数指定目标频道。 - URL里的
&是HTML转义字符,直接用&即可,否则会被当作URL的一部分解析,导致参数失效。 - 缺少
type=video过滤,默认会返回频道、播放列表等非视频内容;缺少order=date的话,默认按相关度排序,可能返回无关结果。
- 用Search API查频道视频时,不能用
- 无错误处理:没处理API返回空结果的情况,容易触发
Cannot read properties of undefined报错。
修复后的代码
const axios = require('axios'); const apiKey = '~~~got api key from google cloud~~~'; const channelId = 'UCyFpI1Ft7ZhxA06je0R3MDg'; getVids(channelId); // 获取频道所有视频 async function getVids(targetChannelId) { try { const options = { method: 'GET', url: `https://youtube.googleapis.com/youtube/v3/search?part=snippet&maxResults=50&channelId=${targetChannelId}&type=video&order=date&key=${apiKey}` }; const result = await axios(options); if (!result.data.items || result.data.items.length === 0) { console.log("该频道未找到视频"); return; } const videoId = result.data.items[0].id.videoId; const videoData = await getVideoData(videoId); console.log(videoData); } catch (error) { console.error("请求出错:", error.response?.data || error.message); } } // 获取视频元数据 async function getVideoData(videoId){ try { console.log(`正在获取视频 ${videoId} 的数据`); const options = { method: 'GET', url: `https://youtube.googleapis.com/youtube/v3/videos?part=snippet&id=${videoId}&key=${apiKey}` }; const result = await axios(options); if (!result.data.items || result.data.items.length === 0) { return "未找到该视频信息"; } return `视频标题: ${result.data.items[0].snippet.title}`; } catch (error) { console.error("获取视频数据出错:", error.response?.data || error.message); return "获取视频数据失败"; } }
修复说明
- 给
getVids函数添加参数targetChannelId,正确接收传入的频道ID - 修正Search API的URL参数:用
channelId替代id,添加type=video过滤视频、order=date按上传时间排序,把&替换为& - 加入
try-catch错误处理,同时判断返回结果是否为空,避免无意义报错 - 调整
getVideoData的返回格式,让输出更直观清晰
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

