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

Telegraf如何编辑机器人最后发送消息 editMessageText报错解决

报错原因
  • 上下文快捷方法调用逻辑错误:Telegraf中ctx.editMessageText是绑定当前触发对象的快捷方法,仅在回调查询(用户点击内联按钮)场景下默认绑定按钮所属的机器人消息;当前场景是用户发送文本触发的message类型上下文,该方法默认指向用户发送的入站消息,机器人没有编辑普通用户消息的权限,因此直接调用会抛出TypeError: Telegraf: "editMessageText" isn't available for "message"错误。
  • 消息ID取值错误:你传入的ctx.from是发送消息的用户对象,不存在message.id属性;机器人自己发送的消息ID,不可能从用户对象上获取。
  • 方法传参格式错误:即使拿到了正确的消息ID,ctx.editMessageText的入参规则也不是(用户ID、消息ID、文本)的顺序,直接传参会触发参数校验失败。
正确实现方法

ctx.reply是异步方法,执行后返回的Promise resolve结果就是刚发送成功的消息对象,其中包含机器人发出消息的message_id字段。拿到该ID后,调用ctx.telegram实例上的原生editMessageText方法,传入对应参数即可完成编辑。
可直接运行的示例代码:

bot.hears('hi', async (ctx) =>{
  try{
    // 接收发送成功的机器人消息对象
    const sentMessage = await ctx.reply('hello')
    // 调用编辑接口,参数顺序:聊天ID、待编辑消息ID、内联消息ID(普通消息传undefined)、新文本内容
    await ctx.telegram.editMessageText(
      ctx.chat.id,
      sentMessage.message_id,
      undefined,
      "second text"
    )
  }catch(e){
    console.log(e)
  }
})

注意事项:

  • 仅支持编辑机器人发送后48小时内的消息,超过时限Telegram接口会返回权限错误
  • 如果要编辑的是内联查询发送的消息,不需要传chatId和messageId,第三个参数传入对应inlineMessageId即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:31:09