Программирование

Как удалить сообщение в @dp.message_created() в aiogram?

Почему вызов event.message.delete() не удаляет сообщение в @dp.message_created() и как правильно удалить сообщение через Bot.delete_message() в aiogram для пользователей.

Почему вызов await event.message.delete() не удаляет сообщение в обработчике @dp.message_created()? Я пишу бота в Max, изучаю функционал и документацию. В обработчике я прописываю:

python
@dp.message_created()
async def echo_handler(event: MessageCreated):
    if event.message.body.text:
        await event.message.delete()

Однако сообщение не удаляется и никаких ошибок не выводится. Как правильно удалить сообщение в этом контексте?

Вызов await event.message.delete() в обработчике @dp.message_created() не удаляет сообщение, потому что объект Message, полученный в этом событии, не привязан к экземпляру бота. Чтобы удалить сообщение, необходимо явно использовать bot.delete_message() или передать бота в метод удаления.

Содержание


Почему delete() не работает в message_created

MessageCreated – это событие, которое срабатывает сразу после того, как Telegram отправил обновление о новом сообщении. В объекте события event.message находится копия сообщения, но нет ссылки на бота (Bot), который его отправил.
Метод Message.delete() в aiogram реализован как обёртка над Bot.delete_message(). Если объект сообщения не знает, к какому боту относится, попытка вызвать delete() будет игнорироваться, и никакой ошибки не возникнет.

В документации aiogram указано: «Message.delete() работает только если у сообщения есть привязка к экземпляру Bot» – ссылка на бот отсутствует в событиях *_created().


Как правильно удалить сообщение

Вы можете удалить сообщение двумя способами:

  1. Использовать экземпляр бота, доступный в Dispatcher

    python
    @dp.message_created()
    async def delete_new_message(event: MessageCreated):
        if event.message.body.text:
            await dp.bot.delete_message(
                chat_id=event.message.chat.id,
                message_id=event.message.message_id
            )
    
  2. Передать бота в delete() вручную

    python
    @dp.message_created()
    async def delete_new_message(event: MessageCreated):
        if event.message.body.text:
            await event.message.delete(bot=dp.bot)
    

Оба варианта создадут запрос к API deleteMessage и удалят сообщение, если у бота есть соответствующие права.


Права и ограничения на удаление сообщений

Условие Что нужно
Права администратора Бот должен быть администратором в супергруппе или канале с правом can_delete_messages.
Время Нельзя удалять сообщения старше 48 минут в обычных чатах (Telegram API). В каналах и супергруппах ограничений нет.
Автор сообщения Бот может удалять только сообщения, которые он сам отправил, или любые сообщения в супергруппе/канале, если у него есть права.

Если прав нет, Telegram вернёт ошибку Bad Request: message was deleted, но в обработчике message_created эта ошибка может не отображаться, если не обрабатывается исключение.


Полный пример кода

python
from aiogram import Bot, Dispatcher, types, Router
from aiogram.filters import MessageCreated
from aiogram.types import MessageCreated

API_TOKEN = "YOUR_BOT_TOKEN"

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

@dp.message_created()
async def delete_on_create(event: MessageCreated):
    # Проверяем, что сообщение содержит текст
    if event.message.body.text:
        # Удаляем через экземпляр бота
        await dp.bot.delete_message(
            chat_id=event.message.chat.id,
            message_id=event.message.message_id
        )
        # Либо: await event.message.delete(bot=dp.bot)

if __name__ == "__main__":
    dp.run_polling()

Важно: убедитесь, что бот добавлен в чат как администратор с правом удаления сообщений.


Частые ошибки и как их избежать

Ошибка Причина Как исправить
Сообщение не удаляется, но ошибок нет Message в message_created не привязан к боту Использовать dp.bot.delete_message()
Получаем ошибку Bad Request: message was deleted Бот не имеет права can_delete_messages Добавить бота как администратор с нужными правами
Сообщение удаляется, но появляется двойной запрос Внутри message_created запускается ещё один хэндлер, который тоже пытается удалить Убедитесь, что только один хэндлер обрабатывает удаление
Попытка удалить сообщение в обычной беседе старше 48 минут Ограничение Telegram Переместить сообщение в супергруппу или канал, либо использовать message.delete() в message_handler для сообщений, которые бот сам отправил

Заключение

await event.message.delete() не удаляет сообщение из события message_created, потому что объект сообщения не знает о боте. Чтобы успешно удалить сообщение, используйте dp.bot.delete_message() или передайте бота в event.message.delete(bot=dp.bot). Убедитесь, что боту предоставлены необходимые права администратора в чате. Это гарантирует корректное удаление без ошибок.


Источники

  1. aiogram API – delete_message
  2. aiogram Docs – Event handling
  3. Telegram Bot API – deleteMessage
  4. Telegram Help – Permissions for bots
Авторы
Проверено модерацией
Модерация