Как заставить бота Telegram реагировать на реакции пользователей
Многие администраторы каналов и групп сталкиваются с задачей: бот должен видеть, кто и какую реакцию поставил на пост, и уведомлять об этом. В Telegram API есть специальный апдейт message_reaction, который позволяет получать информацию о реакциях. Разберём, как реализовать это с помощью библиотеки aiogram 3.x на Python.
Почему стандартные обработчики не работают?
Обычные хендлеры на Message или CallbackQuery не ловят события реакций. Для этого нужен отдельный тип апдейта - MessageReactionUpdated. Бот должен иметь права администратора в канале и в группе для обсуждений, а также включённые права на управление публикациями и просмотр сообщений.
Пошаговая настройка бота для отслеживания реакций
1. Получение апдейта реакции
В aiogram 3.x регистрируем хендлер на событие MessageReactionUpdated. Пример кода:
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
bot = Bot(token='YOUR_TOKEN')
dp = Dispatcher()
@dp.message_reaction()
async def handle_reaction(reaction: types.MessageReactionUpdated):
user = reaction.user
chat = reaction.chat
message_id = reaction.message_id
new_reactions = reaction.new_reaction
# new_reaction - список объектов ReactionType
for r in new_reactions:
if r.type == 'emoji':
emoji = r.emoji
await bot.send_message(
chat_id=YOUR_ADMIN_CHAT_ID,
text=f'Пользователь {user.full_name} (@{user.username}) поставил {emoji} на пост {message_id} в чате {chat.title}'
)2. Важные нюансы
- Права бота: бот должен быть администратором и в канале, и в группе обсуждений. Включите права: «Управлять публикациями», «Удалять сообщения», «Просматривать сообщения».
- Апдейты: убедитесь, что в
Dispatcherне отключены типы апдейтов. По умолчанию все включены, но если вы используетеskip_updates=Trueили фильтруете апдейты, проверьте, чтоmessage_reactionне заблокирован. - User ID: в объекте
reaction.userесть поляid,username,first_name,last_name. Вы можете сохранять ID пользователя для последующих действий.
3. Если реакция стоит в канале, а не в группе обсуждений
Апдейт message_reaction приходит как на канал, так и на группу, если бот является администратором. В поле reaction.chat будет указан тип чата (канал или супергруппа). Вы можете фильтровать:
if chat.type == 'channel':
# реакция на пост в канале
elif chat.type == 'supergroup':
# реакция на сообщение в группе обсужденийРаспространённые ошибки и их решение
Бот не получает апдейты реакций
Проверьте, что бот добавлен в канал и группу как администратор. Также убедитесь, что в коде используется @dp.message_reaction(), а не @dp.message(). Если используете long-polling, перезапустите бота.
Не отображается username пользователя
Если у пользователя скрыт username, поле user.username будет None. В таком случае используйте user.first_name и user.last_name, либо user.id.
Реакции приходят только от администраторов
Это неверно - бот получает реакции от любого пользователя, если у него есть права на просмотр сообщений. Ограничения могут быть только на уровне приватности канала.
Заключение
Отслеживание реакций в Telegram - стандартная возможность API, доступная через апдейт message_reaction. Используя aiogram 3.x, вы легко реализуете уведомления о реакциях с полной информацией о пользователе. Главное - правильно настроить права бота и не забыть зарегистрировать хендлер на нужный тип события.