1 июня 2016 года Instagram отключит от своего API все приложения, которые не прошли модерацию. Что делать если вы в их числе?
Мы делаем сервис для постинга в Instagram по расписанию и используем API для получения информации об аккаунтах. Самим постингом занимаются телефоны в автоматическом режиме. Нам отказали в доступе к API после 1 июня (пробовали пройти модерацию два раза) поэтому было решено найти замену.
Сначала расскажу как мы использовали официальный API:
У Instagram есть веб-версия. С помощью нее в приватных аккаунтах можно получить информацию о количестве постов, подписок и подписчиков, а в публичных еще и сами посты, комментарии и лайки. Поэтому, в силу простоты получения, я подумал, что уже написаны подобные библиотеки. Пошел гуглить и нашел только для NodeJS. И для PHP нашелся какой-то код, но всем четырем пунктам не соответствовал. В итоге было решено писать свою библиотеку.
Не буду вдаваться в детали, так как вы можете посмотреть код на GitHub. Расскажу только ключевые моменты.
Если зайти в профайл (например, instagram.com/kevin) и посмотерть исходный код страницы, то прокрутив вниз можно увидеть зашитый прямо в страницу JSON объект с информацией об аккаунте.
Довольно просто вытаскиваем его (для удобства я использовал mashape/unirest-php), парсим и записываем в массив:
Как оказалось, можно получить готовый JSON последних 20 постов добавив к URL аккаунта
Но, что делать если нам нужны все посты? Достаточно добавлять в URL параметр
Что если у вас есть ссылка на пост в Instagram (например, www.instagram.com/p/9BDXa_L7bm) и вы хотите получить о нем информацию? Тоже самое, что и со страницей профайла, туда вшит JSON с данными о посте.
Тоже как в первом пункте: вытаскиваем, парсим и, бум, у нас есть инфо о посте.
Самое лучшее качество фотографии в Instagram на данный момент
Методом тыка мы поняли, что если, например, заменить в URL фото
часть с
То получим фото в максимально возможном качестве.
В нашем случае с помощью библиотеки удалось полностью перекрыть потребности в API от Instagram.
Репозиторий: github.com/raiym/instagram-php-scraper
Почти тоже самое на Java: github.com/raiym/instagram-java-scraper
Сайт проекта: postaddict.me
Update: Большое спасибо simpel и toly за информацию. На основе ваших комментариев были перписаны запросы к Instagram и добавлены новые.
Update 2 (2 декабря 2016): Развитие библиотеки ушло довольно далеко после публикации данной статьи (добавлены: получение информации о пользователе по id, получение комментариев, пагинация по тегам, получение фото в лучшем доступном качестве, поиск и т.д.), поэтому советуем смотреть репозиторий.
Update 3 (16 марта 2017): Пару дней назад Instagram обновился. Теперь, например, для получения фотографий по тегу требуется авторизация. Сегодня добавили это в библиотеку.
Предыстория
Мы делаем сервис для постинга в Instagram по расписанию и используем API для получения информации об аккаунтах. Самим постингом занимаются телефоны в автоматическом режиме. Нам отказали в доступе к API после 1 июня (пробовали пройти модерацию два раза) поэтому было решено найти замену.
Сначала расскажу как мы использовали официальный API:
- При добавлении аккаунта забираем из Instagram информацию об аккаунте: имя, фото профайла, количество постов, подписчиков, подписок.
- Перед тем как опубликовать фото/видео мы запрашиваем количество постов, и тоже самое после публикации, если число постов увеличилось считаем публикацию успешной.
- Если публикация прошла успешно забираем ссылку на последнее фото в профайле.
- Если пользователь удаляет фото из нашего сервиса, то перед тем как выполнить задачу нужно проверить существует ли такой пост в Instagram (или его удалили).
Реализация
У Instagram есть веб-версия. С помощью нее в приватных аккаунтах можно получить информацию о количестве постов, подписок и подписчиков, а в публичных еще и сами посты, комментарии и лайки. Поэтому, в силу простоты получения, я подумал, что уже написаны подобные библиотеки. Пошел гуглить и нашел только для NodeJS. И для PHP нашелся какой-то код, но всем четырем пунктам не соответствовал. В итоге было решено писать свою библиотеку.
Не буду вдаваться в детали, так как вы можете посмотреть код на GitHub. Расскажу только ключевые моменты.
Получение информации об аккаунте
Если зайти в профайл (например, instagram.com/kevin) и посмотерть исходный код страницы, то прокрутив вниз можно увидеть зашитый прямо в страницу JSON объект с информацией об аккаунте.
Довольно просто вытаскиваем его (для удобства я использовал mashape/unirest-php), парсим и записываем в массив:
$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) и вы хотите получить о нем информацию? Тоже самое, что и со страницей профайла, туда вшит 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
Почти тоже самое на Java: github.com/raiym/instagram-java-scraper
Сайт проекта: postaddict.me
Update: Большое спасибо simpel и toly за информацию. На основе ваших комментариев были перписаны запросы к Instagram и добавлены новые.
Update 2 (2 декабря 2016): Развитие библиотеки ушло довольно далеко после публикации данной статьи (добавлены: получение информации о пользователе по id, получение комментариев, пагинация по тегам, получение фото в лучшем доступном качестве, поиск и т.д.), поэтому советуем смотреть репозиторий.
Update 3 (16 марта 2017): Пару дней назад Instagram обновился. Теперь, например, для получения фотографий по тегу требуется авторизация. Сегодня добавили это в библиотеку.