Google Chat中Google Apps Script执行异常问题咨询
Google Chat粘贴URL触发Web App/第三方链接预执行的底层机制解析
核心原因:Google Chat的链接预抓取功能
Google Chat为了生成友好的链接预览卡片(显示标题、描述、缩略图),会在你**粘贴URL到输入框时(甚至未发送消息)**自动发起HTTP请求抓取目标链接内容,这个过程叫「链接预抓取」。
为什么doGet被执行两次?
- 预抓取通常会发起至少两次请求:
- 第一次是
HEAD请求:快速获取资源头部信息(比如Content-Type、Content-Length),判断是否为可预览内容 - 第二次是
GET请求:抓取完整页面内容,提取<title>标签、Open Graph元数据等生成预览
- 第一次是
- Google Apps Script Web App默认会把HEAD请求转换成GET请求处理,所以
doGet(e)会被触发两次。
第三方确认链接被提前激活的原因
多数网站的账户确认逻辑是:只要服务器收到该链接的GET请求,就标记账户已激活,不管请求来自用户浏览器还是预抓取工具。Google Chat的预抓取相当于替你「点击」了一次确认链接,等你实际点击时,链接已经被消耗,因此显示账户已激活。
针对Web App的优化方案
如果你的Web App需要避免预抓取触发核心逻辑,可以通过以下方式区分请求来源:
- 检查请求的
User-Agent:Google Chat预抓取请求会带有Googlebot或Google Chat相关标识,在doGet(e)中判断:function doGet(e) { const userAgent = e.headers['User-Agent']; // 识别预抓取请求,仅返回预览元数据 if (userAgent && /Googlebot|Google Chat/i.test(userAgent)) { return HtmlService.createHtmlOutput('<title>我的Web App</title><meta name="description" content="这是我的Web App">'); } // 正常用户请求的业务逻辑 return HtmlService.createHtmlOutput('欢迎使用我的Web App'); } - 添加验证参数:比如仅当请求包含
?action=run这类指定参数时,才执行核心操作,避免预抓取误触发。
内容的提问来源于stack exchange,提问作者Michiel the Temp
相关产品推荐
相关产品推荐

