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

如何使用python-telegram-bot更新机器人发送的最后一条消息

解决python-telegram-bot编辑已发送消息的问题

我来帮你搞定这个需求!你之前尝试用bot.editMessageText没成功,核心原因是没保存第一次发送的消息对象——编辑消息需要明确指定要修改哪条消息的ID和所属聊天ID,而你之前没有记录这些关键信息。

下面分两种常见的python-telegram-bot版本给出解决方案:

情况1:使用python-telegram-bot v12及更早的同步版本

这个版本用的是传统同步写法,你需要先保存reply_text返回的Message对象,再用它的chat_idmessage_id来调用editMessageText

import time
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

def echo(bot, update):
    # 保存第一条发送的消息对象
    sent_msg = update.message.reply_text("Sorry, you're on your own, kiddo.")
    # 等待5秒(同步代码里用time.sleep没问题,但会暂时阻塞机器人其他操作)
    time.sleep(5)
    # 编辑这条已发送的消息
    bot.editMessageText(
        chat_id=sent_msg.chat_id,
        message_id=sent_msg.message_id,
        text="Seriously, you're on your own, kiddo."
    )

# 机器人初始化示例代码
def main():
    updater = Updater("你的机器人Token")
    dp = updater.dispatcher
    dp.add_handler(MessageHandler(Filters.text & ~Filters.command, echo))
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

情况2:使用python-telegram-bot v13及以上的异步版本

这个版本全面转向异步架构,注意绝对不能用time.sleep(会阻塞整个事件循环),要改用asyncio.sleep,而且可以直接调用Message对象的edit_text方法,写法更简洁:

import asyncio
from telegram import Update
from telegram.ext import ApplicationBuilder, ContextTypes, MessageHandler, Filters

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    # 发送第一条消息并保存对象
    sent_msg = await update.message.reply_text("Sorry, you're on your own, kiddo.")
    # 异步等待5秒,不会阻塞机器人处理其他请求
    await asyncio.sleep(5)
    # 直接编辑已发送的消息
    await sent_msg.edit_text("Seriously, you're on your own, kiddo.")

# 机器人初始化示例代码
async def main():
    application = ApplicationBuilder().token("你的机器人Token").build()
    echo_handler = MessageHandler(Filters.text & ~Filters.command, echo)
    application.add_handler(echo_handler)
    await application.run_polling()

if __name__ == '__main__':
    asyncio.run(main())

额外注意事项

  • 机器人只能编辑自己发送的消息,在群聊中如果有权限限制,需要确保机器人拥有编辑消息的管理员权限
  • 异步版本中一定要用asyncio.sleep替代time.sleep,否则会导致机器人无法响应其他用户的请求

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

火山引擎 最新活动