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

С одной стороны, все логично и может быть легко объяснено. Это просто способ защиты соцсети от массовых накруток аккаунтов, от автоматизации процессов постинга и проч. Принимая это во внимание, можно предположить, что Instagram позиционирует себя как социальная сеть, все виды взаимодействия с которой могут быть произведены только вручную. К сожалению, это ограничивает многих, ведь помимо «незаконных» действий с инстаграмом можно было бы разрабатывать альтернативные клиенты для этой соцсети, ведь давно уже не секрет, что официальный (и единственный) клиент обладает рядом дико раздражающих минусов (плохо реализованный Material Design, например, или отсутствие ландшафтной ориентации на Android, или полное отсутствие версии для iPad и проч.).

Но, оставим позади все эти причины и поговорим о том, как эти ограничения можно обойти.

Сначала немного теории. Можно выяснить двумя способами какие запросы отправляются на Instagram, с какими параметрами и заголовками, чтобы их можно было подделать. Первый (чуть сложнее) — это снифить трафик на вашем устройстве (Android + Mac + Charles Proxy, например). Второй — это использовать Firebug для тех же целей. Я решил пойти по второму пути.

В Instagram активно используется Ajax для различных запросов из браузера, результатом которого получается легко распарсиваемый json. Немного поизучав запросы и ответы и поигравшись с ними в каком-нибудь Rest клиенте, можно сделать следующий вывод: эти запросы можно довольно легко подделать, если знать отправляемый CSRF токен (который как бы подтверждает, что вы работаете с инстаграмом с помощью «разрешенного» клиента — браузера) и куки.

Первое, что необходимо, это подготовить WebView, в которой будет открываться форма авторизации в Instagram. Нам нужен «перехватчик» — javascript интерфейс, который будет вызываться в момент загрузки страницы, и который будет искать нужную нам информацию на ней.

Ну и сам javascript интерфейс с парсером на пару

Давайте немного разберем что тут происходит. После того, как страница загружается в WebView, javascriptinterface сканирует полученный html. Все что ему надо найти — это json атрибут в коде страницы с параметром «viewer». Там хранится базовая информация о вашем аккаунте — имя, ссылка на картинку, и проч. Для нас это маячок, что авторизация прошла успешно и можно получать интересующие нас данные. С помощью того же объекта htmlparser мы получаем CSRF токен, а стандартный метод CookieManager.getInstance().getCookie позволит нам получить куки в виде строки. Эти данные необходимо сохранить.

В документации инстаграма написано, что токен, выдаваемый сервисом, вечный. На моей практике 1 раз произошел случай, когда токен перестал работать в какой-то момент, но вместе с этим я получил сообщение о том, что Instagram сменил пароль на моем аккаунте. Да, операции там производились немного подозрительные, к слову.

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

Вся магия (то есть заполнение заголовков запроса нашими данными) выполняется в методе builder.addNetworkInterceptor.

В Instagram есть точки доступа для выполнения операций, типа like / follow и проч. Для вывода постов используется метод query, но о нем, если интересно, мы поговорим как-нибудь в следующий раз.

P.S. Пример того, как работает приложение с использованием запросов, доступен для скачивания на нашем сайте. Looking For Friends on Instagram — это приложение для автоматизации продвижения вашего аккаунта в сети Instagram.