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

Telegram Bot与Google Script:doPost(e)无法触发问题求助

Telegram Bot doPost函数未触发问题排查

问题描述

向Telegram Bot发送文本后,Bot显示已接收消息,但Google Apps Script中的doPost函数始终未触发。已完成以下验证:

  • 执行getMe确认Bot正常运行
  • 执行setWebHook确认WebHook已成功设置
  • 访问Web App URL验证doGet可用,能返回"Hi there"
  • 发送消息后无任何响应,doPost未执行(日志未新增内容,也未收到测试邮件)

相关代码

var token = "xxxxxxxxxx:AAF-abcderKOWIomM1sq3uttOME7bI";    
var telegramUrl = "https://api.telegram.org/bot" + token;
var webAppUrl = "https://script.google.com/macros/s/AKfycbypBHbRswF9NZA_viYsl647JYQhB0fG0w8GL13Cw03kJo8xidJWVEZziP4KVTMjEtpe/exec"; 
var ssId= "1gKGU3ViXnWHm3OBeBtN1mzn-yNymuEmXfV1tT5bNdNw";       
var adminID = "@XXXXXX";   

var sheetname = "Log";
var ss = SpreadsheetApp.openById(ssId).getSheetByName(sheetname);
ss.appendRow(["Got here"]);


function doPost(e) {
  GmailApp.sendEmail(Session.getEffectiveUser().getEmail(),"Bot sent email",JSON.stringify(e,null,4));
  var sheetname = "Log";
  var ss = SpreadsheetApp.openById(ssId).getSheetByName(sheetname);
  ss.appendRow(["doPost"]);

  var data = JSON.parse(e.postData.contents);
  var text = data.message.text;
  var id = data.message.chat.id;

}

function getMe() {
  var url = telegramUrl + "/getMe";
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}

function setWebhook() {
  var url = telegramUrl + "/setWebhook?url=" + webAppUrl;
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}

function sendText(id,answer) {
  var url = telegramUrl + "/sendMessage?chat_id=" + id + "&text=" + encodeURIComponent(answer);
  var response = UrlFetchApp.fetch(url);
  console.log(response.getContentText());
}

function doGet(e) {
  return HtmlService.createHtmlOutput("Hi there");
}

排查方向及解决方法

1. 检查Web App部署权限

  • 必须确保Web App部署时选择**「任何人,甚至匿名」**权限。若权限设为仅限自己或特定用户,Telegram的请求会被Google Apps Script拒绝,导致doPost无法触发。
  • 重新部署Web App,更新版本,确认权限设置正确。

2. 移除全局作用域的执行代码

  • 当前代码在全局作用域直接执行ss.appendRow(["Got here"]),每次脚本启动都会运行这段代码。如果Spreadsheet ID错误、权限不足,会导致脚本初始化失败,进而阻断doPost执行。
  • 将这段代码移到函数内部,修改后示例:
    var token = "xxxxxxxxxx:AAF-abcderKOWIomM1sq3uttOME7bI";    
    var telegramUrl = "https://api.telegram.org/bot" + token;
    var webAppUrl = "https://script.google.com/macros/s/AKfycbypBHbRswF9NZA_viYsl647JYQhB0fG0w8GL13Cw03kJo8xidJWVEZziP4KVTMjEtpe/exec"; 
    var ssId= "1gKGU3ViXnWHm3OBeBtN1mzn-yNymuEmXfV1tT5bNdNw";       
    var adminID = "@XXXXXX";   
    
    function initLog() {
      var sheetname = "Log";
      var ss = SpreadsheetApp.openById(ssId).getSheetByName(sheetname);
      ss.appendRow(["Got here"]);
    }
    

3. 正确编码WebHook URL

  • 设置WebHook时,URL需确保正确编码。修改setWebhook函数,对URL进行编码:
    function setWebhook() {
      var encodedUrl = encodeURIComponent(webAppUrl);
      var url = telegramUrl + "/setWebhook?url=" + encodedUrl;
      var response = UrlFetchApp.fetch(url);
      Logger.log(response.getContentText());
    }
    
  • 重新执行setWebhook函数,确认返回成功状态。

4. 给doPost添加合法返回值

  • Telegram要求WebHook响应必须返回200状态码,否则会判定请求失败,后续不再发送消息。当前doPost无返回值,需补充返回:
    function doPost(e) {
      GmailApp.sendEmail(Session.getEffectiveUser().getEmail(),"Bot sent email",JSON.stringify(e,null,4));
      var sheetname = "Log";
      var ss = SpreadsheetApp.openById(ssId).getSheetByName(sheetname);
      ss.appendRow(["doPost"]);
    
      var data = JSON.parse(e.postData.contents);
      var text = data.message.text;
      var id = data.message.chat.id;
    
      // 返回符合要求的响应
      return ContentService.createTextOutput(JSON.stringify({"status":"ok"})).setMimeType(ContentService.MimeType.JSON);
    }
    

5. 检查WebHook状态

  • 调用Telegram的getWebhookInfo接口,查看WebHook的错误信息:
    function getWebhookInfo() {
      var url = telegramUrl + "/getWebhookInfo";
      var response = UrlFetchApp.fetch(url);
      Logger.log(response.getContentText());
    }
    
  • 执行该函数后,查看返回的last_error_message字段,可直接定位具体错误原因。

6. 确认脚本权限

  • 确保执行setWebhook、getMe的账号,拥有Web App和目标Spreadsheet的编辑权限。若使用团队账号,需确认共享设置正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:25:00