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

YouTube Data API V3:playlistItems.list()分页获取频道上传内容失败

YouTube播放列表视频ID批量获取函数修复

核心问题拆解

  • API参数错误:原代码用了nextToken,但YouTube API的分页参数实际是pageToken,这是触发400错误的主要原因
  • 异步逻辑失控:递归调用getPlaylistItemsById时没加await,导致大量异步请求同时发起,触发API限流
  • 无限循环死锁:while循环里没有更新nextPageToken,只会反复用同一个token请求,直接导致无限调用
  • 数据无法累积:每次递归都新建空数组,只有第一次请求的50个ID能被返回
  • 返回逻辑缺失:没有下一页时直接return,没返回已收集的ID

修复后的完整代码

const DEFAULT_CHANNEL_UPLOADS_ID = "UUJQJAI7IjbLcpsjWdSzYz0Q";
async function getPlaylistItemsById(
  id = DEFAULT_CHANNEL_UPLOADS_ID,
  nextPageToken = undefined,
  collectedIds = []
) {
  try {
    // 修正API分页参数为pageToken
    const request = await gapi.client.youtube.playlistItems.list({
      part: ["snippet, contentDetails"],
      maxResults: 50,
      playlistId: id,
      pageToken: nextPageToken,
    });
    const response = await request.result;

    // 提取当前页视频ID并合并到已收集数组
    const currentIds = response.items.map(item => item.contentDetails.videoId);
    collectedIds.push(...currentIds);

    const nextToken = response?.nextPageToken;
    // 存在下一页则递归继续获取,否则返回所有结果
    if (nextToken) {
      return await getPlaylistItemsById(id, nextToken, collectedIds);
    }

    return collectedIds;
  } catch (error) {
    console.error('获取播放列表失败:', error);
    // 出错时返回已收集的部分数据
    return collectedIds;
  }
}

关键修复点说明

  1. 参数修正:将nextToken改为YouTube API规定的pageToken,直接解决400参数错误
  2. 累积式收集:新增collectedIds参数传递已获取的ID,确保所有分页数据能合并
  3. 异步控制:递归调用时添加await,保证请求按顺序发起,避免触发API限流
  4. 移除无效循环:用条件递归替代while循环,只有存在有效下一页token时才继续请求,彻底解决无限循环
  5. 完善容错:出错时返回已收集的部分结果,避免全量失败

内容的提问来源于stack exchange,提问作者Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:16:15