为什么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.
相关产品推荐
相关产品推荐

