Перехват трафика мобильного приложения: гайд по MITMProxy

📝 Кратко: Веб-версии сайтов часто перегружены защитой, в то время как мобильные API остаются более открытыми. Мы разберем, как выполнить перехват трафика мобильного приложения с помощью MITMProxy, чтобы извлечь скрытые эндпоинты и автоматизировать сбор данных на Python.
Перехват трафика мобильного приложения с помощью MITMProxy и Python

Приветствую всех читателей моего блога! Если вы когда-нибудь пытались распарсить данные крупного маркетплейса или сервиса доставки, то наверняка замечали: на сайте стоит мощная защита от ботов, лимиты на запросы и бесконечные капчи. Но есть один секрет — мобильные приложения тех же сервисов зачастую общаются с сервером через «облегченные» API, где защиты в разы меньше, а данных — больше. В этой статье я, как человек, съевший собаку на реверс-инжиниринге мобильных запросов, покажу вам, как настроить перехват трафика мобильного приложения и заставить его API работать на ваши Python-скрипты.

Зачем нужен перехват трафика мобильного приложения?

Когда мы работаем с браузером, нам достаточно нажать F12, открыть вкладку Network и увидеть все запросы. С мобильными устройствами всё сложнее: операционные системы Android и iOS изолируют процессы, и просто так «подсмотреть» в сетевой стек не получится. Однако архитектура клиент-серверного взаимодействия остается прежней — приложение отправляет HTTP/HTTPS запросы.

Чтобы выполнить анализ трафика мобильного приложения, нам нужно встать «посередине» между смартфоном и интернетом. Этот метод называется Man-in-the-Middle (MITM). Основная цель здесь — понять, как узнать API мобильного приложения, какие заголовки (headers) оно использует для авторизации и в каком формате (обычно JSON) приходят данные. Порой один такой перехваченный запрос заменяет часы борьбы с селекторами на сайте, так как вы получаете чистые данные напрямую от сервера.

Почему именно MITMProxy?

Существует множество инструментов для прослушки трафика, таких как Charles Proxy или Fiddler. Однако для Python-разработчика MITMProxy является предпочтительным вариантом. Во-первых, это инструмент с открытым исходным кодом, написанный на Python. Во-вторых, он имеет консольный интерфейс, веб-интерфейс и, что самое важное, позволяет писать скрипты на Python для автоматической обработки перехваченных данных «на лету».

📚 Документация: MITMProxy Introduction «mitmproxy — это бесплатный интерактивный HTTPS-прокси с открытым исходным кодом. Он может использоваться для перехвата, проверки, изменения и воспроизведения трафика.»

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

Как посмотреть трафик приложения: пошаговая настройка

Для того чтобы реализовать перехват трафика мобильного приложения, нам понадобится компьютер и смартфон (или эмулятор Android), находящиеся в одной Wi-Fi сети.

Шаг 1: Установка и запуск

Установите mitmproxy на ваш компьютер. Проще всего это сделать через терминал. После установки запустите веб-интерфейс инструмента командой mitmweb.

pip install mitmproxy
mitmweb

После этого откроется браузер по адресу http://127.0.0.1:8081. Теперь ваш компьютер готов принимать трафик на порту 8080.

Шаг 2: Настройка смартфона

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

  1. Зайдите в настройки Wi-Fi на телефоне.
  2. Найдите активную сеть и выберите «Настройки прокси».
  3. Установите «Вручную» и введите IP-адрес вашего компьютера и порт 8080.

Шаг 3: Установка SSL-сертификата

Это самый критический момент. Без сертификата вы сможете увидеть только обычный HTTP-трафик, а HTTPS (который сейчас везде) будет зашифрован.

  1. На смартфоне откройте браузер и перейдите на сайт mitm.it.
  2. Выберите иконку вашей ОС (Android или iOS) и скачайте сертификат.
  3. Установите его в систему. На Android 10+ вам может потребоваться установить его как «Сертификат доверенного центра» в разделе безопасности.

Анализ трафика мобильного приложения и поиск эндпоинтов

После настройки вы увидите в окне mitmweb поток запросов. Запустите на телефоне интересующее вас приложение. Вы увидите сотни строк, но нас интересуют только те, что относятся к целевому сервису. Используйте фильтр (например, ~u domain.com), чтобы отсечь лишнее.

Обратите внимание на:

  • Request URL: Куда именно приложение обращается за данными.
  • Headers: Ищите поля Authorization, X-App-Version, Token. Без них сервер может отклонить ваш запрос из Python.
  • Response Body: Обычно там находится JSON с теми самыми данными, которые вы хотите распарсить.

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

Как узнать API мобильного приложения и повторить запрос

Когда нужный запрос найден, кликните по нему. В MITMProxy есть вкладка «Copy as cURL». Это ваш «золотой ключ». Скопируйте этот запрос и воспользуйтесь любым онлайн-конвертером (например, https://curlconverter.com/python/), чтобы превратить его в готовый код на библиотеке requests.

Однако помните, что API мобильных приложений часто требует динамических параметров (например, временную метку timestamp или подпись запроса sign). Если вы видите непонятные хэши в запросе, значит, приложение использует криптографическую подпись, и это следующая ступень сложности. Но для 80% приложений достаточно просто скопировать заголовки.

📚 Документация: Requests: Quickstart «Requests позволяет отправлять HTTP/1.1 запросы с помощью Python. Вам не нужно вручную добавлять строки запроса в URL-адреса или кодировать данные POST.»

Автоматизация на Python: от перехвата к парсеру

Теперь, когда у нас есть понимание структуры, напишем полноценный скрипт. Мы будем использовать асинхронный подход, чтобы собирать данные максимально быстро. Если вы еще не знакомы с быстрой установкой библиотек, посмотрите наш гайд про пакетный менеджер uv, он сэкономит вам массу времени.

import asyncio
import httpx

async def get_app_data():
    # URL который мы узнали через MITMProxy
    url = "https://api.target-app.com/v1/products"
    
    # Заголовки, которые мы скопировали из перехваченного трафика
    headers = {
        "User-Agent": "TargetApp/2.4.0 (iPhone; iOS 15.0; Scale/3.00)",
        "Authorization": "Bearer YOUR_TOKEN_HERE",
        "Accept": "application/json"
    }
    
    # Параметры запроса (Query Params)
    params = {
        "category_id": "123",
        "page": "1"
    }

    async with httpx.AsyncClient() as client:
        response = await client.get(url, headers=headers, params=params)
        
        if response.status_code == 200:
            data = response.json()
            # Глубокий анализ полученного JSON
            for item in data.get('items', []):
                print(f"Найдено: {item.get('name')} - Цена: {item.get('price')}")
        else:
            print(f"Ошибка: {response.status_code}")

if __name__ == "__main__":
    asyncio.run(get_app_data())

Подробное объяснение кода:

  1. Библиотека httpx: Мы используем её вместо requests, так как она поддерживает асинхронность (async/await), что критично для парсинга больших объемов данных.
  2. headers: Это критическая часть. Приложения часто проверяют User-Agent. Если там будет написано «python-requests», сервер заблокирует запрос. Мы вставляем тот, что подсмотрели через перехват трафика мобильного приложения.
  3. params: Это параметры, которые идут после знака ? в URL. MITMProxy наглядно раскладывает их в интерфейсе.
  4. data.get(): Всегда используйте метод .get() при работе со словарями JSON, чтобы ваш скрипт не упал с ошибкой KeyError, если сервер внезапно изменит структуру ответа.

Сложности: SSL Pinning

Если вы настроили прокси, установили сертификат, но приложение пишет «Ошибка сети» или «Нет соединения», вы столкнулись с SSL Pinning. Это защитный механизм, при котором приложение «знает» сертификат своего сервера в лицо и отказывается доверять вашему сертификату MITMProxy.

В этом случае анализ трафика мобильного приложения усложняется. Вам потребуется либо использовать специальные скрипты для Frida (инструмент для динамической инструментации кода), либо патчить APK-файл приложения, чтобы отключить проверку сертификата. Это глубокая тема, требующая отдельной статьи, но знайте: любой SSL Pinning можно обойти.

Заключение

Перехват трафика мобильного приложения — это мощнейший навык в арсенале любого специалиста по данным. Он позволяет обходить ограничения веб-сайтов и получать доступ к API, который не предназначен для публичного использования. Освоив MITMProxy и научившись переносить запросы в Python, вы сможете автоматизировать сбор практически любой информации. Если вам интересно, что делать с данными дальше, например, как создать свой сервис на их основе, изучите наше руководство по работе с FastAPI Python.

🔁 Больше полезных материалов по парсингу и автоматизации:
Работа с FastAPI Python: создание API с нуля — постройте свой сервис на основе собранных данных
Как писать чистый и читаемый код на Python — основы, без которых ваш парсер превратится в хаос
10 ошибок новичков в Python — проверьте себя, чтобы не допускать типичных промахов
💬 Остались вопросы? Пишите в комментариях — с радостью уточню, дополню или помогу с вашим кодом.
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и разные трюки на Python.
👉 Ваш интерес — лучшая мотивация для новых статей!

Оставьте комментарий