Fragment Radar: мониторинг Telegram Collectibles
Кейс · Fragment · Telegram Collectibles · Laravel · 2026
В микросервис GRAM добавлен Fragment Radar — read-only контур наблюдения за Telegram usernames и анонимными номерами +888. Он собирает публичные данные Fragment, классифицирует активы, сохраняет историю аукционов и помогает быстро находить интересные лоты по прозрачному Radar Score.
Коротко: Fragment Radar превращает просмотр маркетплейса в воспроизводимый исследовательский процесс. Вместо ручного перебора страниц — единая база, фильтры, история изменений, признаки паттернов и объяснимый рейтинг от 0 до 100.
Зачем понадобился отдельный Radar
На Fragment одновременно появляются новые usernames и номера, меняются цены, ставки и сроки аукционов. Интерфейс маркетплейса хорошо подходит для отдельной покупки, но не отвечает на исследовательские вопросы: какие паттерны встречаются чаще, как меняется цена, что появилось за сутки и какие аукционы скоро закончатся.
Поэтому в GRAM появился отдельный аналитический слой. Он регулярно читает открытые страницы, нормализует найденные лоты и хранит их изменения во времени. Это продолжение уже реализованного blockchain-контура: кошельки и платежные операции GRAM описаны в проекте P2P-платформы, а выпуск NFT — в кейсе TON NFT.
Главная граница: только чтение
Radar не авторизуется в Fragment, не подключает Telegram-аккаунт и не получает доступ к кошельку. В провайдере нет методов для ставки, покупки или перевода актива. Он выполняет только публичные запросы, которые нужны для поиска и чтения карточки лота.
Что модуль делает
- находит usernames и номера
- обновляет состояние аукционов
- фиксирует цену, ставки и дедлайн
- сохраняет snapshots и события
- рассчитывает структурный score
Чего модуль не делает
- не выставляет ставки
- не покупает активы
- не подписывает TON-транзакции
- не хранит сессии пользователя
- не обещает доходность
Это разделение важно и с точки зрения безопасности, и для качества данных: аналитика не должна незаметно превращаться в торгового бота.
Как устроен сбор публичных данных
Fragment использует короткоживущий hash и cookie сессии. Поэтому провайдер сначала открывает публичную страницу, извлекает актуальные параметры, а затем обращается к тому же JSON endpoint поиска, который использует web-интерфейс. Детальная карточка загружается отдельно и разбирается HTML-парсером.
Discovery
Поисковые запросы находят usernames и номера. Каждый результат получает стабильный тип, значение, slug и публичный URL.
public search · normalizeClassification
Отдельные классификаторы вычисляют признаки: длину, цифры, повторы, последовательности, симметрию и словарные совпадения.
features · tags · categoriesRefresh
Фоновые задания обновляют цену, следующий шаг ставки, число ставок, статус и время завершения аукциона.
queue · staggered jobsHistory
Новый snapshot создаётся только при реальном изменении состояния. Сравнение порождает одноразовые доменные события.
snapshots · eventsResearch
Админка объединяет фильтры, сортировку, карточку актива, историю и расшифровку score.
filters · score breakdown
Первичный набор: 2 630 активов
На момент фиксации кейса первичное сканирование собрало 2 630 уникальных активов: 1 500 usernames и 1 130 номеров. Среди них зафиксированы лоты в состояниях auction, resale, sale и sold. Этот набор уже позволяет проверять классификацию и интерфейс, но ещё не является достаточной историей для рыночных выводов.
Непрерывный режим управляется отдельным feature flag. Пока он выключен, планировщик не обращается к Fragment. Это позволяет сначала применить миграции, проверить очередь и лимиты, а уже затем включать регулярное наблюдение без изменения кода.
Два классификатора для разных типов активов
Username и номер нельзя оценивать одной формулой. Для короткого слова важны длина, состав символов и словарное совпадение. Для номера — повторяющиеся цифры, последовательности, зеркальность, палиндром и круглое окончание.
Telegram usernames
- длина и число цифр
- буквенный, цифровой или смешанный состав
- наличие подчёркивания
- повторы и палиндром
- опциональное совпадение со словарём
Anonymous numbers
- количество разных цифр
- максимальная серия повторов
- возрастающие и убывающие последовательности
- зеркальность и палиндром
- одинаковое или круглое окончание
Результаты сохраняются как отдельные признаки, категории и теги. Поэтому формулу можно менять, а исходные наблюдения остаются доступными для повторного расчёта.
Radar Score: рейтинг, который можно объяснить
Каждый актив получает score от 0 до 100. Для номеров взвешиваются редкость цифр, повторы, последовательности, симметрия и длина. Для usernames — длина, словарное совпадение, состав символов, количество цифр и заметный паттерн.
В базе сохраняется не только итог, но и breakdown: значение каждого фактора, его вес и вклад. Формула имеет версию, поэтому после корректировки весов можно пересчитать весь набор командой fragment:score:recalculate и сохранить понятную методологию.
Важно: Radar Score — не оценка будущей цены и не финансовая рекомендация. Это эвристический показатель структурной выразительности, предназначенный для сортировки и первичного отбора.
Snapshots и события вместо перезаписи строки
Текущее состояние нужно интерфейсу, но для анализа важнее переходы. Поэтому состояние лота сравнивается с последним наблюдением. Если ничего не изменилось, дубликат snapshot не создаётся. Если изменилось — сохраняется новый срез и соответствующее событие.
Жизненный цикл
NEW— актив впервые найденSOLD— зафиксирована продажаEXPIRED— аукцион завершён без продажиREMOVED— лот исчез из выдачи
Динамика аукциона
PRICE_CHANGED— изменилась ценаBID_CHANGED— появилась новая ставкаENDING_SOON— дедлайн вошёл в заданное окно
Одноразовые события защищены от повторного создания. Это делает будущие уведомления и отчёты предсказуемыми: один переход состояния соответствует одному событию.
Фильтры и карточка актива в админке
Список можно фильтровать по типу, статусу, диапазону цены, минимальному score, паттерну, времени первого обнаружения и близкому завершению. Доступны сортировки по цене, score, числу ставок, дедлайну, активности и времени добавления.
Карточка актива показывает ссылку на Fragment, цену в TON, приблизительный эквивалент в USD, следующий шаг, историю snapshots и событий, признаки классификатора и полный breakdown Radar Score. Пересчёт TON/USD выполняется редко и используется только для ориентировочного отображения.
Очереди, лимиты и восстановление после ошибок
Discovery и refresh работают через Redis Queue. Обновления распределяются во времени, чтобы несколько заданий не создавали всплеск запросов. Между обращениями выдерживается минимальный интервал, а при ответе 429 включается cooldown.
Каждый запрос провайдера попадает в технический журнал: HTTP-статус, задержка, количество элементов, признак rate limit или блокировки и текст ошибки. Благодаря этому можно отличить изменение разметки Fragment от сетевого сбоя и от срабатывания ограничений.
Планировщик поддерживает отдельные интервалы: discovery — обычно раз в 15 минут, refresh аукционов — раз в 5 минут, обновление ориентировочного курса TON/USD — раз в 3 часа. Задания защищены от наложения и выполняются одним scheduler-узлом.
От накопления данных к аналитике
Команда fragment:dataset:report формирует воспроизводимый отчёт: число уникальных активов, новые и завершённые лоты, продажи, диапазон наблюдаемых цен, изменение цены, частоту паттернов, среднюю продолжительность аукциона и распределение score.
Для осмысленных сравнений нужен временной ряд. Минимальное окно — семь дней, предпочтительное — четырнадцать и больше. До накопления этого периода цифры в панели подтверждают работу pipeline, но не должны интерпретироваться как статистическая модель рынка.
Результат
Fragment Radar добавил в GRAM самостоятельный read-only модуль исследования Telegram Collectibles. Публичные данные проходят путь от discovery до нормализации, классификации, версионированного score, snapshots и событий, а затем становятся доступными в удобной административной панели.
Архитектура рассчитана на безопасное развитие: сбор включается отдельным флагом, запросы ограничены, ошибки журналируются, состояние хранится исторически, а формулу можно пересчитывать без потери исходных признаков. Следующий практический этап — накопить временной ряд и откалибровать веса на реальных завершённых аукционах.
Laravel · PHP · Fragment · Telegram Collectibles · TON · Redis Queue · Docker · Data Pipeline
