如何使用python-telegram-bot更新机器人发送的最后一条消息
解决python-telegram-bot编辑已发送消息的问题
我来帮你搞定这个需求!你之前尝试用bot.editMessageText没成功,核心原因是没保存第一次发送的消息对象——编辑消息需要明确指定要修改哪条消息的ID和所属聊天ID,而你之前没有记录这些关键信息。
下面分两种常见的python-telegram-bot版本给出解决方案:
情况1:使用python-telegram-bot v12及更早的同步版本
这个版本用的是传统同步写法,你需要先保存reply_text返回的Message对象,再用它的chat_id和message_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




