You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Google Apps Script开发Telegram机器人:doPost函数无法触发start函数问题求助

解决Telegram机器人/start命令无法触发Google Apps Script中start函数的问题

看起来你遇到的核心问题是doPost函数没正确接收Telegram的请求,或者请求处理逻辑有问题导致start函数没被调用。我来帮你一步步排查和解决:

一、先确认Webhook是否正确配置(最关键的第一步)

Telegram机器人是通过Webhook机制把用户消息推送到你的Google Apps Script(GAS)部署URL的,如果Webhook没设对,doPost根本不会收到任何请求:

  • 先通过Telegram API设置正确的Webhook,在浏览器访问以下链接(替换成你的机器人token和GAS部署URL):
    https://api.telegram.org/bot<你的telegramToken>/setWebhook?url=<你的GAS部署的Web应用URL>
    
  • 再检查Webhook状态,访问:
    https://api.telegram.org/bot<你的telegramToken>/getWebhookInfo
    
    查看返回的url是否正确,last_error_message有没有报错信息。

二、检查Google Apps Script的部署设置

GAS的Web应用部署必须满足以下条件,否则会拒绝Telegram的匿名请求:

  • 部署类型选择“Web应用”
  • 执行权限设置为“任何人,甚至匿名”
  • 必须选择已保存的版本,不能用“草稿”版本部署

三、修正代码中的逻辑问题

1. 命令匹配的鲁棒性问题

你的代码用if(text == '/start')精确匹配,但Telegram中用户在群组发送命令时,可能会带上机器人用户名(比如/start@YourBotName),精确匹配会失效。建议改用正则匹配:

function doPost(e){
  var data = JSON.parse(e.postData.contents);
  // 先判断是否存在有效消息文本
  if (!data.message || !data.message.text) {
    Logger.log("未收到有效消息文本");
    return;
  }
  var text = data.message.text;
  // 用正则匹配/start命令,兼容带用户名的情况
  if(text.match(/^\/start(@\w+)?$/)){
    start(data);
  } else if (text.match(/^\/survey(@\w+)?$/)) { // 修正了原代码重复的/survey判断
    survey(data);
  } else {
    invalid(data);
  }
}

2. start函数中的API请求错误

你的start函数有两个致命问题:

  • method变量多了末尾的点:'sendMessage.',会导致API请求地址错误
  • reply对象缺少chat_id参数,这是Telegram发送消息必须的字段

修正后的start函数:

function start(data) {
  // 获取用户的聊天ID,这是发送消息的必要参数
  var chatId = data.message.chat.id;
  var reply = {
    'chat_id': chatId,
    'text': "Please type /survey to start using its service.",
    'parse_mode': 'Markdown',
    'disable_web_page_preview': true
  };
  var method = 'sendMessage'; // 去掉末尾的点
  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    'payload' : JSON.stringify(reply)
  };
  var response = UrlFetchApp.fetch('https://api.telegram.org/bot' + telegramToken + '/' + method, options);
}

四、添加日志辅助排查

doPost开头添加日志,方便确认是否收到请求及请求结构:

function doPost(e){
  Logger.log("收到请求:" + JSON.stringify(e));
  var data = JSON.parse(e.postData.contents);
  Logger.log("解析后的消息数据:" + JSON.stringify(data));
  // 后续逻辑...
}

发送/start命令后,在GAS编辑器里点击「查看」→「日志」,就能看到请求是否正常到达,以及数据结构是否符合预期。


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

火山引擎 最新活动