Průvodce novým Instagram Basic Display API

Eduard Štůla
4 min readMar 26, 2020

--

Konec podpory původního API od Instagramu se blíží, proto je potřeba přejít na novější variantu. Pokud na svém webu zobrazujete příspěvky z Instagramu, bude se vám hodit nové Basic Display API. Pro ty náročnější je tu pak Instagram Graph API.

Co budete potřebovat

Vytvořte novou Facebook aplikaci

Po vytvoření aplikace přidejte platformu Website v Basic nastavení a zadejte vaši webovou adresu.

Photo by Facebook
Photo by Facebook

Přidejte produkt Instagram

Photo by Facebook

Vytvořte novou Instagram aplikaci

Photo by Facebook

Přidejte Instagramový účet jako Testera

Photo by Facebook

V nastavení profilu na Instagramu potvrďte pozvánku

Photo by Facebook

Získejte autorizační kód

Upravte následující adresu a zadejte ji do vašeho prohlížeče:

https://api.instagram.com/oauth/authorize
?client_id={app-id}
&redirect_uri={redirect-uri}
&scope=user_profile,user_media
&response_type=code

{app-id} naleznete v App Dashboard > Products > Instagram > Basic Display > Instagram App ID. {redirect-uri} URL adresa vašeho webu, kterou jste zadali při zakládání nové aplikace.

Budete přesměrováni na autorizaci Instagramu:

Photo by Facebook

Po úspěšné autorizaci budete přesměrováni na adresu vašeho webu. V přesměrované adrese najdete autorizační kód. Platný je pouze 1 hodinu.

?code=AQDp3TtBQQ…#_

Pozor, znaky #_ k autorizačnímu kódu nepatří, takže pro další práci s kódem je odmažte.

Získejte krátkodobý token

Abyste mohli přistupovat k médiím, budete potřebovat z autorizačního kódu získat token. Doplňte vyznačené údaje a vytvořte POST požadavek:

curl -X POST \
https://api.instagram.com/oauth/access_token \
-F client_id={app-id} \
-F client_secret={app-secret} \
-F grant_type=authorization_code \
-F redirect_uri={redirect-uri} \
-F code={code}

Odpovědí API by měl být token s platností 1 hodinu:

{
"access_token": "IGQVJ...",
"user_id": 17841405793187218
}

Získejte dlouhodobý token

Krátkodobý token je sice nejbezpečnější, ale vy budete potřebovat přistupovat k obsahu dlouhodobě. Rozšiřte tedy platnost tokenu:

https://graph.instagram.com/access_token
?grant_type=ig_exchange_token
&client_secret={instagram-app-secret}
&access_token={short-lived-access-token}

Tím získáte nový token s expirací 2 měsíce:

{
"access_token":"dyNTZAMUnhl...",
"token_type": "bearer",
"expires_in": 5183944
}

Získávejte pravidelně nový token

Příspěvky na webu pravděpodobně potřebujete zobrazovat déle než dva měsíce. Proto si nechávejte pravidelně token prodlužovat. Respektive za pomoci dlouhodobému tokenu získáte nový s platností na další dva měsíce:

curl -i -X GET "https://graph.instagram.com/refresh_access_token
?grant_type=ig_refresh_token
&access_token=dyNTZAMUnhl..."

Nový token s platností další dva měsíce získáte v odpovědi:

{
"access_token":"OENvdHNJz...",
"token_type": "bearer",
"expires_in": 5183944
}

Tuto činnost byste měli dělat systémově. Teoreticky třeba jednou za dva měsíce bez jednoho dne.

Příklad v PHP

<?php

$refreshTokenUrl = "https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token&access_token=" . INSTAGRAM_TOKEN;
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_URL, $refreshTokenUrl);
$result = @json_decode(curl_exec($curl_handle));
curl_close($curl_handle);

if (!empty($result->access_token)) {
//todo uložení nového tokenu
}

*příklad pro ilustraci

Získejte vaše média

Pokud máte vyřešenou práci s tokeny, můžete jednoduše získávat příspěvky z vašeho účtu na Instagramu voláním adresy:

https://graph.instagram.com/me/media?fields=id,permalink,media_type,media_url,caption&access_token=OENvdHNJz...

Výstupem je JSON s příspěvky:

I tuto činnost byste měli řídit také trochu s rozvahou. Určitě by web neměl být závislý na načítání obrázků z Instagramu. Navíc volat API při každém requestu na na váš web bude trochu při nejmenším dost pomalé.

Můžete příspěvky stahovat např. CRONem jednou za hodinu a ukládat si je do databáze. Já preferuji ukládání serializovaného pole do souborové cache webu. Většinou nepotřebuji víc jak poslední 4 příspěvky. Navíc se nechci starat o update dat v databázi, když příspěvek z Instagramu zmizí nebo je upraven popisek.

Příklad v PHP

<?php

$instagramUrl = "https://graph.instagram.com/me/media?fields=id,permalink,media_type,media_url,caption&access_token=" . INSTAGRAM_TOKEN;
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_URL, $instagramUrl);
$result = curl_exec($curl_handle);
curl_close($curl_handle);

//příspěvky z Instagramu jako asociativní pole
$instagramData = json_decode($result, true);
//Uložení dat do souboru
file_put_contents(__DIR__ . "/../temp/cache/instagram", serialize($instagramData));

*příklad pro ilustraci

Omezení Instagram Basic Display API

  • Nemáte přístup ke Stories.
  • Nemáte přístup ke komentářům.
  • Nemáte přístup ke statistikám.
  • Média kampaní nejsou k dispozici.

Podrobná dokumentace k Instagram Basic Display API najdete na adrese https://developers.facebook.com/docs/instagram-basic-display-api/

Povedlo se? Dejte vědět do komentáře :)

--

--