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; } }
关键修复点说明
- 参数修正:将
nextToken改为YouTube API规定的pageToken,直接解决400参数错误 - 累积式收集:新增
collectedIds参数传递已获取的ID,确保所有分页数据能合并 - 异步控制:递归调用时添加
await,保证请求按顺序发起,避免触发API限流 - 移除无效循环:用条件递归替代while循环,只有存在有效下一页token时才继续请求,彻底解决无限循环
- 完善容错:出错时返回已收集的部分结果,避免全量失败
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

