Проект: 🇬🇪 Отслеживаем тбилисские автобусы в режиме реального времени  Публичный пост
9 марта 2025  541
ОХУЕННО Держи долор
🇬🇪 Отслеживаем тбилисские автобусы в режиме реального времени
https://github.com/coignard/tbilisi-bus-timetable-bot

Вы когда-нибудь были в Тбилиси?

Тбилиси замечательный, большой и живой город. В Тбилиси хорошо. Там я прожил с полгода в двадцать третьем, после чего отправился колесить по Сакартвело дальше.

А ещё в Тбилиси около каждой автобусной остановки есть волшебное табло, на котором отображается информация об автобусах, которые скоро приедут:

И моё табло тоже!
И моё табло тоже!

Если присмотреться, в нижней части табло спряталась строчка с его идентификатором и номером SMS. Что будет, если отправить на этот номер сообщение? Именно об этом я подумал одним из вечеров, изучая свою фотогалерею на телефоне. Недолго думая, я взял да и отправил на этот номер идентификатор остановки.

Ого, да у меня в закромах и скриншот с места событий даже завалялся:

В ответном сообщении робот мне сообщил на грузинском номер автобуса и время в минутах до его прибытия на остановку. То есть, буквально, всё то же самое, что отображается на приостановочном информационном табло.

Польза от этого очевидна: информация синхронизируется с реальным положением дел у автобусов, и если автобус опаздывает, время на табло тоже будет скорректировано. Если ты сидишь дома и знаешь идентификаторы ближайших остановок, можно не приходить заранее на остановку в ожидании автобуса, а узнать, когда именно придёт ближайший автобус, и спланировать выход из дома в соответствии с этой информацией.

Это особенно полезно, потому что точного расписания автобусов я так нигде и не нашёл. Со временем, конечно, неизбежно обнаруживаешь закономерности, но это всё равно не то. То ли дело, когда наличествует точная информация о том, когда приедет автобус. И приедет ли вообще.

Но где достать данные?

Сразу же по получении ответного SMS я подумал, что, вероятно, может уже существовать какое-нибудь приложение, откуда можно получать такие же данные. Так и оказалось: нашёл в гугль-плее официальное (или неофициальное, тут уж не припомню) приложение перевозчика, на тот момент неудобное и кривое, и обнаружил, что это всего лишь обычный WebView. Подсмотрел, куда оно запросы шлёт, и обнаружил неприкрытый бэк, который принимал на вход идентификатор остановки и возвращал всю остальную информацию, которой располагал, в JSON.

Поехали!

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

Чуть позже я задумался о том, что бот мог бы сослужить службу и другим жителям города. Тогда же и увидел свет первый публичный релиз с более-менее приличным видом:

Чуть позже я добавил в бота возможность отслеживать текущее местонахождение автобуса по его номеру. Просто случайно заметил информацию об этом в выхлопе API и подумал, что было бы здорово прикрутить это к боту:

Выход в люди

После релиза оставалось лишь рассказать людям как-то, что теперь есть вот такой удобный инструмент, можете пользоваться. Я связался с локальным телеграм-каналом «Tbilisi Life» и Николаем Левшицем, рассказав про свой продукт. День спустя они опубликовали у себя информацию о том, что появился вот такой замечательный бот:

И ещё:

Ботом начали достаточно активно пользоваться, общая база активных пользователей сейчас составляет 2-4 тысячи человек. В какие-то моменты были всплески новоприбывающих, поэтому общее количество человек, воспользовавшихся ботом хотя бы один раз, превышает 10 тысяч человек.

Периодически получал и обратную связь, потому как оставил в боте адрес своей электропочты. Самым частым запросом была возможность сохранять автобусные остановки и давать им имена, и в новом релизе я эту функцию наконец реализовал. Теперь бот выглядит вот так:

На вкладке «расписание» можно выбрать сохранённую остановку:

Если все автобусы уехали, бот честно об этом сообщит:

Можно отправить боту номер остановки и он сразу же отобразит информацию об автобусах:

Слева отображается точное время прибытия, цвет кружка — как скоро ждать автобус (🔥 — поздняк метаться, 🟡 — от 2 до 5 минут, 🟢 — больше 5 минут).

В новой версии бота можно не отправлять каждый раз номер остановки, а просто нажимать на кнопку «Обновить», чтобы получить актуальную информацию.

Едем дальше

Мысль о том, чтобы собирать метрики в локально поднятый прометеус и после строить красивые графики в графане, к сожалению, посетила меня не в самом начале проекта, а лишь несколько месяцев спустя. Тем не менее, лучше уж начать собирать статистику хоть когда-то, чем совсем никогда. Отслеживал количество запросов и общее число уникальных пользователей:

Количество новых пользователей здесь — не за today всё же, а за последние полгода
Количество новых пользователей здесь — не за today всё же, а за последние полгода

По легенде в нижней части скриншота видно, что к тому моменту я успел сообразить ещё по боту для Рустави и Батуми. В Кутаиси, где к тому времени уже жил, тоже хотел сделать бота, но, к сожалению, пообщавшись с компанией AZRY, которая поддерживает всю эту систему, выяснилось, что на похожее API для Кутаиси в ближайшее время рассчитывать не стоит.

Я, должен признать, даже всерьёз задумывался о том, чтобы попробовать подцепиться ноутом к какому-нибудь табло и поснифать, что оно отправляет в сеть и что получает, но товарищи из AZRY подсказали, что там VPN и послушать трафик не выйдет. Что поделать!

Приехали

В конце прошлой недели мне на почту пачками стали приходить сообщения о том, что бот перестал работать. Я, должен признать, и думать уже забыл о нём — я в Германии уже с год, и бот всё это время прилежно исполнял свои обязанности, лишний раз о себе не напоминая (здесь немного лукавлю: однажды старому API довелось скоропостижнуться, после чего пришлось полностью переписывать логику для работы с API от TTC). Как вдруг читаю:

Сразу же решил попробовать пройтись курлом по API. Тот вернул 500 и HTML-код. Парсить глазами было лень, поэтому зашёл через браузер. Обнаружил вот такую красоту:

Быстрый гуглёж по идентификатору атаки привёл меня на справочник какой-то IDS, в котором значилось, что этот код означает, что я страной не вышел, чтобы к серверу обращаться: Unauthorized Geo IP. Однако, вероятно, IDS также смотрит и RPTR, не пущая сервера, а только одомашненных клиентов с айпишниками интернет-провайдеров, потому как попытки пробраться к API с грузинских серверов у меня не увенчались успехом. Однако простые люди говорили, что у них страница, на которую попасть я пытался, открывается. Значит, дело действительно в айпишниках. Нужен грузинский айпишник. И не серверный, а от интернет-провайдера.

Сразу же подумал о том, что прокси вполне справится с этой проблемой. Нашёл сервис аренды прокси, где можно было взять прокси с айпишниками от грузинских интернет-провайдеров на триал, и проверил курлом, стала ли страница доступна. Да, всё заработало! Проблема в том, что бота я не монетизировал до настоящего момента, а самому платить из собственного кармана за прокси жаба душила. Поэтому я просто взял и прикрутил кнопку доната плюс сообщение о том, что боту нужна помощь:

Про сервер лукавлю, но не объяснять же пользователям, что такое прокси и зачем оно боту нужно
Про сервер лукавлю, но не объяснять же пользователям, что такое прокси и зачем оно боту нужно

Как только запустил бота, в логах с завидной периодичностью начали обнаруживаться радостные возгласы пользователей, которые с несколько дней были лишены такого удобства:

Через некоторое время начали приходить и уведомления о том, что добрые люди решили оформить ежемесячное пожертвование размером в один евро на содержание, обслуживание и развитие бота:

Несколько человек оформили единовременное пожертвование, несколько подписались на ежемесячное. В любом случае, деньги на оплату прокси до конца марта обнаружились. Теперь остаётся собрать деньги на апрель.

Потыкать в бота

Можете скормить ему остановку Nº 3855, если вы не в Тбилиси
сейчас и вокруг нет замечательных тбилисских автобусных остановок:
https://t.me/tbilisi_bus_timetable_bot

Вместо заключения

Люблю оставлять после себя что-нибудь полезное. Так, скажем, когда скрывался от полиции в глухой российской деревне, сообразил там местным жителям радио с ежедневными передачами и возможностью связываться друг с другом в лесу. В Тбилиси теперь живёт-поживает автобусный бот, а в Кутаиси — бот, присылающий информацию об отключениях воды и электроэнергии.

Приезжайте как-нибудь в Тбилиси, там здорово!

5 комментариев 👇

Уважаемо. Я часто видел как люди ссылаются на этого бота, но сам не использовал, не было нужды. Помню еще ботов, которые про отключения воды и света - не твои?
Из тех же гуманистических соображений делаю https://georailway.com/, про железные дороги Грузии, там без поллитры не разобраться.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Респект! Не думал английский и грузинский добавить в бота?

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб