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

Google表格脚本正常运行失败但调试正常,请求信息异常求助

解决Google Sheets脚本随机触发网站验证的问题

嘿,这个随机触发验证的问题我之前做类似的Google Sheets数据爬取时也碰到过——大概率是网站的反爬机制把你的批量请求当成机器人了。毕竟60个连续请求加上Google Apps Script默认的请求特征太“规整”,很容易被识别。下面是几个亲测有效的解决思路:

1. 给请求加随机延迟,模拟人类操作节奏

网站对短时间内的高频请求特别敏感,你可以在每个请求之间加个1-3秒的随机延迟,别用固定间隔,不然还是容易被抓。代码示例:

tokens.forEach((token) => {
  // 随机延迟1000-3000毫秒(1-3秒)
  Utilities.sleep(Math.floor(Math.random() * 2000) + 1000);
  // 你的请求逻辑写在这里...
});

注意:Google Apps Script单脚本运行时间不能超过6分钟,所以要算好总延迟时间,别超了。

2. 自定义请求头,伪装成真实浏览器

默认的Google Apps Script请求头里的User-Agent是一眼就能认出的机器人标识,你可以换成主流浏览器的UA,甚至每次请求随机换一个:

// 准备几个真实浏览器的User-Agent列表
const userAgents = [
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15",
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0"
];

// 每次请求随机选一个UA
const randomUA = userAgents[Math.floor(Math.random() * userAgents.length)];

// 发起请求时带上自定义headers
const response = UrlFetchApp.fetch(yourRequestUrl, {
  headers: {
    "User-Agent": randomUA,
    "Accept-Language": "en-US,en;q=0.9", // 加个语言头更真实
    "Referer": "https://目标网站域名.com/" // 如果有需要,设置请求来源页
  }
});

3. 拆分请求批次,避免一次性跑完60个

如果一次性处理60个请求压力太大,可以分成多个小批次,比如每次处理10个,用Google Sheets的时间驱动触发器分批次执行。具体步骤:

  • 把你的tokens数组存在Sheet的某一列里,比如A列,同时用B列标记是否已成功获取数据
  • 写一个脚本,每次只处理B列标记为“未完成”的前10个token
  • 设置触发器,每10分钟运行一次这个脚本

这样既避免了单脚本超时,也大幅降低了短时间内的请求密度,不容易被拦截。

4. 加重试机制,应对偶尔的验证触发

如果还是偶尔会碰到验证,可以在代码里加个重试逻辑,当返回"Error!"时,重试1-2次(记得重试前加延迟):

function fetchWithRetry(requestUrl, options, maxRetries = 2) {
  let attempt = 0;
  while (attempt < maxRetries) {
    try {
      const response = UrlFetchApp.fetch(requestUrl, options);
      // 这里可以根据网站的验证页面特征判断是否触发了验证
      const content = response.getContentText();
      if (!content.includes("验证") && !content.includes("Error!")) {
        return response;
      }
    } catch (e) {
      // 捕获请求异常,比如网络错误
      console.log(`请求失败:${e.message}`);
    }
    attempt++;
    Utilities.sleep(3000); // 重试前先等3秒
  }
  return "Error!"; // 多次重试失败再返回错误
}

另外补充一点:如果以上方法都没用,可能是网站对谷歌服务器的IP做了限制(因为Google Apps Script的请求IP是谷歌的),这种情况可以考虑用第三方中转服务,或者换成自己部署的云函数来转发请求,不过操作起来会复杂一点。

内容的提问来源于stack exchange,提问作者5ive8ight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:15:02