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

aiogram:发送新消息时如何删除历史机器人消息?

在aiogram中删除用户点击按钮前的问候消息

要实现用户点击Inline按钮后删除之前的问候消息,核心是保存初始问候消息的ID,然后在回调处理中调用删除接口。具体步骤和代码示例如下:

关键步骤

  • 发送初始问候消息时,保存消息对象的message_id和chat_id
  • 在回调函数中,调用bot.delete_message()方法删除旧消息
  • 使用aiogram的user_data存储用户专属的消息ID,避免多用户冲突

完整代码示例

from aiogram import Bot, Dispatcher, types
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils import executor

# 替换为你的Bot Token
API_TOKEN = 'your_bot_token_here'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    # 构建Inline键盘
    keyboard = InlineKeyboardMarkup(row_width=2)
    keyboard.add(
        InlineKeyboardButton("选项1", callback_data='option1'),
        InlineKeyboardButton("选项2", callback_data='option2')
    )
    
    # 发送问候消息并保存消息实例
    welcome_message = await message.answer("你好!请选择一个选项:", reply_markup=keyboard)
    
    # 将消息ID和聊天ID存入用户状态,供后续回调使用
    await dp.current_state(user=message.from_user.id).update_data(
        welcome_msg_id=welcome_message.message_id,
        chat_id=message.chat.id
    )

@dp.callback_query_handler(lambda c: c.data in ['option1', 'option2'])
async def handle_callback(callback_query: types.CallbackQuery):
    # 获取当前用户的状态数据
    state = dp.current_state(user=callback_query.from_user.id)
    user_data = await state.get_data()
    
    # 取出需要删除的消息ID和聊天ID
    welcome_msg_id = user_data.get('welcome_msg_id')
    chat_id = user_data.get('chat_id')
    
    # 删除之前的问候消息
    await bot.delete_message(chat_id=chat_id, message_id=welcome_msg_id)
    
    # 根据用户选择发送新消息
    reply_text = "你选择了选项1,这是为你准备的新消息!" if callback_query.data == 'option1' else "你选择了选项2,这是为你准备的新消息!"
    await bot.send_message(chat_id=chat_id, text=reply_text)
    
    # 必须调用answer()结束回调,否则按钮会一直处于加载状态
    await callback_query.answer()
    
    # 可选:清除用户状态数据,避免占用内存
    await state.finish()

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

注意事项

  • 确保你的Bot拥有delete_messages权限,否则无法执行删除操作
  • 每个用户的消息ID是独立的,必须用user_data或其他用户隔离的存储方式保存,不能用全局变量
  • 若用户在点击按钮前手动删除了问候消息,delete_message会抛出异常,可添加try-except块处理这种情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:54:38