bgwatch: монитор авиатарифов
Наблюдатель за ценами на авиабилеты туроператора с временными рядами, обнаружением изменений и оповещениями через MQTT
Python-сервис, который опрашивает эндпоинты тарифов Библио-Глобус (bgoperator.ru) для чартерных и регулярных рейсов, приводит две разные JSON-схемы к одной модели, сохраняет только реальные изменения цен в...
Python-сервис, который опрашивает эндпоинты тарифов Библио-Глобус (bgoperator.ru) для чартерных и регулярных рейсов, приводит две разные JSON-схемы к одной модели, сохраняет только реальные изменения цен в гипертаблицу TimescaleDB и публикует оповещения с ограничением частоты (минимум за 7 дней, падение >=5%, ценовой порог) через MQTT для Telegram-бота и Grafana.
Транспорт авторизации учитывает особенности оператора: обязательный gzip, сессионная cookie, меняющаяся с каждым ответом, и ответы «unauthorized» с HTTP 200.
Сборщик cookie на Playwright и перехватчик XHR служат запасным вариантом без учетных данных.
Что умеет
- Клиент авторизации с состоянием: ротация cookie Z1, одна повторная авторизация и один повтор при SR001, cookie-файл на диске, режимы с учетными данными и только с cookie
- Нормализатор, принимающий оба документированных формата ответа (багаж списком или багаж строкой + бренд) и громко падающий при расхождениях
- Движок обнаружения изменений: запись только при изменении, исчезнувшее предложение считается событием инвентаря, а не ростом тарифа
- Правила оповещений (минимум за 7 дней, падение >=5%, порог) с лимитом 1 раз в час на каждое наблюдение, публикация в MQTT
- Схема гипертаблицы Timescale + таблица наблюдений
- Сборщик на Playwright, для которого был разобран отдельный GraphQL-подобный API публичного фронтенда и его клиентская хэш-защита
- 57 офлайн-тестов на pytest с мок-транспортом (сеть не нужна)
Четкое разделение транспорта авторизации и разбора данных; жесткое правило никогда не парсить HTML; аккуратная работа с недружелюбным сторонним API; компактный сервис (<150 МБ RSS), рассчитанный на встраивание в существующую инфраструктуру Timescale/EMQX/Grafana. Не завершен (живого опроса пока нет).
Нужно что-то похожее?
Делаю это вживую на звонке в Zoom / Яндекс Телемост, вы смотрите на экран, таймер останавливается по вашему слову. Первые 15 минут бесплатно.