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

Node.js Telegraf Bot启用MenuBuilder时setWebhook 409冲突报错问询

问题原因
  • Telegram Bot API 同一时间仅支持一种运行模式,若你的主 Bot 启用了长轮询(polling)模式,同时单独开启 MenuBuilder 的 webhook,相当于同时触发两种运行模式的注册请求,会直接返回 409 Conflict 冲突错误。
  • 短时间内多次重复调用 setWebhook 接口,上一次配置请求未完成响应就发起新的请求,也会触发该冲突报错。
  • MenuBuilder 配置的 webhook 地址与主 Bot 已注册的 webhook 地址不一致,发起覆盖请求时被服务端终止,也会抛出对应错误。
解决方案

场景1:主 Bot 使用长轮询(polling)模式运行

不需要单独启用 MenuBuilder 的 webhook,直接通过静态命令注册方式同步菜单到 Telegram 服务器,新用户打开 Bot 时会自动拉取展示菜单,示例代码如下:

const { Telegraf, MenuBuilder } = require('telegraf')
const bot = new Telegraf('你的 Bot Token')

// 构造菜单
const mainMenu = new MenuBuilder()
  .text('功能1', 'func1')
  .text('功能2', 'func2')
  .row()
  .text('帮助', 'help')

// 全局注册菜单,无需依赖webhook
bot.telegram.setMyCommands(mainMenu.toCommands())

// 正常启动polling模式
bot.launch()

场景2:主 Bot 需要使用 webhook 模式运行

统一管理全局 webhook 配置,不要单独给 MenuBuilder 启用独立 webhook,操作前先清理旧的 webhook 配置,避免冲突,示例代码如下:

const { Telegraf, MenuBuilder } = require('telegraf')
const bot = new Telegraf('你的 Bot Token')

// 构造菜单
const mainMenu = new MenuBuilder()
  .text('功能1', 'func1')
  .text('功能2', 'func2')
  .row()
  .text('帮助', 'help')

;(async () => {
  // 先清理残留的旧webhook配置
  await bot.telegram.deleteWebhook()
  // 注册全局菜单
  await bot.telegram.setMyCommands(mainMenu.toCommands())
  // 统一启动全局webhook,替换为你自己的公网服务域名和端口
  await bot.launch({
    webhook: {
      domain: 'https://你的公网服务域名',
      port: 3000
    }
  })
})()

通用兼容处理

给所有异步操作添加异常捕获,避免未处理的 Promise rejection 直接导致进程崩溃:

// 启动时添加catch捕获异常
bot.launch({
  webhook: {
    domain: 'https://你的公网服务域名',
    port: 3000
  }
}).catch(err => console.log('启动异常:', err))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 17:45:05