Этим летом наша детская школа искусств выступает с песнями и танцами на шоу в Диснейленде. Мы все предвкушаем поездку, но мою радость слегка омрачил тот факт, что для доступа к расписанию, графику поездки и информации о проживании придётся установить приложение Travelbound.

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

И я нисколько не преувеличиваю. По своей сути, это приложение представляет текст, картинки и ссылки на PDF-файлы, загружаемые из интернета.

При этом делает оно буквально две вещи, на которые неспособна веб-страница, и которые обе являются антифичами:

  • Отправляет разработчикам данные отслеживания действий вашего аккаунта Google.

  • Показывает рекламу других путешествий, организуемых тем же агентством, преподнося их как «источники вдохновения».

Как же меня это достало

Обычная веб-страница подошла бы намного лучше. В отличие от этого приложения её можно:1

  • копировать,

  • распечатывать,

  • сохранять,

  • добавлять в закладки,

  • использовать практически на любом устройстве,

  • плюс на ней можно искать текст, и «потенциально» она более доступна.

Меня настолько взбесила эта ситуация, что я собираюсь «исправить» это приложение. Подержите моё пиво.

Начнём с перехвата всего трафика

Я уже давно не реверсил Android-приложение на основе его сетевого трафика, так что пришлось вспоминать, как это лучше всего сделать. В итоге я пошёл таким путём:

  • Создал новые виртуальные устройства в Virtual Device Manager в Android Studio.

  • Проверил, работает ли adb shell, и с помощью rootAVD получил root-права: ./rootAVD.sh system-images/android-33/google_apis_playstore/x86_64/ramdisk.img.2

  • Выполнил холодную загрузку, запустил Magisk и перенастроил его так, чтобы он автоматически выдавал права суперпользователя любому приложению, которое его запросит.3

Весь ваш трафик принадлежит мне. С этого момента работа с ним ничем не отличается от анализа с помощью Wireshark или TCPdump.

  • Запустил HTTP Toolkit и настроил его на перехват трафика с виртуального устройства (AVD). Программа развернула локальный VPN и пустила трафик телефона через него.4

  • Установил приложение Travelbound из Play Store.

  • Настроил HTTP Toolkit так, чтобы проксировать только приложение Travelbound (меньше лишнего шума — больше полезных данных).

Всего за пару минут экспериментов я выяснил принцип работы приложения: оно конкатенирует имя пользователя и пароль5, после чего подставляет результат в URL следующего вида:

https://travelbound.api.vamoos.com/api/itineraries/{username}-{password}

Этот запрос возвращает огромный массив данных в формате JSON, в котором после небольшого анализа можно легко разглядеть весь контент, который приложение «показывает». Например, там есть:

  • массив, содержащий каждый этап маршрута,

  • массив, содержащий все рекламные объявления для показа пользователю,

  • перекрёстный массив, содержащий все файлы (изображения и прочее), на которые ссылаются другие разделы, и так далее.

Firefox showing a JSON document, focussing on a section about 'Your Ferry Crossing' with some accompanying HTML.

И они всё равно генерируют HTML-код… так что я снова задаюсь вопросом: «Почему это не веб-страница?»

Немного поэкспериментировав, я выяснил, что для URL-адресов изображений, поступающих из хранилища S3, устанавливается довольно короткий срок действия. Это значит, что необходимо периодически запрашивать JSON-данные, даже если контент за это время не изменился.6

Пора это дело исправить

Теперь у меня было всё необходимое, чтобы сделать нечто... получше. Я написал на Ruby скрипт, который запускается по расписанию через Cron, забирает актуальный JSON и собирает на его основе HTML-страницу.

Я решил полностью пропускать «вдохновляющую» рекламу (использовав overlayRows в схеме данных) и выводить только:

  • элементы маршрута,

  • все файлы, на которые не ссылаются ни маршрут, ни подборки (ленивый способ собрать вместе ссылки для скачивания PDF-файлов).

После этого я захостил страницу, защитив её паролем: тем же, который выдали моей тур-группе. А исходный JSON, на основе которого она строилась, я скрыл в HTML-элементе <details>. Это позволит мне его перепроверить в случае, если в схеме появятся новые элементы, которые я изначально не учёл.

Screenshot of a simply-styled web page showing the same information about the ferry, along with a photo from its deck.

Моя веб-страница выглядит не такой «красивой», как приложение, у которого она «заимствует» информацию. Зато весит она в разы меньше, и все стандартные фишки веб-браузеров достались ей абсолютно бесплатно.

Некоторым людям нравится формат «приложения», и это… нормально. Но ведь встречаются такие приложения, которые можно было бы вполне реализовать в виде веб-страницы. Особенно в таких случаях, как мой, когда их контент уже написан на HTML и передаётся по HTTP. Ну ведь очевидно, что это должен быть сайт, разве не так?

И как только мы докатились до такой «культуры создания приложений»… Разработчики ПО сами же усложняют себе жизнь (и удорожают, так как размещение в крупных магазинах стоит денег), чтобы в результате предложить HTML-контент меньшему числу людей и с меньшим количеством функций7, чем в случае прямого размещения в веб-среде.

Да, есть такие задачи, для которых «приложение» реально оправдано. Но это явно не про Travelbound.

Зато теперь, по крайней мере, у меня и у остальных участников, с которыми я поделился своей страницей, есть выбор, каким способом получать доступ к этому контенту. Либо использовать приложение на 43 МБ (раздувающееся до 124 после скачивания допов) с отслеживанием и рекламой… либо сайт размером 0,05 МБ (с возможностью подгрузить ещё 35 МБ изображений), который имеет больше функций и работает на большем числе устройств. Для меня выбор очевиден!

Сноски

1 И это только те фичи, которые оценят абсолютно все. Веб-страница, которую я в итоге сделал как альтернативу приложению, также имеет несколько функций из разряда «полезно для юзера / кошмар для разработчика» — например, она вырезает код отслеживания и вообще не показывает рекламу.

2 Получить root-права на устройстве необходимо для того, чтобы заставить приложения, использующие Certificate Pinning (привязку сертификатов), доверять вашему MITM-серверу. Без этого некоторые приложения — включая то, которое я пытался разобрать — распознают ваш самоподписанный TLS-сертификат как недействительный и просто откажутся устанавливать связь.

3 Без изменения этой настройки в Magisk я столкнулся с тем, что HTTP Toolkit запрашивал su-доступ, но не дожидался ответа и переходил в режим работы без привилегий ещё до того, как я успевал этот запрос одобрить!

4 Из-за политики безопасности Android мне пришлось вручную установить корневой сертификат удостоверяющего центра, который подготовила программа, но сами инструкции вполне сработали.

5 Имя пользователя и пароль выдаются сразу всей туристической группе. Сдаётся мне, у них вообще нет никакого плана на случай утечки этих данных. Ну или, возможно, они считают всю эту информацию настолько неважной, что не придают этому значения… В таком случае я возвращаюсь к своему первому вопросу: «Какого чёрта это нельзя было изначально сделать обычной веб-страницей»?

6 Ну или изображения нужно кэшировать локально — судя по всему, именно это приложение и делает, причём максимально раздутым способом.

7 И зачастую с худшей доступностью. Я не проводил аудит доступности этого приложения, но некоторые детали подсказывают, что пользоваться им с помощью ассистивных технологий будет гораздо сложнее, чем моей простой и понятной веб-версией.

Комментарии (20)


  1. JBFW
    19.07.2026 09:17

    У приложения есть как минимум один плюс - его не надо "вводить" в поиске. Увидел знакомую иконку в третьем ряду слева - тык - открылось.
    Второй плюс - полноэкранный режим сразу без дополнительных движений

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


    1. pae174
      19.07.2026 09:17

      1. JBFW
        19.07.2026 09:17

        Это я знаю. И оно как раз решает вот эти два пункта о которых я говорю: отдельная иконка + полноэкранный режим.

        Если бы и другие массово знали - но видимо что-то мешает, потому что в очень многих случаях действительно проще было бы сделать PWA, из того же самого сайта, но почему-то не делают.

        Вот это мне непонятно.


        1. trinxery
          19.07.2026 09:17

          но видимо что-то мешает

          Вполне конкретная компания:

          Почему PWA на iOS всё ещё не торт — и что на самом деле разрешает Apple

          Apple confirms it’s breaking iPhone web apps in the EU on purpose

          Также:

          Помимо отсутствия install prompt, сильно влияет то, что разные браузеры на iOS и Android ведут себя по-разному даже в рамках PWA. В частности, часть мобильных браузеров (тот же Opera на Android, некоторые webview) не отдают beforeinstallprompt вообще, даже когда формально все критерии выполнены.

          В таких случаях единственный рабочий вариант — детект окружения на клиенте и показ браузер-специфичной инструкции, а не универсального «Add to Home Screen». <...>


    1. rPman
      19.07.2026 09:17

      'знакомую иконку' где вы увидели?

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

      Весь интернет - это 'тык в иконку'


      1. JBFW
        19.07.2026 09:17

        Вы, похоже, не поняли о чем речь.

        Забудьте о том что вы айтишник, вы - баба Клава, которая в телефоне только иконки видит. Ну хорошо, Клавдия Модестовна, гендиректор ООО Ромашка, солидная дама, которая всё равно не айтишник.

        Она разблокирует телефон и ищет - что? Знакомую ей иконку приложения.
        Потому что это удобнее и быстрее, чем открывать "интернет" и в нем что-то там писать.
        Она тыкает в иконку и получает то что хотела сразу, здесь и сейчас.

        Если же такой иконки ей не дали - она задаёт вопросы "а почему у вас до сих пор нет приложения?! Вы что, лохи?"
        После чего та сторона напрягается и ищет исполнителя, который напишет приложение для их сервиса/услуги.

        Почему бы это не сделать через PWA? Вот этого не знаю.

        Но наша Клавдия Модестовна будет очень недовольна, если вместо "просто установить" вы предложите ей что-то типа "найдите, зайдите, выберите, укажите, сохраните, повторите" - она не айтишник. Дайте ей знакомую иконку, сложно вам, что ли?


        1. rPman
          19.07.2026 09:17

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

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


          1. JBFW
            19.07.2026 09:17

            баба клава освоила тыкание в меню "там, где программы устанавливаются".
            Она не обязана уметь в хроме создавать иконки на рабочий стол.

            Ну это вообще вот базовая вещь:
            - хороший интерфейс должен позволять специалисту делать то, то он хочет, а не специалисту - делать то что он не умеет.

            Но всё время какие-то крайности: то система не позволяет ничего толком настроить, потому что есть одна кнопка "Сделать хорошо", которая хорошо не делает, то "зайдите в ХХХ, найдите YYY, скажите волшебное заклинание..."


            1. AndreyHenneberg
              19.07.2026 09:17

              И правда, зачем уметь пользоваться телефоном?


      1. UUI
        19.07.2026 09:17

        В современном юзабилити победила концепция "установите приложение". Она понятна и проста. А вы замечали, что половина рядовых пользователей, чтобы зайти на какой-то сайт, сначала вбивают его название в Яндекс, потом тыкают в первую ссылку?


  1. Gradiens
    19.07.2026 09:17

    вы - баба Клава, которая в телефоне только иконки видит

    Да, я - баба Клава. И я знаю, что вот есть картинка "Интернет", надо в нее тыкнуть и написать вопрос. И это - удобно, потому что картинка там же где и всегда. А "Интенет" умный, он поймет мой вопрос.

    А вот этих ваших приложений - туева, простите, хуча. Внук говорит, что из-за них у меня телефон медленный. И надо покупать новый. А зачем мне новый-то? Старый, поди, еще не сносился!

    А как ваша эта картинка выглядит я запамятовала. Нажала несколько картинок, да там совсем другое... Листаю, листаю, очки даже протерла, а все равно найти не могу...


    1. dave2
      19.07.2026 09:17

      и написать

      На десктопе - тыщу раз да. Но на телефоне что-то писать это мучительно больно и отвратительно медленно. Найти приложение и тыкнуть пальцем проще и быстрее.


  1. ArtyomOchkin
    19.07.2026 09:17

    Полностью согласен с автором.

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

    Если же оно дублирует в том или ином виде сайт, то это превращается в "лавочку" по расширенному сбору данных и статистики. Действительно лучше PWA - тут и кроссплатформенность, и лёгкость (не нагружает девайс хламом).

    Про "это могло быть сайтом" скажу больше. Есть генератор apk, делающий программу по базовому шаблону - gmaproject.ru, и тп (не реклама). Вот это настоящее барахло. По сути, под капотом скорее всего тот же html, либо слабо интерактивная нативная Android-реализация, которую с успехом можно было бы заменить на сайт.


    1. AndreyHenneberg
      19.07.2026 09:17

      Глупый вопрос: а PWA умеют принимать уведомления? Обычные приложения умеют, сайты, в лице браузера, умеют, а PWA? Я действительно не знаю.

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


      1. pae174
        19.07.2026 09:17

        Push-Notifications в PWA и браузере: полная реализация без сторонних сервисов

        https://habr.com/ru/articles/945870/


        1. AndreyHenneberg
          19.07.2026 09:17

          Спасибо! Вот помнил же, что что-то такое видел, только никак не мог вспомнить, где и когда.


  1. akakoychenko
    19.07.2026 09:17

    Есть ещё прикол. Ссаное приложение может быть недоступно в регионе твоего апстора, и это куда геморнее обойти, нежели сайт с геоблоком.

    А, вообще, прилы это североамериканская тема. Там серьёзные дяди давно поняли, что надо совать ногу в дверь потребителю в любой момент. А смешать реально срочные уведомления типа банковских транзакций или приезда такси с потоком рекламного говна ж вообще сказка... Юзер уже проклял тебя и твоих детей, единицу влепил в апсторе, а все равно говно кушает


    1. salnicoff
      19.07.2026 09:17

      Увы, это не только североамериканская тема. Это еще и российская тема.


  1. AndrewBond
    19.07.2026 09:17

    Все обсуждают тему "разве не могли сразу сделать", но почему-то никто не сказал о том, что это приложение и написано ради того, чтобы подсовывать предложения туров, рекламу и тп? Т.е. всё то, что вырезали.


  1. Aleksid1
    19.07.2026 09:17

    В РФ в нынешней ситуации, из-за риска удаления мобильного приложения очень популярны стали PWA приложения. Я подумал и просто удалил кучу обычных приложений, особенно те, которые не так часто использую. Удалил даже те приложения которые есть магазине приложений. Вместо них установил PWA версии - т.е. полноэкранное веб-приложение по ярлыку на рабочем столе.

    Особенные 3 случая:
    1. Яндекс.Погода. Вначале в веб-версии в Safari воспользовался встроенной функцией Safari - вырезание назойливой рекламы (нужно ее установить дополнение к Safari типа uBlock Origin/Adguard). Затем PWA версия автоматически тоже получила вырезанную рекламу.
    2. Для Ozon сделал PWA версию из страницы заказов. Чтобы сразу видеть статус заказа и код для получения.
    3. Для ВТБ воспользовался функцией удаления лишних блоков. Да - мобильный Safari позволяет вырезать "лишние" CSS блоки из страниц - я удалил наглого гепарда, который гуляет по главному экрану. Также вырезал все лишние блоки с мусором, который мне не нужен. По сути я кастомизировал под себя банковское приложение и все благодаря PWA.