在使用Google Apps Script的 UrlFetchApp从网站获取PDF文件时出现错误

前端开发 2026-07-09

我有一个Google Apps Script,它每天从一个公开的金融网站下载PDF费率表。这个脚本已经正常运行了好几个月,但在大约4 月9 日左右突然停止工作。

本来应该返回 application/pdf 文件,现在 UrlFetchApp 返回的是一个 text/html 文件。

下面是我的最小可复现代码:

function testDownload() {
  var url = "https://www.sbp.org.pk/ecodata/rates/war/2026/May/05-May-26.pdf";

  var options = {
    muteHttpExceptions: true,
    headers: {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
    }
  };

  var response = UrlFetchApp.fetch(url, options);
  Logger.log("MimeType: " + response.getBlob().getContentType());
  Logger.log("Content: " + response.getContentText().substring(0, 300));
}

输出 / 错误: The MimeType 的日志显示为 text/html。The getContentText() 返回了这个Cloudflare阻止页面:

<html><body>
<h1>Access Denied</h1><p>Signature ID: 1002000251<br>Message ID: 2360628808<br>Client IP: 104.22.1.181</p>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js..."

到目前为止我的评估: 看起来对方把他们的网站放在Cloudflare的 Web应用防火墙(WAF)之后。因为 UrlFetchApp 来自Google's Data Center IP,Cloudflare将其标记为机器人并在请求到达该文件之前就拦截。

我的问题:

  1. 是否有任何原生方法仅使用 UrlFetchApp 参数(如特定头信息或cookies)来绕过这个Cloudflare阻止?
  2. 如果原生绕过由于Google的 IP被 WAF列入黑名单而不可行,获取这个PDF的最佳架构是什么?我需要通过抓取API或代理来路由吗?

解决方案

我可以确认这是Cloudflare的 Bot Management系统在阻止Google Apps Script的请求——Google的数据中心IP范围被广泛标记为自动化流量,任意数量的头信息调整都无法绕过它们的JavaScript挑战。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章