{"id":1287,"date":"2021-07-14T13:54:52","date_gmt":"2021-07-14T13:54:52","guid":{"rendered":"https:\/\/www.giuseppemaccario.com\/it\/?p=1287"},"modified":"2021-07-15T08:44:45","modified_gmt":"2021-07-15T08:44:45","slug":"come-integrare-instagram-basic-display-api-in-php-7","status":"publish","type":"post","link":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/","title":{"rendered":"Come integrare Instagram Basic Display API in PHP 7"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduzione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Questo articolo tratta di <a href=\"https:\/\/developers.facebook.com\/docs\/instagram-api\/\" target=\"_blank\" rel=\"noreferrer noopener\">Instagram Graph API<\/a>, in particolare di come integrare le Instagram Basic Display API in PHP 7, e offre una soluzione per integrare sul proprio sito web le chiamate API verso il proprio profilo Instagram, recuperarne i media per poi renderli disponibili sul proprio sito web. Tutto questo utilizzando appunto <a href=\"https:\/\/www.php.net\/\" target=\"_blank\" rel=\"noreferrer noopener\">PHP<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si tratta quindi di una piccola applicazione PHP che pu\u00f2 risiedere in una sottocartella del proprio sito web ed essere modificata a piacimento per salvare i media in percorsi diversi da quello codificato in questa applicazione di partenza.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;unico prerequisito, oltre alla conoscenza di PHP, \u00e8 avere <a href=\"https:\/\/getcomposer.org\/\">Composer<\/a> gi\u00e0 installato, o installarlo se necessario, perch\u00e9 installeremo diversi pacchetti PHP per rendere le cose pi\u00f9 semplici e lo sviluppo pi\u00f9 rapido. Utile per poi gestirne le dipendenze.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tutto il codice si trova su Github, disponibile per aggiornamenti, modifiche e bug fixing:<br><a href=\"https:\/\/github.com\/gmaccario\/instagram-basic-display-api-php-integration\" target=\"_blank\" rel=\"noreferrer noopener\">gmaccario\/instagram-basic-display-api-php-integration<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Le API di Instagram<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una cosa molto importante da tenere in considerazione \u00e8 che ci sono due tipi di Instagram API:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Instagram Graph API<\/strong>: queste API sono destinate alle aziende e ai creatori di Instagram che hanno bisogno di conoscere e controllare completamente tutte le loro interazioni sui social media;<\/li><li><strong>Instagram Basic Display API<\/strong>: queste API possono essere utilizzate per accedere a qualsiasi tipo di account Instagram, ma fornisce solo l&#8217;accesso in lettura ai dati di base.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In poche parole: Instagram Graph API serve se state costruendo un&#8217;app che permetter\u00e0 alle aziende o ai creatori di Instagram di pubblicare media, moderate i commenti, identificare i media @citati e #&#8221;hashtaggati&#8221;, o ottenere dati su altri utenti di Instagram, mentre le Instagram Basic Display API possono essere utilizzate per accedere a qualsiasi tipo di account Instagram, ma fornisce solo l&#8217;accesso in lettura ai dati di base.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questo articolo si occupa di <strong>Instagram Basic Display API<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La semplicit\u00e0<\/h2>\n\n\n\n<pre class=\"wp-block-verse\">La semplicit\u00e0 di caricare una foto su Instagram e ritrovarla poco dopo sul proprio sito web. <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poco tempo fa (Giugno 2021) ho integrato le Instagram Basic Display API sul sito di un cliente che voleva un modo semplice di aggiungere nuove foto sul proprio sito web. Il cliente in questione \u00e8 il proprietario di un ristorante che utilizza Instagram piuttosto frequentemente per condividere le migliori foto dei piatti del ristorante. Un CMS come <a href=\"https:\/\/wordpress.org\/\">WordPress<\/a> ad esempio \u00e9 certamente un sistema molto semplice da utilizzare, non servono conoscenze estreme di informatica, anzi! Per\u00f3 bisogna tenere conto delle esigenze del cliente. Per il proprietario di un ristorante che gi\u00e0 usa e conosce molto bene Instagram anche a livello personale, \u00e9 molto pi\u00f9 semplice aprire l&#8217;app di Instagram e condividere una foto appena scattata piuttosto che:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>aprire il browser, fare il login sul proprio sito in WordPress<\/li><li>cliccare su Media nella barra laterale del pannello di amministrazione<\/li><li>cliccare su Aggiungi nuovo<\/li><li>cercare l&#8217;immagine sul proprio device e caricare una nuova foto<\/li><li>impostare titolo e caption<\/li><li>inserirla poi nella gallery corretta\u2026<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Vi assicuro che per una persona non tecnicamente esperta, impegnata quotidianamente in un lavoro lontano dal digitale, e che probabilmente ha molto poco tempo per stare in rete, caricare una foto sul proprio sito WordPress non \u00e9 una cosa semplice e immediata. Per questo ho realizzato questa integrazione PHP\/Instagram.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ho creato quindi uno script che tramite un <strong>Long Lived Token<\/strong> si connette a Instagram e recupera i media presenti sul proprio profilo Instagram. A quel punto \u00e8 molto semplice salvarle sul proprio server: i media su filesystem e i metadati su database, o su file di testo come json. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vediamo ora come implementare lo script, che verr\u00e0 richiamato tramite un cron job.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Composer e autoload<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avvalendoci di Composer abbiamo la possibilit\u00e0 di scrivere un solo include (o require) e richiamare un unico file per fare in modo che i file delle nostre classi siano inclusi <em>automagicamente<\/em>. Il file in questione \u00e8 il file <strong>autoload.php<\/strong> dentro la cartella <em>vendor<\/em>. Creiamo un file chiamato <em>composer.json<\/em> all&#8217;interno della cartella principale del progetto e definiamo il percorso di ricerca che servir\u00e0 per caricare le nostre classi , <a href=\"https:\/\/www.php-fig.org\/psr\/psr-4\/\">in questo formato<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"autoload\": {\n        \"psr-4\": {\n            \"App\\\\\": \"src\/app\/\"\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>App<\/strong> \u00e8 il namespace usato dalle nostre classi che si troveranno nel percorso <strong>.\/src\/app\/<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apriamo un terminale, spostiamoci all&#8217;interno della cartella del nostro progetto e lanciamo il comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer update -vvv <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il parametro -vvv indica la verbosit\u00e0 del log nel terminale, usato per scopo di debugging, stamper\u00e0 a video tutti i passaggi in esecuzione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Composer creer\u00e0 la cartella <em>vendor<\/em> e da questo momento siamo in grado di richiamare le classi all&#8217;interno del progetto tramite i loro namespace senza dover necessariamente includere il percorso dei loro file con molteplici include o require.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In ultimo, dobbiamo includere l&#8217;autoloader nel nostro file di entry point. Iniziamo con il creare un file <em>index.php<\/em> nella cartella principale del progetto e scriviamo questo codice al suo interno:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>require __DIR__ . '\/vendor\/autoload.php';<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Il file .htaccess<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Siamo pronti per scrivere le nostre classi in <strong>.\/src\/app\/<\/strong> e richiamarle utilizzando i loro namespace. Vedremo dopo il codice specifico, ma prima mettiamo in sicurezza la cartella principale del progetto utilizzando il file <em>.htaccess<\/em> (per Apache) e inviamo tutte le richieste in arrivo verso un unico file: il file <em>index.php<\/em> nella cartella <em>public<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Creiamo quindi un file <em>.htaccess<\/em> nella cartella principale del progetto e scriviamo questo codice al suo interno:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RewriteEngine On \nRewriteRule ^$ public\/index.php &#91;L]\nRewriteRule ^((?!public\/).*)$ public\/$1 &#91;L,NC]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Creiamo una cartella <em>.\/public<\/em> e spostiamo il precente <em>.\/index.php<\/em> dentro la cartella <em>.\/public<\/em>. In ultimo modifichiamo il percorso dell&#8217;autoloader, aggiungendo un livello:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>require __DIR__ . '\/..\/vendor\/autoload.php';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tutte le richieste in arrivo saranno ora inviate a <em>.\/public\/index.php<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entry point<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;entry point della nostra applicazione \u00e9 quindi <em>.\/public\/index.php<\/em> e per ora si occupa di richiamare l&#8217;autoloader. In seguito si occuper\u00e0 anche di capire gli input dell&#8217;utente per poi eseguire l&#8217;operazione corretta. In questa applicazione di esempio non installeremo un sistema di routing, per cui gli input dell&#8217;utente saranno intercettati da funzioni native di PHP, nello specifico <em>filter_input<\/em>, sanitizzati e filtrati per lanciare la logica corretta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le azioni principali dell&#8217;applicazione sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>il login su Instagram<\/li><li>il recupero del codice OAuth di callback<\/li><li>la richiesta per un Long Lived Token e il suo salvataggio crittografato<\/li><li>il recupero dei media e il loro salvataggio.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Configurazione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Creiamo un file di configurazione per essere in grado di manipolare lo scorrere degli eventi. Creiamo quindi una cartella <em>.\/config<\/em> in cui creiamo il file <em>config.php<\/em>. Il file ritorner\u00e0 una lista PHP, ecco il suo contenuto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \n\nreturn array(\n    'secretKey'     =&gt; '', \/\/ chiave usata per crittografare il token\n    'appId'         =&gt; '', \/\/ Instagram App ID\n    'appSecret'     =&gt; '', \/\/ Instagram App Secret\n    'redirectUri'   =&gt; '', \/\/ Valid OAuth Redirect URIs\n\n    'limit_per_page'=&gt; 8,\n\n    'exclude'       =&gt; array(\n        \/\/ lista di nomi di file IG da escluedere, es. '1262329994_225747415234351_9142654959463375561_n.jpg',\n    ),\n\n    'debug'         =&gt; true,\n    'token_file'    =&gt; '..' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'token.json', \/\/ nome del file in cui verr\u00e0 salvato il token crittografato\n);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Espresso Instagram Basic Display API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Per ottenere le informazioni del nostro account Instagram a livello di codice PHP, possiamo scrivere tutte le chiamate necessarie utlizzando la libreria <a href=\"https:\/\/www.php.net\/manual\/en\/book.curl.php\">cURL (Client URL Library) di PHP<\/a>, oppure utilizzare un semplice wrapper PHP che <a href=\"https:\/\/github.com\/espresso-dev\/instagram-basic-display-php\">si pu\u00f3 trovare a questo indirizzo<\/a>. Useremo composer per installarlo nel nostro progetto. Apriamo un terminale, spostiamoci all&#8217;interno della cartella del nostro progetto e lanciamo il comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer require espresso-dev\/instagram-basic-display-php<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vedremo dopo come utilizzare il wrapper, nel frattempo, oltre il log del terminale, possiamo aprire la cartella <em>.\/vendor<\/em> per controllare che la nuova cartella <em>espresso-dev<\/em> sia stata effettivamente installata.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Le altre librerie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Con composer sottomano, installiamo anche il resto delle librerie che useremo nell&#8217;applicazione:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer require lablnet\/encryption\ncomposer require monolog\/monolog\ncomposer require nesbot\/carbon<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La prima verr\u00e0 usata per la crittografia del token, la seconda ci mette a disposizione una semplice interfaccia per salvare messaggi di log e la terza la useremo per lavorare con le date.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Le classi dell&#8217;applicazione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le classi della nostra applicazione devono essere salvate nella cartella <em>.\/src\/app\/<\/em> come abbiamo visto precedentemente nella sezione a proposito di Composer. La classi di cui abbiamo bisogno sono:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>IGBase: classe padre che contiene alcuni metodi comuni;<\/li><li>IGMedia: usata per ottenere i media da Instagram;<\/li><li>IGToken: usata per le operazioni sul token.<\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">IGBase<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Contiene i metodi utilizzati dalle sue classi figlie <em>getInstagramBasicDisplayByKeys()<\/em> e <em>getInstagramBasicDisplayByToken()<\/em> che ritornano un oggetto InstagramBasicDisplay del wrapper <em>Espresso Instagram Basic Display API<\/em>. In pi\u00f9, nel costruttore gli viene passato l&#8217;array di configurazione, cos\u00ec che sar\u00e0 disponibile anche alle classi che estendono IGBase.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \n\nnamespace App;\n\nuse Lablnet\\Encryption;\nuse EspressoDev\\InstagramBasicDisplay\\InstagramBasicDisplay;\n\nclass IGBase\n{\n    \/\/ Protected because I need it in child classes, same for methods\n    protected $config;\n\n    public function __construct(array $config)\n    {\n        $this-&gt;config = $config;\n    }\n\n    public function getInstagramBasicDisplayByKeys()\n    {\n        return new InstagramBasicDisplay(&#91;\n            'appId'         =&gt; $this-&gt;config&#91;'appId'],\n            'appSecret'     =&gt; $this-&gt;config&#91;'appSecret'],\n            'redirectUri'   =&gt; $this-&gt;config&#91;'redirectUri'],\n        ]);\n    }\n\n    protected function getInstagramBasicDisplayByToken()\n    {\n        if(!\\file_exists($this-&gt;config&#91;'token_file']))\n        {\n            die('Please, set up your long live token before anything else. Check out the README file.');\n        }\n\n        \/\/ Get long lived token from config json\n        $tokenInfo = json_decode(file_get_contents($this-&gt;config&#91;'token_file']), true);\n\n        \/\/ Decrypt the token\n        $encryption = new Encryption($this-&gt;config&#91;'secretKey']);\n        $decryptedToken = $encryption-&gt;decrypt($tokenInfo&#91;\"access_token\"]);    \n\n        \/\/ Instantiate a new InstagramBasicDisplay object\n        $instagram = new InstagramBasicDisplay($decryptedToken);\n\n        \/\/ Set user access token\n        $instagram-&gt;setAccessToken($decryptedToken);\n\n        return $instagram;\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">IGMedia<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Contiene il metodo <em>getMedia()<\/em> che ritorna il valore codificato in json della chiamata <em>curl_exec()<\/em> del wrapper InstagramBasicDisplay.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \n\nnamespace App;\n\nclass IGMedia extends IGBase\n{\n    public function __construct(array $config)\n    {\n        parent::__construct($config);\n    }\n\n    public function getMedia()\n    {\n        $instagram = $this-&gt;getInstagramBasicDisplayByToken();\n\n        return $instagram-&gt;getUserMedia('me', $this-&gt;config&#91;'limit_per_page']);\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Questa invece la risposta di <em>getMedia()<\/em>, o meglio, la risposta ottenuta da <em>$instagram-&gt;getUserMedia()<\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>stdClass Object\n(\n    &#91;data] =&gt; Array\n        (\n            &#91;0] =&gt; stdClass Object\n                (\n                    &#91;caption]\n                    &#91;id]\n                    &#91;media_type] | es. IMAGE\n                    &#91;media_url] \n                    &#91;permalink] \n                    &#91;timestamp] \n                    &#91;username] \n                )\n\n            &#91;1] =&gt; stdClass Object\n                (\n                    &#91;caption]\n                    &#91;id]\n                    &#91;media_type] | es. IMAGE\n                    &#91;media_url] \n                    &#91;permalink] \n                    &#91;timestamp] \n                    &#91;username] \n                )\n\n            &#91;2] =&gt; stdClass Object\n                (\n                    &#91;caption]\n                    &#91;id]\n                    &#91;media_type] | es. IMAGE\n                    &#91;media_url] \n                    &#91;permalink] \n                    &#91;timestamp] \n                    &#91;username] \n                )\n\n        )\n\n    &#91;paging] =&gt; stdClass Object\n        (\n            &#91;cursors] =&gt; stdClass Object\n                (\n                    &#91;before] =&gt; \n                    &#91;after] =&gt; \n                )\n\n            &#91;next] =&gt; \n        )\n\n)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;attributo <em>paging<\/em> rappresenta la paginazione ritornata da Instagram, grazie alla quale ci possiamo muovere tra pagine di risultati.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">IGToken<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Contiene i metodi usati per salvare il <em>Long Lived Token<\/em> crittografato in un file dentro la cartella <em>.\/config<\/em> e per richiedere un nuovo token in vista della scadenza del precedente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \n\nnamespace App;\n\nuse Carbon\\Carbon;\nuse Lablnet\\Encryption;\n\nclass IGToken extends IGBase\n{\n    private $longLivedToken;\n\n    public function __construct(array $config, string $longLivedToken = '')\n    {\n        parent::__construct($config);\n\n        $this-&gt;longLivedToken = $longLivedToken;\n    }\n\n    public function getLongLivedToken()\n    {\n        return $this-&gt;longLivedToken;\n    }\n\n    public function setLongLivedToken(string $token)\n    {\n        return $this-&gt;longLivedToken = $token;\n    }\n\n    public function encryptNewToken()\n    {\n        if(!$this-&gt;longLivedToken)\n        {\n            die('Please, send the right value for the long-lived-token parameter.');\n        }\n\n        \/\/ Encrypt the token\n        $encryption = new Encryption($this-&gt;config&#91;'secretKey']);\n        $cryptedToken = $encryption-&gt;encrypt($this-&gt;longLivedToken);\n\n        \/\/ Save on file for later\n        return file_put_contents($this-&gt;config&#91;'token_file'], json_encode(\n            array(\n                \"access_token\" =&gt; $cryptedToken,\n                \"token_type\" =&gt; 'init',\n                \"expires_in\" =&gt; Carbon::now()-&gt;addMonths(2)-&gt;timestamp,\n            )\n        ));\n    }\n\n    public function refreshToken()\n    {\n        \/\/ Get long lived token from config json\n        $tokenInfo = json_decode(file_get_contents($this-&gt;config&#91;'token_file']), true);\n\n        \/\/ Decrypt the token\n        $encryption = new Encryption($this-&gt;config&#91;'secretKey']);\n        $decryptedToken = $encryption-&gt;decrypt($tokenInfo&#91;\"access_token\"]);    \n\n        \/\/ Get long lived token from config json\n        $tokenInfo = json_decode(file_get_contents($this-&gt;config&#91;'token_file']), true);\n\n        \/\/ Check the expiration date\n        $expiresInFinalTimestamp = $tokenInfo&#91;'expires_in'] + Carbon::now()-&gt;timestamp;\n\n        \/\/ One week before the expiration\n        $oneWeekBeforeExpirationTimestamp = ($tokenInfo&#91;'expires_in'] + Carbon::now()-&gt;timestamp) - 604800;\n\n        \/\/ IG Token usually expires after 2 months.\n        \/\/ Refresh the token only if the now is greater than one week before expiration. \n        \/\/ Note for thest purpose: Carbon::now()-&gt;addMonths(3)-&gt;timestamp INSTEAD OF Carbon::now()-&gt;timestamp\n        if(Carbon::now()-&gt;timestamp &gt; $oneWeekBeforeExpirationTimestamp)\n        {\n            $instagram = $this-&gt;getInstagramBasicDisplayByToken();\n            $oAuthTokenAndExpiresDate = $instagram-&gt;refreshToken($decryptedToken);\n\n            \/\/ $oAuthTokenAndExpiresDate-&gt;access_token;\n            \/\/ $oAuthTokenAndExpiresDate-&gt;token_type;\n            \/\/ $oAuthTokenAndExpiresDate-&gt;expires_in;\n\n            if(isset($oAuthTokenAndExpiresDate-&gt;access_token))\n            {\n                \/\/ Encrypt the token\n                $encryption = new Encryption($this-&gt;config&#91;'secretKey']);\n                $cryptedToken = $encryption-&gt;encrypt($oAuthTokenAndExpiresDate-&gt;access_token);\n\n                \/\/ Save on file for later\n                file_put_contents($this-&gt;config&#91;'token_file'], json_encode(\n                    array(\n                        \"access_token\" =&gt; $cryptedToken,\n                        \"token_type\" =&gt; $oAuthTokenAndExpiresDate-&gt;token_type,\n                        \"expires_in\" =&gt; $oAuthTokenAndExpiresDate-&gt;expires_in,\n                    )\n                ));\n\n                return true;\n            }\n        }\n\n        return false;\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Preparazione del file di entry point<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ora che abbiamo preparato le nostre classi, possiamo vedere come integrare Instagram Basic Display API in PHP 7. Rimettiamo mano al nostro <em>.\/public\/index.php<\/em> e completiamo il resto del codice. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dopo la riga del require, possiamo aggiungere le classi che utilizzeremo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>use App\\Utility; \/\/ dobbiamo ancora esplorarla!\nuse App\\IGMedia;\nuse App\\IGToken;\nuse Monolog\\Logger;\nuse Monolog\\Handler\\RotatingFileHandler;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poi recupereremo l&#8217;array di config e visualizzeremo gli errori se siamo in modalit\u00e0 debug:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$config = include '..' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'config.php';\n\nif($config&#91;'debug'])\n{\n    ini_set('display_errors', 1);\n    ini_set('display_startup_errors', 1);\n    error_reporting(E_ALL);    \n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E possiamo anche impostare un gestore di log, che salver\u00e0 il file di log con un nome che cambia in base al giorno:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Add log handler\n$logger     = new Logger('ig-integration');\n$handler    = new RotatingFileHandler('logs\/ig-log.log', 0, Logger::INFO, true, 0664);\n$handler-&gt;setFilenameFormat('{date}-{filename}', 'Y-m-d');\n$logger-&gt;pushHandler($handler);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">La logica dell&#8217;applicazione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Come scrivevo prima, questa applicazione non ha un sistema di routing, per cui ci baster\u00e0 recuperare gli input dai parametri della query presenti nella url della richiesta e poi gestirne i valori.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Get values from query parameters\n$code           = filter_input(INPUT_GET, 'code', FILTER_SANITIZE_STRING);\n$igAction       = filter_input(INPUT_GET, 'action', FILTER_SANITIZE_STRING);\n$longLivedToken = filter_input(INPUT_GET, 'long-lived-token', FILTER_SANITIZE_STRING);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A questo punto \u00e8 tutto molto pi\u00f9 semplice, perch\u00e8 abbiamo gi\u00e0 preparato tutto, basta semplicemente separare le azioni e richiamare le classi coinvolte:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if(isset($config) &amp;&amp; $longLivedToken)\n{\n    \/\/ No config, no execution\n    if(!$config&#91;'debug'])\n    {\n        $logger-&gt;info('Production environment. This action is not supported here.');\n        return;\n    }\n\n    $logger-&gt;info('Start encrypt token');\n\n    \/\/ Instagram Token class\n    $iGToken = new IGToken($config, $longLivedToken);\n    $result = $iGToken-&gt;encryptNewToken();\n\n    if($result !== false)\n    {\n        $logger-&gt;info('Success! Please check your new token in .\/config\/token.json');\n    }\n    else {\n        $logger-&gt;info('Error! An error occurred saving the token');\n    }\n\n    return;\n}\nelse if($igAction == 'get-media') {\n\n    $logger-&gt;info('Start IG get media');\n\n    \/\/ Instagram Media class\n    $iGMedia = new IGMedia($config, $longLivedToken);\n    $media = $iGMedia-&gt;getMedia(); \/\/ stdClass-&gt;data\n\n    $logger-&gt;info('Found ' . count($media-&gt;data) . ' media.');\n\n    $iGToken = new IGToken($config);\n    $result = $iGToken-&gt;refreshToken();\n\n    $logger-&gt;info('Token ' . ($result ? 'refreshed' : 'not refreshed'));\n\n    \/\/ App utilities\n    $utility = new Utility();\n    $result = $utility-&gt;filterMedia($media-&gt;data, 'media' . DIRECTORY_SEPARATOR);\n\n    $logger-&gt;info('Filtered ' . count($result) . ' media.');\n\n    return;\n}\nelse {\n\n    \/\/ Authenticate user (OAuth2)\n    if(!empty($code))\n    {\n        \/\/ Ready for the login\n        $iGToken = new IGToken($config);\n        $instagram = $iGToken-&gt;getInstagramBasicDisplayByKeys();\n\n        $logger-&gt;info('Code from Instagram: ' . $code);\n\n        \/\/ Get the short lived access token (valid for 1 hour)\n        $token = $instagram-&gt;getOAuthToken($code, true);\n\n        \/\/ Exchange this token for a long lived token (valid for 60 days)\n        $token = $instagram-&gt;getLongLivedToken($token, true);\n\n        \/\/ Instagram Token class\n        $iGToken-&gt;setLongLivedToken($token);\n\n        $result = $iGToken-&gt;encryptNewToken();\n\n        $logger-&gt;info('Encrypted new token successfully.');\n\n        echo \"&lt;a href='?action=get-media'&gt;Get media&lt;\/a&gt;\";\n\n        return;\n    }\n}\n\n\n\/\/ Ready for the login and initialize the class\n$iGToken = new IGToken($config);\n$instagram = $iGToken-&gt;getInstagramBasicDisplayByKeys();\n\necho \"&lt;a href='{$instagram-&gt;getLoginUrl()}'&gt;Instagram Login&lt;\/a&gt;\";<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ho voluto lasciare per ultimo la classe Utility (anch&#8217;essa sotto <em>.\/src\/app<\/em>). La sua funzione \u00e8 quella di svolgere operazioni che non riguardano Instagram, ma che ne utilizzano i dati. Per esempio, ho implementato un metodo, modificabile a piacimento, per filtrare e salvare i media. A questo punto, il vostro sito sar\u00e0 in grado di leggere media e info e caricarli su pagine specifiche, o all&#8217;interno di gallerie fotografiche.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \n\nnamespace App;\n\nclass Utility\n{\n    \/\/ Filter media type by $filter from IG API\n    public function filterMedia(array $media, string $targetDir, array $exclude = array(), $filter = 'IMAGE', $action = 'save-media')\n    {\n        $mediaOutput = array();\n        foreach($media as $m)\n        {\n            if($m-&gt;media_type == $filter)\n            {\n                $originalFilename = basename(parse_url($m-&gt;media_url, PHP_URL_PATH));\n\n                \/\/echo $m-&gt;media_url . \" ||| \" . $originalFilename . \"&lt;br \/&gt;\";\n                if(in_array($originalFilename, $exclude))\n                {\n                    continue;\n                }\n\n                $ext = pathinfo($originalFilename, PATHINFO_EXTENSION);\n\n                $m-&gt;filename = substr($this-&gt;slugify($m-&gt;caption), 0, 75) . '.' . $ext;\n\n                if($action != 'save-media')\n                {\n                    \/\/ Set output image\n                    $mediaOutput&#91;] = $m;\n                }\n                else {\n                    \/\/ Save image\n                    $result = $this-&gt;createFolderIfNotExists($targetDir);\n                    $result = $this-&gt;convertJpgToWebpORPng($targetDir, $m-&gt;filename, $m-&gt;media_url);\n\n                    \/\/ New webp extension\n                    $m-&gt;filename = str_replace('jpg', $result&#91;'conversion'], $m-&gt;filename);\n\n                    if(file_exists($result&#91;'path']) !== false)\n                    {\n                        \/\/ Set output image\n                        $mediaOutput&#91;] = $m;\n                    }\n                }\n            }\n        }\n\n        \/\/ Collect info\n        if($action == 'save-media')\n        {\n            file_put_contents($targetDir . 'info.json', json_encode($mediaOutput));\n        }\n\n\n        return $mediaOutput;\n    }\n\n    public function slugify(string $text)\n    {\n        \/\/ replace non letter or digits by -\n        $text = preg_replace('~&#91;^\\pL\\d]+~u', '-', $text);\n\n        \/\/ transliterate\n        $text = iconv('utf-8', 'us-ascii\/\/TRANSLIT', $text);\n\n        \/\/ remove unwanted characters\n        $text = preg_replace('~&#91;^-\\w]+~', '', $text);\n\n        \/\/ trim\n        $text = trim($text, '-');\n\n        \/\/ remove duplicate -\n        $text = preg_replace('~-+~', '-', $text);\n\n        \/\/ lowercase\n        $text = strtolower($text);\n\n        if (empty($text)) {\n            return 'n-a';\n        }\n\n        return $text;\n    }\n\n    private function convertJpgToWebpORPng($targetDir, $filename, $fileurl)\n    {\n        $jpg = \\imagecreatefromjpeg($fileurl);\n\n        \\imagepalettetotruecolor($jpg);\n        \\imagealphablending($jpg, true);\n        \\imagesavealpha($jpg, true);\n\n        $path = '';\n        $conversion = '';\n        if(function_exists('imagewebp'))\n        {\n            $conversion = 'webp';\n\n            $path = $targetDir . str_replace('jpg', $conversion, $filename);\n\n            \\imagewebp($jpg, $path, 100);\n        }\n        else {\n            $conversion = 'png';\n\n            $path = $targetDir . str_replace('jpg', $conversion, $filename);\n\n            \\imagepng($jpg, $path, 7);\n        }\n\n        \\imagedestroy($jpg);\n\n        return array(\n            'path'          =&gt; $path,\n            'conversion'    =&gt; $conversion,\n        );\n    }\n\n    private function createFolderIfNotExists(string $path)\n    {\n        if (!file_exists($path)) \n        {\n            mkdir($path, 0777, true);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Avvio tramite cron job<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;applicazione pu\u00f2 essere richiamata tramite <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cron\">cron job<\/a>, ogni minuto\/ora o quando pensate sia necessario. Cos\u00ec, mentre siete in un parco e scattate una foto, la condividete su Instagram: quando il cron job lancia la nostra applicazione, la vostra nuova foto apparir\u00e0 sul vostro sito!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In pi\u00f9: utilizzando un cron job per lanciare questa applicazione, l&#8217;esecuzione delle chiamate verso Instagram \u00e9 disaccoppiata dall&#8217;esecuzione del sito. Quest&#8217;ultimo infatti, deve solo leggere le informazioni dei media da un file che \u00e9 sempre aggiornato e soprattutto, sullo stesso server, cos\u00ec come le immagini.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">In conclusione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo quindi visto come integrare Instagram Basic Display API in PHP 7.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo script \u00e8 modificabile, e installabile in una sotto cartella del vostro sito. Modificatela in base alle esigenze del vostro sito per leggere le informazioni ottenute. Lanciatelo tramite cron job e condividete le vostre immagini su Instagram per vederle poi condivise anche sul vostro sito.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Non esitate a scrivermi tramite il <a href=\"https:\/\/www.giuseppemaccario.com\/it\/#contatti\">sito<\/a> o su <a href=\"https:\/\/www.linkedin.com\/in\/giuseppemaccario\">Linkedin<\/a>, o aprire una <em>issue<\/em> su <a href=\"https:\/\/github.com\/gmaccario\">Github<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A presto!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Questo articolo tratta di come integrare Instagram Basic Display API in PHP 7 e offre una soluzione per integrare sul proprio sito web le chiamate API verso il proprio profilo Instagram, recuperarne i media per poi renderli disponibili sul proprio sito web.<\/p>\n","protected":false},"author":1,"featured_media":1328,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","ngg_post_thumbnail":0,"footnotes":""},"categories":[49,47,48,38],"tags":[],"class_list":["post-1287","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-api","category-instagram","category-integrazioni","category-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Come integrare Instagram Basic Display API in PHP 7<\/title>\n<meta name=\"description\" content=\"Questo articolo tratta di come integrare Instagram Basic Display API in PHP 7 e offre una soluzione per integrare sul proprio sito web le chiamate API verso il proprio profilo Instagram, recuperarne i media per poi renderli disponibili sul proprio sito web.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Come integrare Instagram Basic Display API in PHP 7\" \/>\n<meta property=\"og:description\" content=\"Questo articolo tratta di come integrare Instagram Basic Display API in PHP 7 e offre una soluzione per integrare sul proprio sito web le chiamate API verso il proprio profilo Instagram, recuperarne i media per poi renderli disponibili sul proprio sito web.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/\" \/>\n<meta property=\"og:site_name\" content=\"Giuseppe Maccario\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-14T13:54:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-07-15T08:44:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/07\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"giuseppemaccario\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"giuseppemaccario\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/\"},\"author\":{\"name\":\"giuseppemaccario\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"headline\":\"Come integrare Instagram Basic Display API in PHP 7\",\"datePublished\":\"2021-07-14T13:54:52+00:00\",\"dateModified\":\"2021-07-15T08:44:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/\"},\"wordCount\":1753,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"image\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png\",\"articleSection\":[\"API\",\"Instagram\",\"Integrazioni\",\"PHP\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/\",\"name\":\"Come integrare Instagram Basic Display API in PHP 7\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png\",\"datePublished\":\"2021-07-14T13:54:52+00:00\",\"dateModified\":\"2021-07-15T08:44:45+00:00\",\"description\":\"Questo articolo tratta di come integrare Instagram Basic Display API in PHP 7 e offre una soluzione per integrare sul proprio sito web le chiamate API verso il proprio profilo Instagram, recuperarne i media per poi renderli disponibili sul proprio sito web.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png\",\"contentUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png\",\"width\":600,\"height\":400,\"caption\":\"Come integrare Instagram Basic Display API in PHP 7 Crediti foto @cottonbro su Pexels.com\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-integrare-instagram-basic-display-api-in-php-7\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Come integrare Instagram Basic Display API in PHP 7\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/\",\"name\":\"Giuseppe Maccario\",\"description\":\"Sviluppatore Software in Amsterdam (NL)\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\",\"name\":\"giuseppemaccario\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\",\"width\":50,\"height\":50,\"caption\":\"giuseppemaccario\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Come integrare Instagram Basic Display API in PHP 7","description":"Questo articolo tratta di come integrare Instagram Basic Display API in PHP 7 e offre una soluzione per integrare sul proprio sito web le chiamate API verso il proprio profilo Instagram, recuperarne i media per poi renderli disponibili sul proprio sito web.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/","og_locale":"it_IT","og_type":"article","og_title":"Come integrare Instagram Basic Display API in PHP 7","og_description":"Questo articolo tratta di come integrare Instagram Basic Display API in PHP 7 e offre una soluzione per integrare sul proprio sito web le chiamate API verso il proprio profilo Instagram, recuperarne i media per poi renderli disponibili sul proprio sito web.","og_url":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/","og_site_name":"Giuseppe Maccario","article_published_time":"2021-07-14T13:54:52+00:00","article_modified_time":"2021-07-15T08:44:45+00:00","og_image":[{"width":600,"height":400,"url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/07\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png","type":"image\/png"}],"author":"giuseppemaccario","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"giuseppemaccario","Tempo di lettura stimato":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/#article","isPartOf":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/"},"author":{"name":"giuseppemaccario","@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"headline":"Come integrare Instagram Basic Display API in PHP 7","datePublished":"2021-07-14T13:54:52+00:00","dateModified":"2021-07-15T08:44:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/"},"wordCount":1753,"commentCount":0,"publisher":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"image":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/#primaryimage"},"thumbnailUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/07\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png","articleSection":["API","Instagram","Integrazioni","PHP"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/","url":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/","name":"Come integrare Instagram Basic Display API in PHP 7","isPartOf":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/#primaryimage"},"image":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/#primaryimage"},"thumbnailUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/07\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png","datePublished":"2021-07-14T13:54:52+00:00","dateModified":"2021-07-15T08:44:45+00:00","description":"Questo articolo tratta di come integrare Instagram Basic Display API in PHP 7 e offre una soluzione per integrare sul proprio sito web le chiamate API verso il proprio profilo Instagram, recuperarne i media per poi renderli disponibili sul proprio sito web.","breadcrumb":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/#primaryimage","url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/07\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png","contentUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/07\/come-integrare-instagram-basic-display-api-in-php-7-crediti-foto-cottonbro-su-pexelscom.png","width":600,"height":400,"caption":"Come integrare Instagram Basic Display API in PHP 7 Crediti foto @cottonbro su Pexels.com"},{"@type":"BreadcrumbList","@id":"https:\/\/www.giuseppemaccario.com\/it\/come-integrare-instagram-basic-display-api-in-php-7\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.giuseppemaccario.com\/it\/"},{"@type":"ListItem","position":2,"name":"Come integrare Instagram Basic Display API in PHP 7"}]},{"@type":"WebSite","@id":"https:\/\/www.giuseppemaccario.com\/it\/#website","url":"https:\/\/www.giuseppemaccario.com\/it\/","name":"Giuseppe Maccario","description":"Sviluppatore Software in Amsterdam (NL)","publisher":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.giuseppemaccario.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":["Person","Organization"],"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc","name":"giuseppemaccario","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png","url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png","contentUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png","width":50,"height":50,"caption":"giuseppemaccario"},"logo":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png"}}]}},"_links":{"self":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/1287","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/comments?post=1287"}],"version-history":[{"count":40,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/1287\/revisions"}],"predecessor-version":[{"id":1333,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/1287\/revisions\/1333"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/media\/1328"}],"wp:attachment":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/media?parent=1287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/categories?post=1287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/tags?post=1287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}