Разбор

Агент мониторит упоминания бренда в Telegram и предупреждает о кризисе до того как он стал кризисом

Негативный пост в канале на 80 000 подписчиков набирает 50 000 просмотров за 2 часа. Ты узнаёшь через день. Решение: Telethon + Python + Claude — алерт в Telegram через 15 минут после публикации, ежедневный дайджест репутации.

• 7 мин чтения

В пятницу вечером администратор паблика на 80 000 подписчиков написал про онлайн-сервис доставки еды. Не жалобу в поддержку — пост с заголовком «Как меня обманул [название]». К субботнему утру — 54 000 просмотров, 320 комментариев, 12 репостов в каналы поменьше. PR-менеджер увидел в воскресенье вечером, когда проверял почту.

48ч
задержка — средний разрыв между публикацией негатива в Telegram и первой реакцией бренда без системы мониторинга

Почему Telegram — особенная среда для репутационных угроз

ВКонтакте и сайты-отзовики можно мониторить через стандартные инструменты. Telegram — другое. Здесь нет публичного поискового API. Яндекс индексирует Telegram-каналы с задержкой в несколько часов, а то и дней. Brand Analytics и YouScan технически могут работать с Telegram, но по факту задержка мониторинга составляет от 1 до 4 часов — этого достаточно, чтобы пост успел разлететься.

Телеграм-аудитория не ждёт. Она делает репосты моментально. Один пост в канале 50к подписчиков через 2 часа превращается в сеть из 15 репостов в каналы помельче — и суммарный охват удваивается без единого нового слова.

Три сценария, которые прилетают без предупреждения:

Жалоба в популярном канале. Блогер или тематический паблик публикует негативный опыт. Первый час критически важен — ответ в комментариях сразу меняет настроение обсуждения. Ответ через 24 часа — просто запись в архиве.

Организованный негатив. Конкуренты или недовольные сотрудники договариваются о волне публикаций. Несколько каналов в один день — это уже кризис.

Фейк или ошибка. Кто-то перепутал компанию, написал фактически неверно, или намеренно исказил факты. Без мониторинга — это живёт своей жизнью.

Скорость распространения негативного поста в Telegram (охват, тыс. просмотров)
Через 15 мин
1–3к
Через 1 час
10–15к
Через 4 часа
30–40к
Через 24 часа
50–80к
Медианная динамика для каналов 30–80к подписчиков. Пик активности — первые 2–4 часа. Ответ до первого часа снижает итоговый негативный охват на 40–60%.

Как работает агент: схема за 60 секунд

📡Telegramканалы и чаты
🐍Telethonподписка, поиск ключевых слов
🤖Claudeклассификация тональности
🚨Алертв личный Telegram

Telethon — Python-библиотека, которая работает с настоящим MTProto API Telegram, а не через Bot API. Это ключевое отличие: она читает сообщения из каналов как обычный пользователь, в реальном времени, без задержки на индексацию.

Схема проста: Telethon слушает новые сообщения в указанных каналах. Каждое новое сообщение проверяется на ключевые слова (название бренда, имена продуктов, CEO, конкурентные запросы). При совпадении текст передаётся Claude для классификации. Claude возвращает уровень угрозы и короткий комментарий. Если уровень выше порога — алерт улетает в личный Telegram.

Что отслеживать: список ключевых слов

Хорошая база мониторинга — 4 категории:

Прямые упоминания: название бренда (все варианты написания: с ошибкой, сокращение, транслит), домен сайта, официальные аккаунты Telegram.

Персоны: имя CEO и топ-менеджеров, которые публично ассоциируются с брендом. Негатив на персону часто предшествует негативу на компанию.

Продукты и сервисы: названия ключевых продуктов, особенно если они уникальны. «[Название] не работает», «[Название] обман» — эти паттерны стоит мониторить отдельно.

Конкуренты (опционально): что пишут о прямых конкурентах. Не для слежки — для понимания контекста рынка и заимствования лучших практик работы с аудиторией.

Классификация кризиса: 4 уровня

УровеньНазваниеПризнакиРеакция
1УпоминаниеНейтральное упоминание, информационный контекст, нет оценкиЛогировать, в дайджест
2КритикаНегативная оценка продукта/сервиса, жалоба, сравнение не в пользуАлерт, оценить необходимость ответа
3УгрозаПризыв к бойкоту, распространение негативного опыта, фейкСрочный алерт, подключить PR
4КризисНесколько каналов одновременно, СМИ подхватили, вирусный охватГромкий алерт, антикризисный план

Уровни 1 и 2 уходят в дайджест. Уровни 3 и 4 — немедленный алерт в Telegram. Пороги можно настроить: для маленького бренда уровень 2 уже повод реагировать, для крупного федерального — только уровни 3-4.

Код агента

🐍 brand_monitor.py — установить: pip install telethon anthropic
import asyncio
import anthropic
import requests
from telethon import TelegramClient, events
from datetime import datetime, timezone

# === Конфигурация ===
# Получить на my.telegram.org → API development tools
TG_API_ID = 12345678
TG_API_HASH = "your_api_hash_here"
TG_SESSION_NAME = "brand_monitor_session"

# Claude API и Telegram Bot для алертов
CLAUDE_API_KEY = "your_claude_key"
ALERT_BOT_TOKEN = "your_bot_token"   # @BotFather
ALERT_CHAT_ID = "your_chat_id"       # куда слать алерты

# Каналы для мониторинга (username без @)
CHANNELS_TO_MONITOR = [
  "durov",              # примеры — замени на реальные
  "techcrunch_ru",
  "vc_ru",
  "roem_ru",
  # ... добавляй нужные
]

# Ключевые слова (в нижнем регистре)
BRAND_KEYWORDS = [
  "мой бренд",          # название компании
  "mybrand",            # транслит/домен
  "имя CEO",            # публичные персоны
  "продукт X",          # названия продуктов
]

# Порог уровня для немедленного алерта (2=критика, 3=угроза, 4=кризис)
ALERT_THRESHOLD = 2

# Дайджест — список всех упоминаний за день
daily_digest = []


def check_keywords(text: str) -> bool:
  """Проверяем наличие ключевых слов в сообщении."""
  text_lower = text.lower()
  return any(kw in text_lower for kw in BRAND_KEYWORDS)


def classify_with_claude(text: str, channel: str) -> dict:
  """Передаём текст в Claude для классификации тональности."""
  client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)

  prompt = f"""Ты PR-аналитик. Оцени репутационный риск для бренда в тексте из Telegram-канала.

Канал: {channel}
Текст сообщения:
---
{text[:2000]}
---

Верни JSON с полями:
- level: число от 1 до 4
1 = упоминание (нейтральное, информационное)
2 = критика (негативная оценка, жалоба)
3 = угроза (призыв к бойкоту, фейк, серьёзный негатив)
4 = кризис (вирусный, массовое распространение, СМИ)
- sentiment: "positive" | "negative" | "neutral"
- summary: краткое описание на русском (1 предложение, максимум 100 символов)
- action: рекомендуемое действие на русском (1 предложение)

Отвечай только JSON, без markdown-обёртки."""

  message = client.messages.create(
      model="claude-sonnet-4-6",
      max_tokens=256,
      messages=[{"role": "user", "content": prompt}]
  )

  import json
  try:
      return json.loads(message.content[0].text)
  except Exception:
      return {"level": 1, "sentiment": "neutral",
              "summary": "Не удалось классифицировать", "action": "Проверить вручную"}


def send_alert(channel: str, text: str, classification: dict, msg_url: str):
  """Отправляем алерт в Telegram."""
  level = classification.get("level", 1)
  icons = {1: "📌", 2: "⚠️", 3: "🔴", 4: "🚨"}
  level_names = {1: "Упоминание", 2: "Критика", 3: "Угроза", 4: "КРИЗИС"}

  icon = icons.get(level, "📌")
  level_name = level_names.get(level, "Упоминание")

  alert_text = (
      f"{icon} <b>Уровень {level}: {level_name}</b>\n"
      f"Канал: <b>{channel}</b>\n"
      f"Оценка: {classification.get('summary', '')}\n"
      f"Действие: {classification.get('action', '')}\n"
      f"\n<a href='{msg_url}'>Открыть сообщение</a>\n"
      f"\n<pre>{text[:300]}{'...' if len(text) > 300 else ''}</pre>"
  )

  requests.post(
      f"https://api.telegram.org/bot{ALERT_BOT_TOKEN}/sendMessage",
      json={
          "chat_id": ALERT_CHAT_ID,
          "text": alert_text,
          "parse_mode": "HTML",
          "disable_web_page_preview": True,
      }
  )


def send_daily_digest():
  """Отправляем дайджест всех упоминаний за день."""
  if not daily_digest:
      return

  today = datetime.now(timezone.utc).strftime("%d.%m.%Y")
  pos = sum(1 for m in daily_digest if m["sentiment"] == "positive")
  neg = sum(1 for m in daily_digest if m["sentiment"] == "negative")
  neu = sum(1 for m in daily_digest if m["sentiment"] == "neutral")

  digest_text = (
      f"📊 <b>Дайджест упоминаний за {today}</b>\n"
      f"Всего: {len(daily_digest)} | "
      f"✅ {pos} позитивных | "
      f"❌ {neg} негативных | "
      f"➖ {neu} нейтральных\n\n"
  )

  for m in daily_digest[-10:]:  # последние 10 для краткости
      icon = "✅" if m["sentiment"] == "positive" else "❌" if m["sentiment"] == "negative" else "➖"
      digest_text += f"{icon} [{m['channel']}] {m['summary']}\n"

  requests.post(
      f"https://api.telegram.org/bot{ALERT_BOT_TOKEN}/sendMessage",
      json={"chat_id": ALERT_CHAT_ID, "text": digest_text, "parse_mode": "HTML"}
  )
  daily_digest.clear()


async def main():
  """Основной цикл мониторинга."""
  client = TelegramClient(TG_SESSION_NAME, TG_API_ID, TG_API_HASH)

  @client.on(events.NewMessage(chats=CHANNELS_TO_MONITOR))
  async def handler(event):
      text = event.message.message
      if not text or not check_keywords(text):
          return

      channel = event.chat.username or str(event.chat_id)
      msg_url = f"https://t.me/{channel}/{event.message.id}"

      print(f"[{datetime.now().strftime('%H:%M:%S')}] Упоминание в @{channel}")

      # Классифицируем через Claude
      classification = classify_with_claude(text, channel)

      # Сохраняем в дайджест
      daily_digest.append({
          "channel": channel,
          "sentiment": classification.get("sentiment", "neutral"),
          "summary": classification.get("summary", ""),
          "url": msg_url,
      })

      # Алерт при угрозе
      if classification.get("level", 1) >= ALERT_THRESHOLD:
          send_alert(channel, text, classification, msg_url)
          print(f"  → Алерт отправлен (уровень {classification.get('level')})")

  await client.start()
  print("Мониторинг запущен. Слушаем каналы...")

  # Дайджест каждые 24 часа (86400 секунд)
  async def digest_loop():
      while True:
          await asyncio.sleep(86400)
          send_daily_digest()

  await asyncio.gather(
      client.run_until_disconnected(),
      digest_loop()
  )


if __name__ == "__main__":
  asyncio.run(main())

Несколько деталей на старте:

При первом запуске Telethon запросит номер телефона и код подтверждения — это стандартная авторизация Telegram. Сессия сохраняется в файл brand_monitor_session.session. После этого скрипт стартует без повторной авторизации.

CHANNELS_TO_MONITOR принимает username-ы без @. Можно добавлять группы и супергруппы — Telethon слушает оба типа одинаково.

Claude API тратит примерно 150–200 токенов на каждую классификацию. При 50 упоминаниях в день — около 10 000 токенов, это меньше 5 рублей в месяц при текущих ценах API.

Как запустить: 4 шага

1
Получить Telegram API ключи

Зайти на my.telegram.org, авторизоваться, выбрать «API development tools», создать приложение. Получить API ID (число) и API Hash (строка 32 символа). Никому не передавать — это как пароль от аккаунта.

my.telegram.org → API development tools
2
Установить зависимости и настроить конфиг

Две библиотеки: telethon для работы с Telegram MTProto, anthropic для Claude API. Вставить все токены в константы скрипта. Собрать список каналов для мониторинга — начать с 20–30 наиболее релевантных.

pip install telethon anthropic requests
3
Первый запуск и авторизация

Запустить скрипт локально. Telethon запросит номер телефона и код из Telegram. После успешной авторизации создастся session-файл. Тест: отправить в один из мониторимых каналов сообщение с ключевым словом (если есть доступ) или подождать естественного упоминания.

python brand_monitor.py
4
Перенести на сервер и настроить автозапуск

Скопировать скрипт и session-файл на VPS. Запустить через systemd или supervisor — чтобы автоматически перезапускался при падении. Проверить через 24 часа что дайджест пришёл. Telegram периодически требует повторную авторизацию — раз в несколько месяцев.

systemctl enable brand-monitor && systemctl start brand-monitor

Реальный кейс: 10 минут против 48 часов

Онлайн-сервис доставки из Москвы настроил агента после того как пропустил крупный негативный пост. История банальная: курьер перепутал адрес, клиент разозлился, написал в канал на 82 000 подписчиков. Пост набрал 61 000 просмотров. Поддержка ответила через двое суток.

После настройки агента тот же сценарий повторился через три месяца. Другой клиент, другой канал (67 000 подписчиков), схожая история. Агент поймал пост через 11 минут после публикации — Claude классифицировал как уровень 3 «Угроза». PR-менеджер получил алерт, позвонил клиенту напрямую, договорился о компенсации. Через 40 минут тот же автор написал апдейт к посту: «Проблему решили, оперативно связались».

Итоговый охват апдейта — 18 000 просмотров. Против 61 000 негатива в первый раз.

Сравнение с Brand Analytics

Brand Analytics
Стоимостьот 15 000 ₽/мес
Задержка Telegram1–4 часа
Каналов в базе40 000+
Исторические данныеесть
Настройка30 мин
ИИ-классификациябазовая
Собственный агент
Стоимость50–200 ₽/мес (API)
Задержка Telegram1–2 минуты
Каналов в базетолько нужные
Исторические данныетолько с момента запуска
Настройка3–4 часа
ИИ-классификацияClaude Sonnet

Brand Analytics оправдывает себя если нужна общая картина по рынку, исторические данные, красивые дашборды для отчётов. Собственный агент — если нужно поймать угрозу раньше всех и реагировать пока конкуренты ещё ждут своих алертов.

Оптимальная схема для среднего бизнеса: собственный агент для мониторинга Telegram в реальном времени + базовый тариф Brand Analytics для аналитики и исторических срезов.

Проверь риски своего бренда

Насколько вы уязвимы для Telegram-кризиса?

4 вопроса — оцените свою репутационную защиту

Вопрос 1 из 4
Ваш бренд упоминают в Telegram-каналах хотя бы несколько раз в неделю?
Вопрос 2 из 4
Как быстро вы узнаёте о негативе в Telegram?
Вопрос 3 из 4
Случались ли у вас ситуации когда негативный пост уже набрал тысячи просмотров до того как вы его заметили?
Вопрос 4 из 4
Есть ли у вас антикризисный план на случай вирусного негатива в Telegram?

Негатив в Telegram не ждёт рабочего времени. Он публикуется в пятницу вечером, в воскресенье утром, в праздники. Агент работает 24/7 и не пропускает посты когда команда на даче.

3–4 часа на настройку против 48 часов задержки обнаружения. Это сделка, которая окупается при первом же нетривиальном посте.

Источники

Источники

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

Как работает мониторинг упоминаний бренда в Telegram через Python?
Скрипт использует библиотеку Telethon для подписки на Telegram-каналы и чаты. При каждом новом сообщении Python проверяет наличие ключевых слов (название бренда, CEO, продукты). Если слово найдено — текст передаётся в Claude API для классификации тональности. При обнаружении угрозы или кризиса агент отправляет алерт в личный Telegram. Раз в сутки формирует дайджест всех упоминаний за день.
Сколько каналов может отслеживать агент одновременно?
Технически Telethon позволяет подписаться на неограниченное число каналов. На практике ограничивает Telegram API: бесплатный аккаунт — до 500 диалогов. Для мониторинга 50–200 каналов одновременно этого более чем достаточно. При масштабировании выше 500 каналов нужен второй аккаунт или Telegram Bot API с channel_post handler.
Чем отличается этот подход от Brand Analytics или YouScan?
Brand Analytics стоит от 15 000 рублей в месяц за базовый тариф, YouScan — дороже. Оба сервиса отслеживают Telegram с задержкой от 30 минут до нескольких часов. Собственный агент: разовая настройка 3–4 часа, расход на Claude API 50–200 рублей в месяц в зависимости от объёма упоминаний. Задержка — 1–2 минуты после публикации. Минус: нет красивых дашбордов и исторических данных.
Какие уровни угрозы различает агент?
Четыре уровня: Упоминание (нейтральное упоминание бренда, информационный фон), Критика (негативная оценка продукта/сервиса, требует внимания), Угроза (организованный негатив, призывы к бойкоту, фейки), Кризис (массовое распространение, несколько каналов одновременно, СМИ подхватили). Алерт приходит начиная с уровня Критика. Уровень Кризис триггерит отдельный громкий алерт.
Нужно ли для работы агента раскрывать логин от Telegram?
Telethon работает от имени обычного Telegram-аккаунта, не бота. Нужны API ID и API Hash — их выдаёт my.telegram.org после регистрации приложения. Номер телефона и пароль вводятся один раз при первом запуске для создания сессии. Сессия сохраняется в файл. На сервере хранится только session-файл, не пароль.
Как быстро можно настроить агента с нуля?
3–4 часа на первый запуск: 30 минут на регистрацию Telegram App и получение API ключей, 1 час на установку зависимостей и настройку конфигурации, 1 час на сбор списка каналов для мониторинга, 1–1.5 часа на тестирование и настройку порогов чувствительности Claude. Поддержка — 15–20 минут в неделю на обновление списка каналов.
Обсуждение

    Пока без комментариев. Будьте первым.

    Войдите, чтобы отправить комментарий

    Вы сможете комментировать статьи, сохранять материалы

    или войдите по email

    Бесплатная диагностика · 30 минут · без обязательств

    Маркетинг работает, но продажи не растут?

    Отвечу на 3–5 вопросов о вашем бизнесе — и мы вместе разберём, где именно теряются клиенты и что с этим делать.

    Без продаж. Без навязчивых звонков.