Youtube Data API pageToken不生效,返回重复数据致无限循环求助
YouTube Comments API分页重复数据问题修复
问题根源
你的代码中fetchAPI函数存在语法错误和逻辑漏洞,这是导致API忽略pageToken、返回重复数据并引发无限循环的核心原因:
while循环后未添加花括号,导致重试逻辑仅执行一次fetch请求,无法处理需要重试的错误场景。while条件中提前引用未定义的response变量,触发未捕获的引用错误,破坏正常请求流程。- 异常捕获后无任何处理,无法有效重试失败的请求,导致返回异常数据。
修复方案
1. 重构fetchAPI函数
修正重试逻辑,确保请求失败或返回processingFailure错误时能正确重试,同时避免变量未定义问题:
async function fetchAPI(url) { let data; let shouldRetry = true; while (shouldRetry) { try { const fullUrl = `${url}&key=${key}`; const response = await fetch(fullUrl); data = await response.json(); // 仅当返回processingFailure错误时重试 if (data.error && checkError(data.error, "processingFailure")) { console.log("API处理失败,重试中..."); continue; } shouldRetry = false; } catch (e) { console.error("网络请求失败,重试中:", e.message); } } return data || {}; }
2. 优化评论分页循环
确保分页请求正确传递pageToken,并添加边界判断避免无限循环:
if (snippet.totalReplyCount > 5) { let json3 = await fetchAPI(`https://youtube.googleapis.com/youtube/v3/comments?part=snippet&maxResults=100&parentId=${snippet.topLevelComment.id}`); if (json3.error) { throw new Error(JSON.stringify(json3.error)); } do { const comments = json3.items; for (const comment of comments) { if (++count % 100 === 0) { console.log(`scraping comment ${count} of ${videoID}`); } // 处理authorChannelId可能为空的情况 const channelId = comment.snippet.authorChannelId?.value; if (channelId) { video[channelId] = { handle: comment.snippet.authorDisplayName }; } } if (!json3.nextPageToken) { break; // 无下一页,终止循环 } // 发起下一页请求 json3 = await fetchAPI(`https://youtube.googleapis.com/youtube/v3/comments?part=snippet&maxResults=100&parentId=${snippet.topLevelComment.id}&pageToken=${encodeURIComponent(json3.nextPageToken)}`); if (json3.error) { throw new Error(JSON.stringify(json3.error)); } } while (json3.nextPageToken); }
3. 额外检查项
- 确认API密钥拥有
youtube.readonly或足够的权限,且未超出YouTube Data API的每日配额限制(配额不足会导致API返回异常响应)。 - 验证
pageToken的编码是否正确,encodeURIComponent已处理所有特殊字符。 - 避免在循环中重复覆盖
video对象的相同键值对,可根据需求添加存在性判断。
内容的提问来源于stack exchange,提问作者WinterEx19
相关产品推荐
相关产品推荐

