петпроект
February 6

Бот-телеграм: Мемодатор 0.1 #петпроект

интерфейс Мемодатора

Модерация контента для каналов телеграм
группы каналов Медиаимперия Sanya & Partners https://t.me/aaasanya

Общее описание

Решение представляет собой Telegram‑бота, который работает в режиме вебхука и служит для модерации входящего контента. Оно интегрировано с внешними сервисами (например, IFTTT), которые при возникновении событий (например, появлении нового контента с Reddit или из другого источника) отправляют данные в виде JSON на специальный HTTP‑эндпоинт. Бот затем пересылает полученный контент (URL изображения и подпись) в чат модератора, где он сопровождается инлайн‑клавиатурой с двумя кнопками: «✅ Опубликовать» и «❌ Отклонить».


Ключевые компоненты решения

  1. Настройка и конфигурация через переменные окружения: Все критичные параметры (токен бота, публичный URL, пути для вебхуков, идентификаторы чата для модерации и канала публикации, порт) задаются через переменные окружения. Это позволяет легко перенастраивать приложение при развертывании в облачной среде (например, в Yandex Cloud) без изменения исходного кода.
  2. Веб-сервер на базе aiohttp: Решение использует aiohttp для обработки HTTP‑запросов. Создаются отдельные маршруты:
    • /telegram – эндпоинт для получения обновлений от Telegram. При получении данных происходит десериализация JSON в объект Update, который затем передаётся в обработку библиотекой python‑telegram‑bot.
    • /ifttt – эндпоинт для приёма запросов от IFTTT. При его вызове бот извлекает из запроса URL изображения и подпись и инициирует асинхронную задачу (через asyncio.create_task()) для отправки сообщения модератору.
    • / – простой эндпоинт для проверки работы сервера (возвращает сообщение «Server is running.»).
  3. Функциональность модерации:
    • Отправка поста на модерацию:
      Функция send_for_moderation отправляет изображение (по переданному URL) с подписью в чат модератора (ADMIN_CHAT_ID). К сообщению прикрепляется инлайн‑клавиатура с кнопками «✅ Опубликовать» и «❌ Отклонить», где в callback‑данных передаются соответствующие команды.
    • Обработка callback‑запросов:
      Функция moderation_callback обрабатывает нажатия кнопок:
      • При выборе «✅ Опубликовать» бот извлекает file_id фотографии из исходного сообщения и пересылает её в канал (CHANNEL_CHAT_ID) с отключёнными уведомлениями (disable_notification=True). После этого сообщение модерации редактируется (например, меняется подпись на «Пост одобрен и опубликован.»).
      • При выборе «❌ Отклонить» сообщение удаляется из чата модератора с помощью метода удаления сообщений.
  4. Интеграция с Telegram API: При инициализации (функция init_telegram_bot) создаётся Telegram‑приложение с помощью ApplicationBuilder, регистрируются обработчики для команды /start и callback‑запросов, а также устанавливается вебхук, формируемый из PUBLIC_URL и TELEGRAM_WEBHOOK_PATH.
  5. Запуск сервера и управление event loop: Для обеспечения работы в контейнере (например, в Yandex Cloud) сервер запускается через aiohttp, а с помощью модуля nest_asyncio и получения текущего event loop (через asyncio.get_event_loop()) гарантируется, что все асинхронные задачи работают в одном цикле. Это предотвращает ошибки вида «Future attached to a different loop».

Итоговый рабочий сценарий

  1. Получение контента:
    Когда IFTTT отправляет POST‑запрос на эндпоинт /ifttt, бот получает данные (image_url и caption) и вызывает функцию send_for_moderation в виде отдельной задачи.
  2. Модерация:
    Сообщение с изображением и кнопками появляется в чате модератора (ADMIN_CHAT_ID). Модератор нажимает одну из кнопок:
    • Если нажато «✅ Опубликовать», бот пересылает изображение в канал (CHANNEL_CHAT_ID) без подписи и звуковых уведомлений, а сообщение модерации редактируется.
    • Если нажато «❌ Отклонить», бот удаляет сообщение из чата.
  3. Обработка Telegram обновлений:
    Все обновления от Telegram (например, команда /start для теста) поступают на эндпоинт /telegram и обрабатываются соответствующими обработчиками.
  4. Управление сервером:
    Веб-сервер запускается с использованием aiohttp, и всё приложение работает в едином event loop благодаря nest_asyncio, что обеспечивает корректное выполнение асинхронных операций даже при одновременной обработке нескольких запросов.

Это решение позволяет автоматизировать процесс модерации контента в Telegram: контент сначала отправляется на модерацию, администратор принимает решение через интерфейс бота, и в зависимости от выбранного действия пост либо публикуется в канал, либо отклоняется и удаляется из чата. Такое решение легко масштабируется и настраивается через переменные окружения, что удобно для развертывания в облачных сервисах, таких как Yandex Cloud.