Бот-телеграм: Мемодатор 0.1 #петпроект
Модерация контента для каналов телеграм
группы каналов Медиаимперия Sanya & Partners https://t.me/aaasanya
- Мемодатор https://t.me/lollelmemes
- Фазодатор https://t.me/afazanov
- Бургодатор https://t.me/burger2
Решение представляет собой Telegram‑бота, который работает в режиме вебхука и служит для модерации входящего контента. Оно интегрировано с внешними сервисами (например, IFTTT), которые при возникновении событий (например, появлении нового контента с Reddit или из другого источника) отправляют данные в виде JSON на специальный HTTP‑эндпоинт. Бот затем пересылает полученный контент (URL изображения и подпись) в чат модератора, где он сопровождается инлайн‑клавиатурой с двумя кнопками: «✅ Опубликовать» и «❌ Отклонить».
Ключевые компоненты решения
- Настройка и конфигурация через переменные окружения: Все критичные параметры (токен бота, публичный URL, пути для вебхуков, идентификаторы чата для модерации и канала публикации, порт) задаются через переменные окружения. Это позволяет легко перенастраивать приложение при развертывании в облачной среде (например, в Yandex Cloud) без изменения исходного кода.
- Веб-сервер на базе aiohttp: Решение использует aiohttp для обработки HTTP‑запросов. Создаются отдельные маршруты:
/telegram
– эндпоинт для получения обновлений от Telegram. При получении данных происходит десериализация JSON в объект Update, который затем передаётся в обработку библиотекой python‑telegram‑bot./ifttt
– эндпоинт для приёма запросов от IFTTT. При его вызове бот извлекает из запроса URL изображения и подпись и инициирует асинхронную задачу (черезasyncio.create_task()
) для отправки сообщения модератору./
– простой эндпоинт для проверки работы сервера (возвращает сообщение «Server is running.»).- Функциональность модерации:
- Отправка поста на модерацию:
Функцияsend_for_moderation
отправляет изображение (по переданному URL) с подписью в чат модератора (ADMIN_CHAT_ID). К сообщению прикрепляется инлайн‑клавиатура с кнопками «✅ Опубликовать» и «❌ Отклонить», где в callback‑данных передаются соответствующие команды. - Обработка callback‑запросов:
Функцияmoderation_callback
обрабатывает нажатия кнопок: - При выборе «✅ Опубликовать» бот извлекает file_id фотографии из исходного сообщения и пересылает её в канал (CHANNEL_CHAT_ID) с отключёнными уведомлениями (disable_notification=True). После этого сообщение модерации редактируется (например, меняется подпись на «Пост одобрен и опубликован.»).
- При выборе «❌ Отклонить» сообщение удаляется из чата модератора с помощью метода удаления сообщений.
- Интеграция с Telegram API: При инициализации (функция
init_telegram_bot
) создаётся Telegram‑приложение с помощью ApplicationBuilder, регистрируются обработчики для команды/start
и callback‑запросов, а также устанавливается вебхук, формируемый из PUBLIC_URL и TELEGRAM_WEBHOOK_PATH. - Запуск сервера и управление event loop: Для обеспечения работы в контейнере (например, в Yandex Cloud) сервер запускается через aiohttp, а с помощью модуля nest_asyncio и получения текущего event loop (через asyncio.get_event_loop()) гарантируется, что все асинхронные задачи работают в одном цикле. Это предотвращает ошибки вида «Future attached to a different loop».
Итоговый рабочий сценарий
- Получение контента:
Когда IFTTT отправляет POST‑запрос на эндпоинт/ifttt
, бот получает данные (image_url и caption) и вызывает функциюsend_for_moderation
в виде отдельной задачи. - Модерация:
Сообщение с изображением и кнопками появляется в чате модератора (ADMIN_CHAT_ID). Модератор нажимает одну из кнопок: - Если нажато «✅ Опубликовать», бот пересылает изображение в канал (CHANNEL_CHAT_ID) без подписи и звуковых уведомлений, а сообщение модерации редактируется.
- Если нажато «❌ Отклонить», бот удаляет сообщение из чата.
- Обработка Telegram обновлений:
Все обновления от Telegram (например, команда/start
для теста) поступают на эндпоинт/telegram
и обрабатываются соответствующими обработчиками. - Управление сервером:
Веб-сервер запускается с использованием aiohttp, и всё приложение работает в едином event loop благодаря nest_asyncio, что обеспечивает корректное выполнение асинхронных операций даже при одновременной обработке нескольких запросов.
Это решение позволяет автоматизировать процесс модерации контента в Telegram: контент сначала отправляется на модерацию, администратор принимает решение через интерфейс бота, и в зависимости от выбранного действия пост либо публикуется в канал, либо отклоняется и удаляется из чата. Такое решение легко масштабируется и настраивается через переменные окружения, что удобно для развертывания в облачных сервисах, таких как Yandex Cloud.