Průvodce novým Instagram Basic Display API
--
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
- Facebook Developer Account
- Instagram account
- Vlastní webovou adresu
- Terminal nebo aplikaci Postman pro cURL requesty
Vytvořte novou Facebook aplikaci
Po vytvoření aplikace přidejte platformu Website v Basic nastavení a zadejte vaši webovou adresu.
Přidejte produkt Instagram
Vytvořte novou Instagram aplikaci
Přidejte Instagramový účet jako Testera
V nastavení profilu na Instagramu potvrďte pozvánku
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:
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 :)