← Back to works

TG Leads Parser

Парсер сообщений из групп по ЖК в Санкт-Петербурге с rule-based скорингом для выявления потенциальных покупателей.

PythonTelethonasyncioSQLiteTSV export

Проблема → Решение

Потенциальные покупатели недвижимости часто задают вопросы в чатах жилых комплексов: про ипотеку, планировки, сроки сдачи. Эти сообщения — сигналы о намерении купить. Но чатов много, они шумные, и вручную отслеживать их нереально.

Решение: автоматический сбор сообщений из публичных групп, нормализация данных, rule-based скоринг по признакам намерения и экспорт кандидатов для дальнейшей работы.

Функциональность v1

Сбор сообщений из Telegram-групп
Backfill по окну времени (21 день)
Дедупликация по ключу chat+message_id
Извлечение контекста (reply/thread)
Нормализация дат в UTC
Rule-based скоринг (signal_score)
Категоризация причин (reason_category)
Фильтрация channel posts / ботов
Экспорт в TSV (raw + scored)
Ссылки на оригинальные сообщения

Архитектура пайплайна

Sources (TG groups)Parser / CollectorStorage (DB)Scoring (rules)Export (TSV)Validation→ LLM layer

Parser execution & data pipeline

Консольный запуск парсера: backfill сообщений, дедупликация, первичная фильтрация и подсчёт сигналов.

CLI logs showing parser execution with hot/warm/discarded counts

seen=9801 · hot=89 · warm=359 · discarded=8931

Rule-based lead scoring

Каждое сообщение классифицируется по типу намерения, финансовым триггерам и наличию вопроса. Итог — числовой сигнал для отбора.

Scoring table with status, reason_category, signal_score columns

Ключевые поля данных

Идентификация

tg_chat_id · tg_message_id · message_date_utc · message_link

Источник

chat · jk · source_type · sender_kind · is_channel_post

Скоринг

signal_score · status · reason_category · has_question

Контент

original_text · context_text · reply_to_message_id

Примеры сообщений из групп

Типичные сообщения с признаками намерения: вопросы про ипотеку, условия покупки, рассмотрение вариантов.

Examples of parsed messages from residential complex groups

Manual validation

Сравнение оценки парсера с реальной ценностью лида после проверки нейросетью. Позволяет находить ошибки классификации и улучшать правила.

Validation table comparing parser score vs real lead quality

Выводы: часть «hot» — мусор из-за сарказма/контекста → добавлены фильтры. «Late-stage» (уже купили) → отдельная категория.

Human-in-the-loop interaction

Нейтральное консультативное общение без давления. Парсер используется как фильтр, а не как инструмент спама.

Example of consultative dialog with a lead

Outcome example

Один из кейсов, где ранний сигнал и корректный контакт привели к сделке. Qualitative proof, не гарантия результата.

Outcome: closed deal confirmation

Ограничения v1

Rule-based скоринг ошибается на сарказме, новостях и контексте без reply
Не все чаты публичные — не всегда есть message_link
Не выполняется автоматическое общение (во избежание спама)
Данные обезличиваются для демонстрации

What's next

Подключение LLM-слоя для:

Более точной классификации (lead vs owner/agent vs late vs junk)
Объяснимых причин решения
Генерации черновика сообщения (опционально)

Цель: weekly отчёт для риелтора в один клик.

Key engineering decisions

UTC normalisation

Все timestamps приводятся к UTC для консистентности между источниками

Dedup keys

Уникальность по chat_id + message_id исключает дубли при повторных прогонах

Context extraction

Извлечение reply-цепочек для понимания контекста сообщения