⎯ TL;DR
  • У Telegram есть публичный web-preview t.me/s/<channel>, доступный без авторизации — индексируется поисковиками.
  • Через официальный MTProto API с юзер-сессией можно получать участников обсуждений, авторов комментариев, реагировавших пользователей.
  • Snowball crawl: стартуешь с известного канала → собираешь @упоминания в постах → рекурсивно расширяешь граф.
  • Фильтры: last_online (recent / week / month), Premium badge, language, photo presence. Гео обычно недоступно.
  • Realistic throughput: 50-200 каналов/час с одной юзер-сессии при соблюдении flood-лимитов.

Термин «парсинг аудитории» в контексте Telegram покрывает два разных процесса, которые часто путают. Первый — индексация каналов и групп как сущностей (имя, описание, количество подписчиков, категория). Второй — извлечение конкретных пользователей из этих каналов (username, ID, online status, premium flag).

Первое — полностью публично: любой канал с «публичной ссылкой» можно посмотреть без авторизации через web-preview t.me/s/<channel_name>. Эта страница рендерит последние сообщения, и Google её индексирует.

Второе — сложнее. Список участников канала через официальный API получают только админы канала. Но список участников обсуждений (discussion group, привязанная к каналу) доступен любому залогиненному юзеру. Именно этот механизм лежит в основе mass-parsing всей индустрии.

01 · Public endpoints

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

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

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

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

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

02 · Snowball crawl

Как собирается база в 4.8M+ каналов

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

def snowball_crawl(seed_channels, max_depth=3): visited = set() queue = deque(seed_channels) 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, category 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-каналов, через 3 дня у тебя 100K, через 2 недели — 2M.

Ключевые нюансы, которые определяют качество crawl'а:

1. Seed selection

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

2. Deduplication и merging

Канал может быть упомянут в 50 разных форматах: @channel, t.me/channel, https://t.me/channel, channel в discussion. Нужна нормализация — всё к lowercase username'у. Плюс channel может переименоваться — ведём алиасы.

3. Classification

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

03 · User extraction

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

Теперь переходим ко второй части — извлечению конкретных юзеров. Здесь уже нужен authenticated MTProto client. Работают через Telethon, Pyrogram или TDLib.

Три источника пользователей:

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

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

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

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

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

Собранная база из 10 000 юзеров — это сырье. Реальная ценность — в отфильтрованных срезах. Telegram отдаёт несколько полезных флагов:

конверсия · Premium
vs обычные юзеры
online
last_seen ranges
recent / week / month / long_ago
~180
language codes
lang_code из user.settings
bio
keyword match
фильтр по тексту в профиле

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

  1. last_seen — Telegram возвращает грубые диапазоны: user_status_online, user_status_recently (был в последние 2-3 дня), user_status_last_week, user_status_last_month, user_status_long_ago. Для outreach нужны online + recently — это юзеры, которые вообще читают Telegram.
  2. Premium flag — имеют значительно более высокий engagement (плат­ят $5/мес за ускорение, реакции, стикеры). Конверсия рассылок на Premium обычно в 3-5× выше, но и репорты от них весят больше в @SpamBot.
  3. Photo — у юзеров с аватаркой выше реальность. Без фото — часто боты или read-only аккаунты.
  4. bio keyword — вручную отфильтровать тех, у кого в профиле упомянута твоя ниша («основатель», «CEO», «crypto», «SMM»). Работает только если профиль заполнен — у 50-70% юзеров пустой.

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

05 · Scale

Throughput: сколько реально собирать в час

Теоретический максимум ограничен flood-лимитами Telegram на вызовы API. Практически:

Операция Limit Throughput (с 1 сессии)
GetParticipants (chunk 200) ~30 вызовов/мин ~6 000 юзеров/мин = 360K/час
GetFullChannel (описание, sub count) ~50/мин ~3 000 каналов/час
Web-preview t.me/s ~60/мин (HTTP, не API) ~3 600 каналов/час
GetMessageReactionsList ~30/мин ~600 реакций/мин = 36K/час

Реалистичный сценарий: с 10 параллельных сессий (на 10 аккаунтов) и смешанного использования — 50 000 - 200 000 новых юзеров в ночь с правильной фильтрацией (не сырые 300K). Именно такая цифра в заголовке баннера — 10 000 «отобранных» лидов — это то, что остаётся после отсева ботов, неактивных и не-таргет.

«10 000 лидов за ночь — это не магия. Это 10 часов scrape с 5 аккаунтов + 3 уровня фильтров.»
06 · Legal

Легальность и этика

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

Серые зоны:

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

07 · Solutions

Что использовать

Для точечных задач (до 10K юзеров)

Telethon / Pyrogram + один аккаунт. 30-50 строк кода, работает из коробки. Время разработки: 1-2 часа, если ты Python-dev.

Для серьёзного объёма (100K+ юзеров/нед)

Нужен stack: распределённая очередь задач (Celery/Redis), ротация юзер-сессий (10-30 аккаунтов), резидентные IP, deduplication + storage (Postgres с индексами), classification pipeline (категории ниш), snowball scheduler. Стоимость разработки: 80-150 часов + $200-500/мес ongoing.

Готовое решение

TG:ON Pro ($89/мес) — индекс 4.8M+ каналов с авто-классификацией + фильтры + экспорт в CSV/XLSX/JSON. Новые каналы добавляются ежедневно через snowball. Для парсинга участников — встроенный worker с правильными limit'ами и ротацией.

⎯ скачать

TG:ON для macOS · Windows · Linux

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

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

База 4.8M+ · 3 дня бесплатно.
Без карты.

Pro-tier: парсинг, фильтры, экспорт, обновления базы ежедневно. Снимается в один клик, если не пригодилось.

Начать триал