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

为什么Google Apps Script的UrlFetchApp请求API返回429错误,同代码手机运行正常

问题原因
  • 429错误为GuildWars2 API触发了基于请求来源IP的速率限制规则,当同一IP短时间内请求量超过阈值就会被拦截。
  • Google Apps Script的UrlFetchApp方法发起请求时,默认使用Google共享的服务器出口IP池,大量GAS用户共用这些IP访问公开API,很容易触发目标站点的速率阈值,这是电脑端运行一直报错的核心原因。
  • 手机端运行同脚本可正常返回,是因为手机端请求走的是当前移动网络的独立公网IP,没有被其他用户的请求占用额度,所以不会触发限制。
解决方案

方案1:添加自动重试+速率控制

开启muteHttpExceptions参数捕获错误,触发429时自动等待后重试,修改后代码参考:

function getRequest() {
  const maxRetries = 3; // 最大重试次数
  const retryDelay = 2000; // 每次重试间隔2秒
  let attempt = 0;
  
  while (attempt < maxRetries) {
    try {
      const response = UrlFetchApp.fetch('https://api.guildwars2.com/v2/items/15', {
        muteHttpExceptions: true // 不直接抛出HTTP异常,方便自定义处理
      });
      const statusCode = response.getResponseCode();
      
      if (statusCode === 200) {
        const result = JSON.parse(response.getContentText());
        Logger.log(result);
        return result;
      } else if (statusCode === 429) {
        Utilities.sleep(retryDelay);
        attempt++;
      } else {
        throw new Error(`请求异常,状态码:${statusCode}`);
      }
    } catch (e) {
      Logger.log(`运行出错:${e.toString()}`);
      Utilities.sleep(retryDelay);
      attempt++;
    }
  }
  Logger.log(`重试${maxRetries}次后仍然请求失败,建议稍后再试`);
}

方案2:添加自定义User-Agent请求头

部分API会对携带自定义标识UA的请求单独统计速率,不和GAS默认UA的请求共用额度,修改请求参数即可:

const response = UrlFetchApp.fetch('https://api.guildwars2.com/v2/items/15', {
  muteHttpExceptions: true,
  headers: {
    'User-Agent': 'GW2-Item-Query-Tool/1.0' // 可自定义为你自己的工具标识
  }
});

方案3:绑定专属API密钥

如果需要高频调用,可以去GuildWars2官方后台申请专属API密钥,绑定密钥的请求通常会获得更高的速率限制额度。

注意事项
  • 调试阶段不要短时间内频繁触发脚本运行,会进一步消耗IP的请求额度,延长限制时间,每次测试建议间隔10秒以上。

内容的提问来源于stack exchange,提问作者Abe B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:06:00