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

使用Ruby编辑Telegram机器人消息时遇400错误求助

解决Telegram机器人编辑消息时的「Bad Request: message to edit not found」错误

嘿,我来帮你搞定这个头疼的错误~ 之前我也踩过类似的坑,这个400错误本质是Telegram API找不到你要编辑的那条消息,主要是这几个常见原因和对应的解决办法:

1. 用错了Chat ID,找错了会话位置

你代码里用的message.from.id是发送消息的用户ID,但消息实际存在的会话ID应该是message.chat.id。举个例子:如果用户在群里发消息,from.id是这个用户的私人ID,而chat.id才是群聊的ID——你让机器人去用户的私人会话里找群聊里的消息,肯定找不到啊!

把chat_id: message.from.id改成chat_id: message.chat.id,这是最常见的错误点。

2. 试图编辑用户发送的消息(Telegram不允许!)

敲黑板:Telegram API有严格限制——机器人只能编辑自己发送出去的消息,绝对不能编辑用户发的消息。如果你是在用户发消息后直接调用edit_message_text去改用户的消息,100%会报错。

正确的流程应该是:

  • 机器人先主动发送一条带内联键盘的消息给用户
  • 用户点击键盘后,机器人编辑自己之前发的这条消息

3. Message ID无效或消息已被删除

确保你传入的message_id是机器人自己发送的那条消息的ID,而不是用户消息的ID。另外如果这条消息已经被用户手动删除,或者机器人发送后过了太久(Telegram会清理旧消息),也会触发这个错误。

4. 机器人权限不足(群聊场景)

如果是在群聊/超级群里使用机器人,要检查机器人有没有「编辑消息」的权限。可以在群设置里把机器人的权限调整为允许编辑消息,否则API会直接拒绝请求。


修正后的代码示例

我给你调整了代码框架,按照正确的流程处理消息和回调查询:

Telegram::Bot::Client.run(token) do |bot|
  bot.listen do |update|
    # 处理用户发送的/start命令,机器人发送初始带键盘的消息
    if update.message && update.message.text == '/start'
      # 发送消息并保存返回的对象,方便后续编辑
      sent_msg = bot.api.send_message(
        chat_id: update.message.chat.id,
        text: "What would you like Athena to do?",
        reply_markup: tasks_keyboard()
      )
      # 可以把消息ID存起来(比如用哈希关联用户),方便后续多次编辑
      # 比如:user_bot_msgs[update.message.from.id] = sent_msg.message_id
    end

    # 处理内联键盘的回调点击事件
    if update.callback_query
      callback = update.callback_query
      # 从回调里获取机器人发送的消息的chat_id和message_id
      target_chat_id = callback.message.chat.id
      target_msg_id = callback.message.message_id

      # 编辑机器人自己的消息
      bot.api.edit_message_text(
        chat_id: target_chat_id,
        message_id: target_msg_id,
        text: "You selected: #{callback.data}! What's next?",
        reply_markup: tasks_keyboard() # 可以替换成新的键盘或者保留原键盘
      )

      # 必须回调查询,否则用户的按钮会一直处于加载状态
      bot.api.answer_callback_query(callback_query_id: callback.id)
    end
  end
end

额外提醒:处理回调查询时,一定要调用answer_callback_query,不然用户点击按钮后会一直转圈,体验很差。如果需要多次编辑同一条消息,可以把消息ID存在哈希或者数据库里,避免每次都找不到正确的ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:16:21