
Приветствую всех читателей моего блога! Если вы когда-нибудь пытались распарсить данные крупного маркетплейса или сервиса доставки, то наверняка замечали: на сайте стоит мощная защита от ботов, лимиты на запросы и бесконечные капчи. Но есть один секрет — мобильные приложения тех же сервисов зачастую общаются с сервером через «облегченные» 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: Настройка смартфона
Теперь нам нужно объяснить смартфону, что весь трафик должен идти через наш компьютер.
- Зайдите в настройки Wi-Fi на телефоне.
- Найдите активную сеть и выберите «Настройки прокси».
- Установите «Вручную» и введите IP-адрес вашего компьютера и порт
8080.
Шаг 3: Установка SSL-сертификата
Это самый критический момент. Без сертификата вы сможете увидеть только обычный HTTP-трафик, а HTTPS (который сейчас везде) будет зашифрован.
- На смартфоне откройте браузер и перейдите на сайт
mitm.it. - Выберите иконку вашей ОС (Android или iOS) и скачайте сертификат.
- Установите его в систему. На 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())
Подробное объяснение кода:
- Библиотека httpx: Мы используем её вместо
requests, так как она поддерживает асинхронность (async/await), что критично для парсинга больших объемов данных. - headers: Это критическая часть. Приложения часто проверяют
User-Agent. Если там будет написано «python-requests», сервер заблокирует запрос. Мы вставляем тот, что подсмотрели через перехват трафика мобильного приложения. - params: Это параметры, которые идут после знака
?в URL. MITMProxy наглядно раскладывает их в интерфейсе. - 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.
👉 Ваш интерес — лучшая мотивация для новых статей!