- PVSM.RU - https://www.pvsm.ru -

Что делать если Instagram не дал доступ к API?

1 июня 2016 года Instagram отключит [1] от своего API все приложения, которые не прошли модерацию. Что делать если вы в их числе?

Предыстория

Мы делаем сервис для постинга в Instagram по расписанию и используем API для получения информации об аккаунтах. Самим постингом занимаются телефоны в автоматическом режиме. Нам отказали в доступе к API после 1 июня (пробовали пройти модерацию два раза) поэтому было решено найти замену.

Сначала расскажу как мы использовали официальный API:

  1. При добавлении аккаунта забираем из Instagram информацию об аккаунте: имя, фото профайла, количество постов, подписчиков, подписок.
  2. Перед тем как опубликовать фото/видео мы запрашиваем количество постов, и тоже самое после публикации, если число постов увеличилось считаем публикацию успешной.
  3. Если публикация прошла успешно забираем ссылку на последнее фото в профайле.
  4. Если пользователь удаляет фото из нашего сервиса, то перед тем как выполнить задачу нужно проверить существует ли такой пост в Instagram (или его удалили).

Реализация

У Instagram есть веб-версия [2]. С помощью нее в приватных [3] аккаунтах можно получить информацию о количестве постов, подписок и подписчиков, а в публичных [4] еще и сами посты, комментарии и лайки. Поэтому, в силу простоты получения, я подумал, что уже написаны подобные библиотеки. Пошел гуглить и нашел только для NodeJS [5]. И для PHP [6] нашелся какой-то код, но всем четырем пунктам не соответствовал. В итоге было решено писать свою библиотеку.

Не буду вдаваться в детали, так как вы можете посмотреть код на GitHub [7]. Расскажу только ключевые моменты.

Получение информации об аккаунте

Если зайти в профайл (например, instagram.com/kevin [8]) и посмотерть исходный код страницы, то прокрутив вниз можно увидеть зашитый прямо в страницу JSON объект с информацией об аккаунте.
Довольно просто вытаскиваем его (для удобства я использовал mashape/unirest-php [9]), парсим и записываем в массив:

$response = Request::get('https://instagram.com/kevin');
$pageString = $response->body();
$arr = explode('window._sharedData = ', $pageString);
$json = explode(';</script>', $arr[1]);
$userArray = json_decode($json[0], true);
$userData = $userArray['entry_data']['ProfilePage'][0]['user'];
echo $userData['username']; // Теперь можно делать вот так
echo $userData['follows']['count'] // или вот так
echo $userData['is_private']; // ну вы поняли

Получение всех постов в аккаунте

Как оказалось, можно получить готовый JSON последних 20 постов добавив к URL аккаунта /media: https://instagram.com/kevin/media

Но, что делать если нам нужны все посты? Достаточно добавлять в URL параметр max_id с id последнего поста из 20-ки в цикле, пока все посты не кончатся: https://instagram.com/kevin/media?max_id=id. Для удобства даже есть поле more_available, которое принимает значение true или false.

Информация об отдельном посте

Что если у вас есть ссылка на пост в Instagram (например, www.instagram.com/p/9BDXa_L7bm [10]) и вы хотите получить о нем информацию? Тоже самое, что и со страницей профайла, туда вшит JSON с данными о посте.
Тоже как в первом пункте: вытаскиваем, парсим и, бум, у нас есть инфо о посте.

Бонус. Как получить фото из Instagram в лучшем качестве?

Самое лучшее качество фотографии в Instagram на данный момент 1080 пикселей. Но наше решение отдает лишь 640.
Методом тыка мы поняли, что если, например, заменить в URL фото

https://scontent.cdninstagram.com/t51.2885-15/s640x640/sh0.08/e35/12950481_1753078061593396_874826488_n.jpg

часть с 640x640 на 1080x1080:

https://scontent.cdninstagram.com/t51.2885-15/s1080x1080/sh0.08/e35/12950481_1753078061593396_874826488_n.jpg

То получим фото в максимально возможном качестве.

Заключение

В нашем случае с помощью библиотеки удалось полностью перекрыть потребности в API от Instagram.

Репозиторий: github.com/raiym/instagram-php-scraper [7]
Почти тоже самое на Java: github.com/raiym/instagram-java-scraper [11]
Сайт проекта: postaddict.me [12]

Автор: raiym

Источник [13]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/123740

Ссылки в тексте:

[1] отключит: http://techcrunch.com/2015/11/17/just-instagram/

[2] веб-версия: http://instagram.com

[3] в приватных: https://www.instagram.com/raiym/

[4] в публичных: https://www.instagram.com/kevin/

[5] NodeJS: https://github.com/slang800/instagram-screen-scrape

[6] PHP: https://gist.github.com/cosmocatalano/4544576

[7] код на GitHub: https://github.com/raiym/instagram-php-scraper

[8] instagram.com/kevin: https://instagram.com/kevin

[9] mashape/unirest-php: https://github.com/Mashape/unirest-php

[10] www.instagram.com/p/9BDXa_L7bm: https://www.instagram.com/p/9BDXa_L7bm/

[11] github.com/raiym/instagram-java-scraper: https://github.com/raiym/instagram-java-scraper

[12] postaddict.me: https://postaddict.me

[13] Источник: https://habrahabr.ru/post/302150/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox