- У 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 всей индустрии.
Что реально можно достать публично
У Telegram есть несколько публичных endpoint'ов, которые отвечают без авторизации. Полезные для парсинга:
Через парсинг t.me/s/ ты получаешь:
- Имя канала, описание, аватар, количество подписчиков
- Последние 20-30 сообщений с timestamp'ами
- Упоминания
@другой_канал,t.me/другой_каналв текстах - Forward-источники репостов (если канал репостит других)
- Реакции, view count, время публикации
Важно: публичный web-preview — это не API, это HTML-страница. Парсинг — через обычный HTTP-запрос и BeautifulSoup / lxml. Telegram не ограничивает частоту запросов к этим страницам в явном виде (они cached-friendly), но слишком агрессивный паттерн всё равно триггерит Cloudflare.
Как собирается база в 4.8M+ каналов
У нас в индексе 4.8M+ каналов и групп. Это не куплено и не «взято из секретного источника» — это результат многомесячного snowball crawl по публичному t.me/s. Вот как он работает:
Один канал в среднем содержит 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.
Как достать пользователей из канала
Теперь переходим ко второй части — извлечению конкретных юзеров. Здесь уже нужен 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 активных комментаторов, ты их достанешь.
Как фильтровать «тёплую» аудиторию
Собранная база из 10 000 юзеров — это сырье. Реальная ценность — в отфильтрованных срезах. Telegram отдаёт несколько полезных флагов:
Ключевые фильтры в порядке полезности:
- 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. - Premium flag — имеют значительно более высокий engagement (платят $5/мес за ускорение, реакции, стикеры). Конверсия рассылок на Premium обычно в 3-5× выше, но и репорты от них весят больше в @SpamBot.
- Photo — у юзеров с аватаркой выше реальность. Без фото — часто боты или read-only аккаунты.
- bio keyword — вручную отфильтровать тех, у кого в профиле упомянута твоя ниша («основатель», «CEO», «crypto», «SMM»). Работает только если профиль заполнен — у 50-70% юзеров пустой.
Что недоступно: гео-фильтр по стране, номер телефона, email, биометрические данные. Telegram их просто не отдаёт через API non-админам. Любой сервис, обещающий «фильтр по городу Москва» — либо врёт, либо использует косвенные признаки (lang_code, нишевые каналы), которые дают ~60% точность.
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 «отобранных» лидов — это то, что остаётся после отсева ботов, неактивных и не-таргет.
Легальность и этика
Важный вопрос, который многие обходят. Telegram в Terms of Service прямо запрещает «automated scraping» в большом объёме без разрешения. При этом парсинг публичной информации (то, что любой залогиненный юзер видит) в большинстве юрисдикций легально, пока не нарушает GDPR / privacy laws.
Серые зоны:
- Хранение баз: GDPR требует согласия на обработку ПД. Если в базе есть EU-юзеры — формально нужно их opt-in.
- Использование для outreach: CAN-SPAM / GDPR marketing provisions требуют opt-in или legitimate interest. «Нашёл в чате → рассылаю» — нарушение в EU/US.
- Продажа баз: однозначно запрещена Telegram ToS и обычно privacy законами.
В TG:ON мы не продаём базы — только даём инструмент для парсинга твоей аудитории. Что ты с ней делаешь — твоя ответственность. Мы придерживаемся принципа «tool-neutral»: то же самое касается молотка или Excel.
Что использовать
Для точечных задач (до 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: парсинг, фильтры, экспорт, обновления базы ежедневно. Снимается в один клик, если не пригодилось.
Начать триал