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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:47:34