Mini-app для модерации комментариев в MAX через Telegram-бот: гайд 2026

Mini-app под MAX-постом + спам-фильтр L1-L5 + AI-черновики ответов в стиле бренда. На рынке конкурентов с AI нет — у PMX, PostX и @ze-post всё бесплатно но без ML.

Если вы вели MAX-канал с активной аудиторией, вы знаете о чём я. Под каждым постом пять-двадцать комментариев. Из них половина — реклама ботов, четверть — токсичные ветки, четверть — реальные вопросы подписчиков на которые надо отвечать.

В нативной админке MAX модерация устроена простенько: заходишь в канал, скроллишь до поста, тапаешь свайпом по комменту, удаляешь. Следующий комментарий. Свайп. Удалить. Следующий пост. Скролл. Свайп. Удалить.

На канале с двадцатью постами в день и средним десятью комментариями на пост это 200 комментариев. Через нативку — час-полтора в день. Каждый день. Без выходных. Это пиздец.

Большинство авторов через два месяца перестают модерировать. Под постами скапливается мусор, реальные подписчики не пишут потому что атмосфера токсичная, канал умирает не от плохого контента, а от неухоженных комментариев. Я видел это много раз.

Что мы строим

Фича в работе на ветке feat/max-comments. План v2 после трёх параллельных ревью (engineering + security + design) — на 14-18 рабочих дней. Этап 0 (сбор статистики через MAX API body.reply_to.mid) уже на проде в апреле, чтобы понять есть ли вообще активность в комментах у юзеров. Сейчас доделываются Дни 4-5 — спам-пайплайн.

На рынке: PMX, PostX, @ze-post — все бесплатные, без спам-ML и без AI-черновиков. Это хорошо как baseline. Наш USP — multi-tier спам-фильтр + AI-черновики ответов в стиле бренда через StyleExtractor.

Спам-пайплайн L1-L5 (а не три как у конкурентов)

Пять уровней. Первые три — синхронно за <50 миллисекунд, последние два — асинхронно через Dramatiq.

L1 — Rate-limit на Valkey. Если один аккаунт пишет 30 комментов за минуту — это бот. Скрывается без участия админа. Бесплатно.

L2 — Regex. Чёрный список слов, регулярки на мусорные ссылки, типовые рекламные паттерны. Тоже синхронно, бесплатно.

L3 — TrustScore на Valkey. История юзера: сколько он раньше писал, как часто его банили, реакции на его комменты. Если score высокий — пропускаем сразу. Если низкий — катим в L4.

После L1+L2+L3 коммент уходит в одно из трёх состояний: visible (если score < 30 — точно не спам), spam (если score ≥ 70 — точно спам, авто-скрытие), или pending_review (всё остальное). В последнем случае — оптимистично показываем пользователю «На модерации» через SSE, и катим в async-этапы.

L4 — LLM Haiku, 300-800ms асинхронно. Claude Haiku 4.5 читает контекст оригинального поста и текст коммента, корректирует score. Стоит копейки — это маленькая модель.

L5 — Qdrant match, 200-400ms. Только если score после L4 в зоне 25-50 (пограничный). Эмбеддинг коммента сравнивается с коллекцией spam_corpus в Qdrant. Если близок к известному спаму — поднимаем score, если близок к известным «полезным» — опускаем.

Финальное решение записывается в БД, статус коммента обновляется через UPDATE, SSE отправляет клиенту реальный статус. Mini-app у юзера обновляется в реальном времени без перезагрузки.

Webhook MAX и идемпотентность

Когда кто-то пишет под вашим постом, MAX отправляет webhook. Проблема — MAX иногда дублирует events при сетевых сбоях. Если это пропустить, один комментарий получит два уведомления, две AI-генерации, два решения.

Решение — таблица max_webhook_events как outbox. INSERT туда идемпотентный (UNIQUE constraint на event_id). Дубль event ловится на этом уровне, не доходит до пайплайна.

Дальше Dramatiq actor подхватывает event и катит через L1-L5.

Безопасность — важная часть, не маркетинг

В дизайне сразу думали про threat model по STRIDE. Шесть угроз и митигации:

  • Spoofing — юзер шлёт чужой user_id в JSON mini-app. Митигация: HMAC-verify initData + auth_date TTL 15 минут. Без верификации mini-app просто не отвечает.
  • Tampering / XSS — кто-то пишет <script> в комменте. Митигация: bleach allowlist на сервере + CSP в response headers + sanitize на render. Три уровня защиты, в любой одной протечь не страшно.
  • Repudiation — админ удалил коммент, потом отрицает. Митигация: append-only audit_log с actor_id. Что админ сделал, того не отменить.
  • Info disclosure — юзер пытается читать чужие hidden-комменты через API. Митигация: RBAC проверка comment.channel.owner_id == user.id на каждом запросе.
  • DoS — кто-то налил в канал 500 комментов за 10 минут или ddos на webhook-endpoint. Митигация: async Dramatiq + rate-limit per-IP и per-channel. Backend не валится.
  • Elevation — обычный юзер пытается эскалировать роли. Митигация: авторизация на каждом admin-endpoint, без shortcut'ов.

Cross-DB разграничение

Это важный архитектурный момент о котором обычно никто не говорит. У нас две БД: content_pilot (пользователи, статьи, комментарии, реакции) и llm_services (кэш эмбеддингов, версии моделей). Спам-корпус в общем Qdrant.

Правило: llm-services не делает SELECT FROM publication_comments. Только HTTP-payload с текстом и метаданными. Это нужно чтобы инфраструктурно невозможно было утечь данные комментариев в LLM-инфру. Если в будущем мы LLM-инфру вынесем в Cloud (например, для масштаба), комментарии останутся в нашей БД.

AI-черновики ответов

Вторая фича на которую мы делаем ставку. Когда коммент прошёл фильтр и попал в категорию «вопрос», админу в TG-бот приходит inline-кнопка «Ответить AI».

Тапнули — Content Pilot читает оригинальный пост, читает StyleExtractor-профиль канала, генерирует ответ Claude Haiku в голосе автора. Показывает админу до отправки. Тапнули «Отправить» — улетает в MAX.

Это не «AI-автоответы без участия админа» (это в OUT MVP — на потом). Сейчас черновик с подтверждением. 30 секунд на коммент, не часы.

152-ФЗ compliance

Хранилище комментариев и реакций — наша ответственность. Юзер MAX оставляет в нашем продукте свои тексты. По закону — нужно consent, retention policy, право на удаление по запросу.

В дизайне:

  • Consent при первом действии в mini-app — пользователь подписывает что согласен на обработку
  • Retention — комменты живут 90 дней по умолчанию (настраивается на канал)
  • Право на удаление — endpoint для запроса удаления своих комментариев, обрабатывается за 30 дней

Это скучные части но без них сервис нельзя продавать клиентам которым важно соответствие.

Что НЕ в MVP

Намеренно out-of-scope:

  • AI-автоответы без участия админа (Pro-фича, потом)
  • FAQ-движок
  • Sentiment classifier с бейджами
  • Кастомные эмодзи реакций (берём 6 фиксированных: 👍 ❤️ 🔥 😂 😢 😡)
  • Брендинг и темы mini-app
  • AI-summary треда (Variant C — Pro-фича)

Треды поддерживаются только в один уровень. Pin/Unpin есть. SSE-стрим для real-time.

Запуск

Подключение когда фича выйдет — бот в админах MAX-канала с правом «управлять комментариями», в настройках Content Pilot переключатель «Модерация комментариев». Webhook автоматически подписывается, первые комменты под новыми постами начинают приходить в TG-бот в течение часа.

Технические детали интеграции в отдельном материале про webhook MAX. Если интересен мульти-каналовый сценарий — дашборд для нескольких каналов. Чтобы AI-черновики звучали в вашем голосе — StyleExtractor.

Похожие статьи