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
相关产品推荐
相关产品推荐

