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

使用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

问题排查与修复

核心错误点

  1. 函数未接收参数:你调用getVids(channelId)但函数定义async function getVids()没接收参数,导致内部根本没用到你传入的正确频道ID。
  2. Search API参数错误:
    • 用Search API查频道视频时,不能用id参数(id是用来搜特定视频/播放列表ID的),必须用channelId参数指定目标频道。
    • URL里的&是HTML转义字符,直接用&即可,否则会被当作URL的一部分解析,导致参数失效。
    • 缺少type=video过滤,默认会返回频道、播放列表等非视频内容;缺少order=date的话,默认按相关度排序,可能返回无关结果。
  3. 无错误处理:没处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:35:18