Telegram机器人webhook返回302临时重定向 Google插件测试问题
根因分析
你遇到的302重定向和重复请求问题和附加组件测试模式无关,本质是WebApp的部署配置不符合Telegram webhook的访问要求:
- Telegram服务器以匿名身份访问WebApp地址时,Google Apps Script返回了302跳转登录页,没有返回预期的200状态码
- Telegram webhook机制要求接收方必须在15秒内返回200/2XX状态码,否则会判定请求失败,按规则重试最多20次,间隔约1分钟,和你遇到的现象完全吻合
- 你手动调用sendPost正常是因为请求发起方是你同账号的Apps Script环境,自带身份凭证,不需要登录就能访问测试部署的WebApp,不会触发重定向
解决方案
1. 重新部署WebApp为正式公开版本
打开项目1的Apps Script编辑器,按以下步骤操作:
- 点击右上角「部署」→「新建部署」
- 点击配置图标选择「Web应用」
- 执行身份选择 我(你的Google账号邮箱)
- 有权限的用户选择 任何人,甚至匿名用户(注意不要选仅「任何人」,该选项要求访问方登录Google账号,匿名访问会触发302)
- 点击「部署」完成操作,复制生成的以
/exec结尾的正式部署URL,不要使用以/dev结尾的测试部署URL - 将新的WebApp URL更新到Telegram机器人的webhook配置中
2. 优化WebApp返回配置
显式设置返回值的MIME类型,避免Telegram识别异常,修改doPost代码如下:
function doPost(e) { myLog('Received from Addon: ' + JSON.stringify(e)); // 确保myLog方法不会抛出异常,否则会导致WebApp返回错误码 return ContentService.createTextOutput(JSON.stringify(e)) .setMimeType(ContentService.MimeType.JSON); }
3. 附加组件测试适配
项目2的附加组件在测试模式下运行时,直接使用上面生成的正式部署WebApp地址即可,正式部署的地址不会随代码更新变动,不会出现地址失效问题。如果你之前用的是测试部署的WebApp地址,替换为正式地址即可正常调用。
4. 重复请求兜底
即使配置正确,Telegram也可能因为网络波动触发重试,你可以在WebApp中增加去重逻辑:将收到的Telegram请求的update_id存入电子表格,每次收到请求先校验该update_id是否已处理过,已处理的直接返回200状态码即可,避免重复执行业务逻辑。
内容的提问来源于stack exchange,提问作者Boris Baublys
相关产品推荐
相关产品推荐

