Що робити якщо Instagram не дав доступ до API?

1 червня 2016 року Instagram вимкнути від свого API всі додатки, які не пройшли модерацію. Що робити якщо ви в їх числі?

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

Спочатку розповім як ми використовували офіційний API:
  1. При додаванні облікового запису забираємо з Instagram інформацію про аккаунти: ім'я, фото профайлу, кількість постів, передплатників, підписок.
  2. Перед тим як опублікувати фото/відео ми запитуємо кількість постів, і теж саме після публікації, якщо число постів збільшилася вважаємо публікацію успішною.
  3. Якщо публікація пройшла успішно забираємо посилання на останнє фото в профайлі.
  4. Якщо користувач видаляє фото з нашого сервісу, то перед тим як виконати завдання потрібно перевірити чи існує такий пост в 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 фото

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

частина з
640x640
на
1080x1080
:

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
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.