Как заставить бота 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, вы легко реализуете уведомления о реакциях с полной информацией о пользователе. Главное - правильно настроить права бота и не забыть зарегистрировать хендлер на нужный тип события.

    Часто задаваемые вопросы