Внутренняя жаба и свой Ozon Price Tracker с блэкджеком и сиреной (и моя боль)
Всем привет, диванные архитекторы.
короче все в курсе про рандомно скидки Озона, сегодня купил, завтра товар на 500% дешевле(образно говоря)) Да, базара нет, можно отменить и купить дешевле. Но не суть. Меня короч в какой-то момент переклинило. Заходить по двадцать раз в день проверять, не подешевели ли носки. Чекнул чё есть на рынке... сторонние боты в телеге либо не работают,
либо просят подписку, либо показывают гостевые цены без учета Ozon Карты и регионального склада (ID).
В общем решил, а ху...и нам кабанам, пишем свой нативный трекер под Android на Kotlin, Jetpack Compose и локальном движке. Без серверов, без передачи данных третьим дядям(реже тетям), с жестким контролем всего происходящего.
...че каво и что имеем на данный момент
Стек без мамонтов: Kotlin + Jetpack Compose + Room +WorkManager + Coil.
К сожалению парсинг Озона через Jsoup/OkHttp в 2026 году ожидаемо шлет тебя на три буквы с кодом 403 Forbidden и бесконечным редиректом на капчу, пришлось поднять локальный headless-браузерный движок внутри прилож.
Что уже работает и радует душу:
1. Честные цены с Ozon Картой и скидкой ID: Приложение умеет подхватывать авторизацию Ozon ID. Никаких «средних цен по больнице» видит ровно ту цену, которую видите вы в своем профиле со своего домашнего ПВЗ.
2. Добавление в 1 клик через системный Share: Увидел товар в приложении Озона ➔ нажал «Поделиться» ➔ выбрал свой трекер ➔ выставил целевой прайс. Всё.
3. Разделение на три лагеря:
СЛЕДИМ то, что реально в наличии и пасется ботом;
ЗАКОНЧИЛСЯ товары, которые раскупили (бот продолжает тихо мониторить склад, и если продавец пополнил остатки ..прилетает Restock Alert);
АРХИВ ...купленное или отложенное барахло, чтобы не жрать ресурсы.
4. Умная сортировка и детекция падений: Если цена пошла вниз (даже на 50₽), товар моментально летит в топ списка с плашкой «🔥 Цена снизилась на X ₽».
5. Режим «ОРАТЬ» и Сирена: Обычные скидки шлют тихий пуш. Но если цена пробила выставленный таргет и телефон врубает полноэкранный Heads-up баннер и зацикленную сирену через аларм-менеджер, которая орет, пока ты не нажмешь «Купить». Проспать скидку физически невозможно.
6. Графики на Canvas: Написал нативный график истории цен прямо на Compose Canvas, с адаптацией под день/ночь и фирменный сине-розовый стиль Озона.
7. Живой логер в фоне: Фоновый воркер пишет логи с точностью до секунды, их можно экспортировать в .txt прямо в /Download.
Ну и там всякие другие плюшки...
И главное приложение уверенно живет в фоне на Xiaomi (HyperOS) и не умирает ночью в Doze Mode.
А теперь собственно боль (и почему я здесь)
Приложение сейчас на стадии активного бета-теста на реальном железе, и есть два момента, на которых мой инженерный дзен всё...
Проблемка1: Корзина Озона
Поштучно товары через «Поделиться» добавляются идеально за полторы секунды. Но добавлять 20 позиций по одной такое себе. У Озона есть функция «Поделиться корзиной» (cart?share=...), которая генерирует публичную ссылку. Казалось бы, епта. Но при попытке разобрать страницу корзины, этот франкенштейн на Nuxt 3 подмешивает в DOM-дерево подвал с лентами «Вы смотрели», «Возможно вам понравится» и еще 40 рекламных карточек с аналогичной версткой. В итоге вместо 2 товаров из корзины скрипт радостно пытается затрекать половину витрины озона.
Проблемка2: Периодический склероз сессии, раз в пару недель WebView решает, что он устал, и роняет сессионные куки авторизации. Цены при этом не ломаются, но превращаются обратно неавторизованные (без учета Ozon Банка), пока заново не откроешь профиль. В приложении просто тыкаешь в настройках на авторизацию и логинишься. Да, когда эту хрень заметил, я конечно сделал временную затычку в виде уведомления что "ау, залогиньтесь плиз снова", но все таки хочется как то убрать данное неудобство.
Внимание, вопрос к коллективному разуму местных гуру:
Господа фронтендеры, реверс-инженеры и просто бывалые воины парсинга:
1. Кто ковырял публичные корзины Озона (cart?share=...) на Nuxt...по какому самому надежному селектору или объекту в window можно уверенно изолировать реальные товары корзины от мусорных каруселей рекомендаций? Я пробовал по очевидным самым типа - 1 -(количество товаров), форма галочки, ну и другие элементы которые казалось бы только в корзине присутствуют, но при 2х товарах в корзине, удалось сократить парс до 6 товаров (из +-50)
2. Как держать живой вебвьюшную сессию без регулярных пинков?
Советы, идеи, конструктивная критика архитектуры и вобще в
комментах категорически приветствуются. Всем низких цен и стабильного рантайма!
# FIXME: Я не знаю, почему это работает. Не трогайте, иначе всё взорвется.
# И да, я молился, когда это писал.








