Google Apps Script中UrlFetchApp.fetch()自2021.4.27突现4秒超时、校网抓取失败
核心结论
这个异常大概率不是Google主动的访问策略拦截,对应2021年4月底的时间点,绝大多数同类故障的原因是:Google Apps Script(以下简称GAS)在该时间点更新了全部出站请求的IP段,而你校网站的防火墙/WAF设备未同步放行新的IP段,直接静默丢弃了所有来自GAS IP段的请求。
你提到的“脚本运行仅4秒就触发超时”的特征完全匹配这类拦截的表现:请求在TCP连接阶段就被设备直接丢弃,本地等待2次TCP重传后就会触发超时,不会等到GAS默认的30秒请求超时阈值;而Postman走的是你本地/Postman服务的合法IP,不在学校的拦截名单内,因此可以正常访问。同期大量教育机构的WAF也上线了公有云IP段默认拦截规则,即使Google没有主动调整策略,学校侧的规则升级也会导致这类跨环境访问故障。
可落地的排查验证步骤
- 第一步:确认GAS出站IP是否被拦截
运行以下测试代码,获取当前GAS实际发出请求的公网IP:
把拿到的IP发给学校IT部门,确认该IP是否在网站的拦截名单中。function getGasOutboundIp() { const res = UrlFetchApp.fetch("可返回当前请求公网IP的公开服务地址", {muteHttpExceptions: true}); console.log(res.getContentText()); } - 第二步:验证UA拦截规则
GAS的UrlFetchApp默认请求头会携带Google-Apps-Script相关的UA标识,部分学校的WAF会在同期新增爬虫UA拦截规则,同样会静默丢包。可以把请求UA替换成你Postman测试时用的UA字符串,再重试请求:function testWithCustomUA() { const schoolUrl = "你要访问的学校域名地址"; const options = { headers: { "User-Agent": "替换成你Postman里看到的UA完整字符串" }, muteHttpExceptions: true, timeout: 30000 } const res = UrlFetchApp.fetch(schoolUrl, options); console.log(res.getResponseCode(), res.getContentText().slice(0, 200)); } - 第三步:排除域名层面的访问限制
先请求学校域名下的公开静态资源(比如站点的favicon文件)测试,如果连静态资源都无法抓取,基本可以确定是IP/UA层面的拦截,不存在域名被Google拉黑的情况。
临时解决方案
如果暂时联系不到学校IT加白,可以在GAS请求中配置第三方转发代理,把请求通过你本地/其他未被学校拦截的服务器转发到学校网站,绕过GAS的出站IP段限制。
内容的提问来源于stack exchange,提问作者helloworld
相关产品推荐
相关产品推荐

