Я собрал народную карту бензина на LLM. Через неделю Яндекс выкатил свою
Неделя вечеров, один дешёвый VPS и нейросеть за сотни рублей в месяц. Как устроен конвейер «телеграм-чаты — структурированные данные», какие грабли я собрал по дороге и что изменилось, когда в ту же нишу зашла экосистема.
Лето 2026-го: топливо по талонам больше чем в половине регионов, очереди на заправках, 95-й в дефиците. При этом информация о том, где бензин ЕСТЬ, существует: она лежит в народных телеграм-чатах, где водители пишут «на Лукойле на Ветеранов привезли 95, очередь минут 20».
Проблема не в отсутствии данных, а в их форме: сотни сообщений в сутки вперемешку с руганью и мемами, всё протухает за пару часов. Когда тебе нужно заправиться, листать пять чатов некогда.
Это идеальная задача для LLM: свободный текст на входе, структура на выходе.
КОНВЕЙЕР
Шаг 1. Читалка через Telegram API забирает сообщения из народных топливных чатов и официальных каналов. Отдельно ценны сводки муниципальных центров управления: МЦУ Краснодара каждое утро публикует список работающих АЗС с адресами и марками. Это готовая структура, модели там почти нечего делать.
Шаг 2. Раз в 15 минут DeepSeek разбирает новые сообщения. Из «на тебойле у лахты 95 и дт, очередь жесть» получается запись: сеть — Тебойл, ориентир — Лахта-центр, марки — 95 и ДТ, очередь — большая. Флуд отсеивается регулярками ещё до вызова модели: платить за токены ради мема жалко.
Шаг 3. Геокодинг с уровнями честности. Это ключевое решение всего проекта. Геокодер возвращает не просто координаты, а точность. Точный дом — красная метка «здесь». Только улица или ориентир — серая «примерно тут». Никогда не притворяться, что знаешь точнее, чем знаешь.
Шаг 4. Отдача: телеграм-бот и мини-приложение с живой картой.
ИСТОЧНИКИ ЖИВУТ И УМИРАЮТ САМИ
Кризисные чаты — расходный материал: возникают за неделю, умирают за месяц. Поэтому источниками управляет автоматика.
Дважды в день система ищет в Telegram новые топливные чаты по ключевым фразам, читает 30 последних сообщений, считает долю «топливных» и берёт годные на испытательный срок. Даёт пять и больше отчётов за неделю — становится постоянным источником. Не даёт за две недели — отключается. Молчит две недели или забанен — хоронится, с уведомлением мне.
Сейчас так живут около 30 источников по пяти регионам. Лучший из найденных автоматикой дал 3600 отчётов. Канал «ЖЕНСКАЯ ОДЕЖДА МОСКВА» отсеялся на скоринге.
ДОВЕРИЕ К ДАННЫМ
Краудсорс врёт и протухает. Это надо показывать, а не прятать. На каждой карточке стоит возраст данных: «43 мин назад». Если станцию подтвердили несколько сообщений из разных чатов, появляется бейдж «подтверждено: 3 сообщения из 2 чатов». Одно сообщение — это мнение, а не истина.
ГРАБЛИ
Вечный Кронштадт. В мини-приложении моя геопозиция упорно оказывалась за заливом от реального места. Оказалось, WebView внутри Telegram отдаёт координаты вышки сотовой связи, а у вышки одна прописанная точка в базе. Лечение: не считать позицией фикс с точностью хуже двух километров, дожимать GPS в фоне и дать пользователю поставить точку рукой.
Заправка в Антарктиде. Геокодер однажды вернул ростовской АЗС широту минус восемьдесят. Теперь всё, что выходит за рамку России, отбрасывается до попадания на карту. Санитарные проверки координат — не паранойя.
database is locked. Одна строчка инициализации схемы делала INSERT при каждом открытии базы, и каждый читатель незаметно становился писателем. Под нагрузкой SQLite встал колом. Лечится за час, ищется вечер.
ПОТОМ ПРИШЁЛ ЯНДЕКС
8 июля Яндекс открыл всем пользователям Go и Заправок карту наличия топлива и очередей — раньше её видели только таксисты. Больше 10 000 АЗС. Данные собираются примерно как в Пробках: обезличенные транзакции оплаты в Заправках за последний час, данные Карт, опросы водителей.
Первая реакция — «ну всё, приехали». Вторая, когда разобрался, — интереснее.
Яндекс видит только то, что проходит через его платёжные рельсы. Отсюда следует то, что не чинится продуктовым решением.
Лукойла на карте нет. Он не подключён к оплате через Яндекс. А это одна из крупнейших сетей страны.
Транзакция не знает марку. «Кто-то заправился час назад» означает, что станция открыта и что-то льёт. Таксист залил ДТ — про наличие 95-го это не говорит ничего.
Молчание двусмысленно. Когда топливо кончилось, машины перестают приезжать. Но «тихо» — это кончилось, закрыто или просто ночь?
А человек, написавший в чат «на Газпроме 95 всё, ДТ есть, очередь 40 минут», сообщает ровно то, чего в транзакциях нет и не будет.
ЧТО Я ИЗ ЭТОГО ПОНЯЛ
Данные из платёжных рельсов объективны, но узки. Данные из речи людей грязны, но покрывают реальность целиком: сети, марки, лимиты, очереди.
Соревноваться с экосистемой в её сильной стороне бессмысленно: у Яндекса десятки миллионов установок, у меня сорок пользователей. Но у большой платформы почти всегда есть структурная слепая зона, вытекающая из её бизнес-модели. Место маленького проекта — там.
Приятный побочный эффект: запуск Яндекса бесплатно доказал, что задача настоящая.
Последнее, что я сделал уже после этой новости, — подключил каталог из OpenStreetMap: 7648 реальных АЗС по пяти регионам. Теперь, когда из чата приходит «Лукойл на Ветеранов», система находит единственный Лукойл рядом с этой улицей и ставит точную метку вместо приблизительной. Доля точных меток выросла до 53%. OSM выбран не случайно: он бесплатен, не требует ключа и, в отличие от источника Яндекса, знает про Лукойл.
СТОИМОСТЬ
Один дешёвый VPS. DeepSeek на копеечном тарифе. Ни одного фреймворка: Python, стандартная библиотека, SQLite, systemd и кроны. Около 800 структурированных отчётов в сутки по пяти регионам.
Бот, если интересно посмотреть, — @spb_fuel_finder_bot