Когда мне присылают «готовую базу 50000 username из ниши X», я обычно сразу спрашиваю: какой процент из них активный за последние 30 дней? Ответ всегда плавающий или его нет. И это первый признак, что выгрузка бесполезная.
В этой статье я расскажу как мы в Sndwich собираем лиды из Telegram, какие фильтры реально отсекают мусор, и почему юзернейм без активности это просто строка из 16 символов, а не лид.
Откуда вообще берутся лиды в Telegram
Источников по сути четыре, и каждый со своей особенностью:
- Чаты под каналами (комментарии). Лучший источник. Если человек написал комментарий, он точно живой, не админ, и тематика канала ему интересна. Минус: сбор медленнее, потому что Telegram отдаёт сообщения партиями.
- Участники открытых групп. Тоже хороший источник, но качество ниже. Многие люди добавлены в группы давно и не активны.
- Список подписчиков канала. Доступен только админам канала через бот-API. Если вы не админ, забудьте.
- Реакции под постами. Это сейчас новый источник. Telegram отдаёт список тех кто поставил реакцию, и это супер тёплая аудитория. Минус: не во всех каналах включено, и парсится медленнее.
Как мы парсим в Sndwich
Технически процесс выглядит так. У вас есть свой воркер-аккаунт Telegram. Через Telethon (это Python библиотека для Telegram MTProto) мы заходим в канал или группу, идём по истории сообщений или по списку участников, и собираем те поля которые нужны для дальнейшей сегментации.
На каждого собранного пользователя получаем:
- tg_user_id (числовой)
- username (может быть пустым)
- first_name / last_name (могут быть пустыми)
- дата последнего сообщения в этом канале
- текст последнего сообщения (для контекста)
- был ли это коммент / репост / реакция
Это сырьё. Дальше его надо отфильтровать, иначе вы заспамите кучу мёртвых акков и получите блокировку за высокий процент отказа.
Фильтры которые реально работают
1. Активность за последние 30 дней
Это главный фильтр. Если пользователь не писал ни одного сообщения за 30 дней в этом канале, шанс что он откроет ваше DM очень низкий. Мы по дефолту срезаем всех у кого last_message_at старше 30 дней.
2. Наличие username
Без username вы не можете быть уверены что напишете именно этому юзеру, без накладок. Telegram позволяет писать по числовому id, но это работает не всегда (юзер может запретить DM от незнакомцев, и без mutual contacts вы упрётесь в стену).
3. Не бот, не админ канала
В выгрузке всегда есть боты. Их видно по флагу is_bot или по тому что в username стоит bot. Также админы канала часто отвечают сами на свои комменты, их желательно вычистить чтобы не писать «Привет, видел твоё мнение» человеку который этот канал и ведёт.
4. Качество комментария
Самый тонкий фильтр. Большинство комментариев в Telegram это «спасибо», «круто», эмодзи, спам. Реально аудитории, которая что-то осмысленное написала, обычно 5-15% от общего объёма. Эти 5-15% и есть ваши warm leads. Можно фильтровать по длине комментария (минимум 30 символов это хорошая отсечка) и по наличию слов из вашей ниши.
5. Язык
Если ваша рассылка на русском, нет смысла писать тем кто комментирует на английском или китайском. Простой language-detector (cld3 / fastext) отсекает не-русских за пару секунд на тысячу сообщений.
Этичная зона: что НЕ собирать
Юридически парсинг публичных каналов это серая зона. Не нелегально (данные открыты), но и не однозначно ОК с точки зрения GDPR. Несколько границ которые я бы не переходил:
- Закрытые/инвайт-only группы. Если вас впустили под видом юзера, а вы парсите участников это уже похоже на breach of trust. Не делайте.
- Полная история сообщений с авторами. Собирайте last_message для контекста, не всю переписку человека. Это уже слишком близко к persistent profile.
- Гео и приватная информация из био. Если человек указал номер телефона в био это не значит что вы можете его использовать. Игнорируйте.
Объёмы и реалистичные цифры
Чтобы у вас было представление, сколько лидов реально выходит из чего:
- Канал с 50к подписчиков, активный, тематика SaaS = ~3000-5000 комментаторов за 90 дней. После всех фильтров остаётся 200-400 годных лидов.
- Группа с 10к участников = ~1500-2500 кто-то писал. После фильтров 100-200.
- Один новостной канал => обычно 2-5% активности от общего размера.
То есть из 50000 «всех подписчиков» вы реально работаете с 300-500. Если кто-то обещает вам 50000 годных лидов из одного канала, он либо не делал реальной рассылки, либо врёт. Скорее второе.
Как Sndwich устроен под капотом
У нас два режима парсинга:
Discovery
Вы вводите ключевые слова на 19 языках, мы ищем релевантные каналы через contacts.Search в Telegram. Возвращается список каналов с метриками: число подписчиков, процент активности (на сэмпле сообщений), язык, наличие комментариев включенных, и т.д. Из этого списка вы выбираете 5-10 интересных и идёте в следующий шаг.
Channel parse
Выбранные каналы парсятся в фоне. Воркер обходит историю сообщений с задержками 30-120 секунд между батчами (Telegram любит человеческий темп), собирает комментаторов с фильтрами что я описал выше, и складывает в вашу базу лидов.
За один день один воркер-акк парсит около 5-10 каналов средней активности. Если вам нужно больше, добавляете ещё воркеров (или используете shared pool, мы это сами автоматизируем).
Что в итоге делать с этими лидами
Парсинг это не цель сам по себе. Цель это запустить drip-рассылку, которая получит ответы. Об этом следующая статья, как составить cold DM в Telegram чтобы получить ответ а не блок.
Если хочется руками не возиться, попробуйте Sndwich. Discovery и channel parse работают в первые 7 дней триала, без карты.