Как удалить сообщение в @dp.message_created() в aiogram?
Почему вызов event.message.delete() не удаляет сообщение в @dp.message_created() и как правильно удалить сообщение через Bot.delete_message() в aiogram для пользователей.
Почему вызов await event.message.delete() не удаляет сообщение в обработчике @dp.message_created()? Я пишу бота в Max, изучаю функционал и документацию. В обработчике я прописываю:
@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
- Как правильно удалить сообщение
- Права и ограничения на удаление сообщений
- Полный пример кода
- Частые ошибки и как их избежать
- Заключение
- Источники
Почему delete() не работает в message_created
MessageCreated – это событие, которое срабатывает сразу после того, как Telegram отправил обновление о новом сообщении. В объекте события event.message находится копия сообщения, но нет ссылки на бота (Bot), который его отправил.
Метод Message.delete() в aiogram реализован как обёртка над Bot.delete_message(). Если объект сообщения не знает, к какому боту относится, попытка вызвать delete() будет игнорироваться, и никакой ошибки не возникнет.
В документации aiogram указано: «
Message.delete()работает только если у сообщения есть привязка к экземпляруBot» – ссылка на бот отсутствует в событиях*_created().
Как правильно удалить сообщение
Вы можете удалить сообщение двумя способами:
-
Использовать экземпляр бота, доступный в
Dispatcherpython@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 ) -
Передать бота в
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 эта ошибка может не отображаться, если не обрабатывается исключение.
Полный пример кода
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). Убедитесь, что боту предоставлены необходимые права администратора в чате. Это гарантирует корректное удаление без ошибок.