26 марта 2020 г. API Instagram Android macOS Debug Sniffing Proxy EN In English

Чтение запросов Instagram Private API с помощью Charles Proxy

Для автоматизации управления аккаунтами в Instagram я использую различные библиотеки, которые используют так называемый Private API.

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

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

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

Reverse Engineering

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

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

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

Проксирование запросов

Но есть проблема - все запросы в Private API идут через HTTPS. Читать такой трафик невозможно, он зашифрован.

В настройках Facebook (для Instagram) можно разрешить пользовательские сертификаты и отключить TLS, этим в статье мы и займемся!

Для решения проблемы мы будем использовать Charles Proxy. С его помощью мы будем мониторить трафик от Android смартфона на десктоп (в моём случае это macOS Mojave).

Установите Charles Proxy, он запустит на вашем десктопе прокси и предложит установить его сертификаты (Help > SSL Proxying > Install Charles Root Certificate on Mobile Device or Remote Browser):

Добавляем Charles в брандмауэр macOS (Настройки > Защита и безопасность > Брандмауэр):

Отлючаем кеширование в Charles (Tools > No Caching):

Теперь нам надо перейти в Researcher Settings on Facebook и включить пользовательские сертфикаты для вашей учетной записи в Instagram:

Установите галочки напротив "Enable user installed Certificate Authorities (CAs) for your Facebook account" и "Enable user installed CAs for your Whitehat Test Accounts.", а также выберите Instagram в "Select on which apps you want to enable the Mobile Settings".

Остановите приложение Instagram на вашем смартфоне и очистите данные для этого приложения. Запустите приложение Instagram снова и нажмите "Войти через Facebook". После чего перейдите в Настройки > Служебные > Whitehat Settings и включите "Allow user installed certificates" и "Do not use TLS 1.3":


Устанавливаем сертификат Charles на смартфон

Помните, ваш смартфон и десктоп должны быть в одной локальной сети!

В настройках WiFi соединения укажите прокси, адрес которого был получен в самом первом скриншоте Charles:

Как только через этот прокси пойдут запросы, Charles предложит подтвердить соединение, жмите Allow:

Откройте браузер на смартфоне и перейдите по ссылке chls.pro/ssl, вам предложат сохранить сертификат. Откройте сертификат через "Установщи к сертифика":

И установите его:

Теперь сделаем любой запрос через приложение Instagram (просто погуляйте по интерфейсу) и помечаем хосты для использования SSL:

Резюме

В результате, у вас должно отобразиться дерево запросов к Private API:

Ну и сами запросы с заголовками тоже будут видны:

Однако, если ваш трафик выглядит примерно так:

Значит вы неверно настроили пользовательские сертификаты, оставьте развернутый комментарий к этой статье и я постараюсь вам помочь!

Читайте также:

Комментарии

У вас это точно работало для ios? У меня на android клиенте только включается internal.

Ответил по почте Кириллу и убрал упоминание iOS из статьи.
Тем кому интересно можете почитать https://habr.com/ru/company/dataart/blog/424485/

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

Markdown