⎯ TL;DR
  • Парсер Telegram = две разные задачи: индексация чатов/каналов как сущностей и извлечение конкретных пользователей.
  • Публичный web-preview t.me/s/<name> доступен без авторизации и индексируется поисковиками.
  • Участников обсуждений (discussion group) достаёт любой залогиненный юзер через MTProto — это основной механизм парсинга людей.
  • Snowball: от seed-каналов → по @упоминаниям рекурсивно строится граф на миллионы сущностей.
  • Фильтры: last_seen (online / recently), Premium, lang_code, наличие фото. Гео и телефон — недоступны.
  • В TG:ON это база 2,9 млн+ чатов и каналов (Vault) + парсер участников Scan My Telegram. Триал 3 дня / 100 сообщений, без карты.

«Парсер Telegram» — запрос, под которым люди подразумевают совершенно разные вещи. Чтобы выбрать инструмент и не потратить недели на нерабочий путь, сначала надо развести два процесса, которые регулярно путают. Первый — индексация чатов и каналов как сущностей: имя, описание, число подписчиков, ниша. Второй — извлечение конкретных пользователей: username, ID, online-статус, premium-флаг.

Первое — публично. Любой чат или канал с публичной ссылкой открывается без авторизации через web-preview t.me/s/<username>: страница рендерит последние сообщения, и её индексирует Google. Второе — сложнее и упирается в ограничения API. Дальше разберём оба слоя по порядку: что доступно бесплатно, что требует юзер-сессии, как масштабируется и где проходит граница ToS.

Для outreach нужны чаты, а не каналы. В канал (broadcast) пишет только админ — спарсить его подписчиков как user нельзя. А вот группа / чат (в т.ч. discussion group под каналом) позволяет видеть участников и писать им. Поэтому при сборе аудитории целевая сущность — именно group/chat, а не channel.

01 · Public endpoints

Что реально можно достать публично

У Telegram есть несколько публичных endpoint'ов, которые отвечают без авторизации. Полезные для парсера:

# Public web-preview чата/канала (HTML + OpenGraph meta) GET https://t.me/s/chat_name ↳ HTML с последними ~20 сообщениями, подписчиками, pinned # Статический preview отдельного сообщения GET https://t.me/chat_name/12345?embed=1 ↳ iframe-ready страница с одним сообщением + автором # OpenGraph метаданные сущности GET https://t.me/chat_name ↳ <meta og:title>, <meta og:description>, <meta og:image>

Через парсинг t.me/s/ ты получаешь:

Важно: публичный web-preview — это не API, это HTML-страница. Парсер берёт её обычным HTTP-запросом и разбирает через BeautifulSoup / lxml. Явного rate-лимита здесь нет (страницы cached-friendly), но агрессивный паттерн всё равно триггерит Cloudflare.

02 · Snowball crawl

Как собирается база в 2,9 млн+ чатов и каналов

У нас в индексе 2,9 млн+ чатов и каналов. Это не куплено и не «взято из секретного источника» — результат многомесячного snowball crawl по публичному t.me/s. Логика:

def snowball_crawl(seeds, max_depth=3): visited = set() queue = deque(seeds) while queue: ch = queue.popleft() if ch in visited: continue visited.add(ch) html = fetch(f"https://t.me/s/{ch}") meta = extract_meta(html) # name, subs, desc, type mentions = extract_mentions(html) # @xxx, t.me/yyy db.save(ch, meta) for m in mentions: if m not in visited: queue.append(m) sleep(rand(0.5, 2.0)) # rate limit

Одна сущность в среднем содержит 5-15 упоминаний других чатов и каналов (коллаборации, форварды, рекомендации). С коэффициентом разветвления ~10 граф растёт экспоненциально: 100 seed-каналов → 100K за дни → миллионы за недели. Подробнее о механике мы разбирали в статье «Парсинг 10 000 лидов за ночь».

Три нюанса определяют качество crawl'а:

1. Seed selection

От стартового списка зависит качество графа. Хорошие seed'ы — крупные нишевые чаты с активной аудиторией. Плохие — «сборные паблики» с упоминаниями всего подряд. Мы стартовали с ~200 seed'ов по 20 вертикалям (крипта, арбитраж, edtech, e-com, SMM, B2B и т.д.).

2. Deduplication и тип сущности

Один объект упоминается в 50 форматах: @chat, t.me/chat, https://t.me/chat. Нужна нормализация — всё к lowercase username'у, плюс алиасы на случай переименований. Отдельно фиксируем тип: channel (broadcast) или group/chat — это критично для последующего outreach.

3. Classification

Нишу определяем по описанию + последним 50 сообщениям через keyword-matching и LLM-классификатор. ~30 категорий (финансы, крипта, e-com, edtech, ...) + подкатегории. Это даёт точные фильтры на этапе подбора аудитории.

03 · User extraction

Как достать пользователей из чата

Вторая часть — извлечение конкретных юзеров. Здесь уже нужен authenticated MTProto-client: Telethon, Pyrogram или TDLib. Telegram — это не бот-надстройка, а полноценный MTProto-протокол; почему для автоматизации нужен именно native-клиент, мы разбирали в «Автоматизируй Telegram: почему нужен native-клиент».

Источники пользователей и их доступность:

Источник Доступ Что получаешь
Discussion / group Любой залогиненный юзер, если чат публичный ID, username, имя, Premium, last_seen, bio
Авторы комментариев Публично (видны и в web-preview) username, имя, иногда аватар
Реагировавшие (GetMessageReactionsList) Залогиненный юзер ID, username, имя, реакция, timestamp
Просмотревшие сторис Только автор сторис — (не для внешних)
Подписчики канала Только админы канала — (не для внешних)

В 2024 Telegram ужесточил доступ: теперь channels.GetParticipants для non-admin возвращает только первые ~200 участников — именно поэтому «выкачать подписчиков» публичного канала больше не работает как в 2022.

Но channels.GetParticipants для связанной discussion group (если она публичная) всё ещё отдаёт полный список — это лазейка, которой пользуется вся индустрия. Если у канала есть обсуждение с 10 000 активных комментаторов, ты их достанешь. Поэтому ещё раз: при сборе аудитории целишься в чаты, не в каналы.

«Если в чате есть 10 000 комментаторов — это 10 000 реально активных пользователей. Лучшая база в нише, которую ты можешь найти.» ⎯ методичка crawl-команды
04 · Filters

Как фильтровать «тёплую» аудиторию

Сырые 10 000 юзеров — это материал, а не результат. Ценность — в отфильтрованных срезах. Telegram отдаёт несколько полезных флагов:

premium
высокий engagement
платят за реакции/стикеры
online
last_seen ranges
recent / week / month / long_ago
~180
language codes
lang_code из user.settings
bio
keyword match
фильтр по тексту в профиле

Ключевые фильтры в порядке полезности:

  1. last_seen — Telegram возвращает грубые диапазоны: online, recently (последние 2-3 дня), last_week, last_month, long_ago. Для outreach нужны online + recently — те, кто вообще читает Telegram.
  2. Premium flag — выше вовлечённость, но и репорты от premium-юзеров весят больше в @SpamBot. Как именно @SpamBot реагирует на сигналы — см. «SpamBot: 6 сигналов под капотом».
  3. Photo — у юзеров с аватаркой выше «реальность»; без фото — часто боты или read-only аккаунты.
  4. bio keyword — отсев по словам в профиле («founder», «CEO», «crypto», «SMM»). Работает только если профиль заполнен — а он пуст у 50-70%.

Что недоступно: гео-фильтр по стране, номер телефона, email, биометрия. Telegram их просто не отдаёт через API non-админам. Любой «парсер с фильтром по городу Москва» — либо врёт, либо использует косвенные признаки (lang_code, нишевые чаты) с точностью ~60%.

05 · Legal

Легальность и ToS

Вопрос, который многие обходят. Telegram в Terms of Service прямо запрещает «automated scraping» в большом объёме без разрешения. При этом парсинг публичной информации — того, что любой залогиненный юзер видит сам — в большинстве юрисдикций легален, пока не нарушает GDPR / privacy-законы.

Серые зоны:

В TG:ON мы не продаём базы — даём инструмент для парсинга твоей аудитории. Что ты с ней делаешь — твоя ответственность. Принцип «tool-neutral»: то же касается молотка или Excel.

06 · TG:ON

Как это устроено в TG:ON

TG:ON — десктоп-приложение для Windows и macOS, работает local-first: твои аккаунты и ключи остаются на твоей машине. Парсер здесь это два связанных модуля.

Vault — индекс 2,9 млн+ чатов и каналов

Готовая база сущностей с авто-классификацией по нишам и фильтрами. Ищешь нужную вертикаль, отбираешь чаты (где можно писать как user), экспортируешь. База пополняется ежедневно через snowball — не нужно поднимать свой crawler, очередь задач, ротацию сессий и storage с нуля.

Scan My Telegram — парсер участников

Встроенный MTProto-worker, который достаёт участников обсуждений, авторов комментариев и реагировавших с правильными flood-лимитами и ротацией сессий. На выходе — отфильтрованный по online / premium / lang срез, готовый для следующего шага.

Дальше аудитория идёт в смежные модули: массовая авторассылка (spintax + медиа), автоинвайт, ИИ-редактор сообщений и ИИ-агенты (Qualifier / Closer на любом LLM, ключи хранятся локально), автоответчик. Зачем держать всё это в одном app, а не в зоопарке скриптов — разбор в «Софт для рассылки: один app, пять функций». И помни про прогрев и сигналы @SpamBot — парсинг это только первый шаг, дальше всё решает аккуратность рассылки.

Тариф Цена Кому
Starter $49 / мес первые кампании, один-два аккаунта
Pro $89 / мес регулярный парсинг + рассылки
Agency $169 / мес агентства, объём, несколько проектов
⎯ скачать

TG:ON для Windows · macOS

Desktop-приложение. Работает локально, твои ключи остаются у тебя. Триал 3 дня / 100 сообщений, без карты.

Скачать бесплатно
⎯ попробовать

База 2,9 млн+ · парсер · фильтры.
3 дня бесплатно, без карты.

Vault + Scan My Telegram + фильтры online / premium / lang. Триал 3 дня / 100 сообщений. Вопросы — в @tgon_support_bot.

Начать триал