Mostrare le foto Instagram di qualsiasi profilo su una pagina web

Rieccoci qui!

Dopo un mese di assenza per motivi di lavoro e di studio, sono di nuovo qui tra voi. Oggi vi propongo una cosa molto interessante che ha a che fare con Instagram.

Se avete letto i miei articoli precedenti su Facebook, avrete visto che mal di testa pauroso è autenticarsi per fare qualsiasi cosa con il social di Mark Zuckerberg. Anche con Instagram è prevista l’autenticazione OAuth 2.0, ma la cosa interessante è che esistono ben due metodi per ottenere il feed di un utente Instagram senza autenticarsi!

Il primo metodo che vi propongo è quello, se vogliamo, un po’ “più ufficiale” dei due e consiste semplicemente nell’invocare un opportuno URL e nella lettura della risposta JSON contenente le foto.

Il secondo metodo, invece, è un trucco, e come tale voglio che vi ricordiate che attualmente funziona, ma è pur sempre un trucco e se un giorno Instagram modificasse la struttura delle sue pagine web, naturalmente questo sistema non funzionerebbe più.

Il secondo metodo, lo dico per correttezza, proviene da un plugin per WordPress che poi io ho riadattato per funzionare in Prestashop e Drupal.

Siamo pronti per tuffarci in questa nuova avventura!

Primo metodo: interrogazione del web service

Una curiosità: in realtà questo articolo doveva essere basato solo sul secondo metodo, ma facendo delle ricerche ho scoperto anche questo sistema e quindi ecco che abbiamo due metodi al prezzo di uno.

Vediamo per prima cosa il codice di questo esempio:

<?php
$json = file_get_contents("https://instagram.com/{UTENTE}/media/");
$dati = json_decode($json, true);

?>

<html>
<body>

<?php

if ($dati['status'] != "ok")
{
	echo "Errore durante il caricamento delle foto da Instagram";
}
else
{
	echo "<ul>";
	
	foreach ($dati['items'] as $foto)
	{
		echo "<li>";
		
		// recupero l'URL della foto e le sue dimensioni
		$urlFoto = $foto['images']['standard_resolution']['url'];
		$larghezza = $foto['images']['standard_resolution']['width'];
		$altezza = $foto['images']['standard_resolution']['height'];
		
		// NOTA: ho usato la versione standard_resolution, ma ci sono anche le versioni thumbnail e low_resolution
		
		echo "<img src='$urlFoto' />";
		
		// ora la descrizione
		echo "<p>" . $foto['caption']['text'] . "</p>";
		
		// ora i commenti
		if ($foto['comments']['count'] != 0)
		{
			echo "<strong>Commenti:</strong>";
			echo "<ul>";
			
			for ($i = 0; $i < $foto['comments']['count']; $i++)
			{
				$commento = $foto['comments']['data'][$i];
				
				$autore = $commento['from']['username'];
				$testo = $commento['text'];
				
				echo "<li><u>$autore</u> ha detto $testo</li>";				
			}
			
			echo "</ul>";
		}
		
		echo "<hr>";
		
		echo "</li>";
	}
	
	echo "</ul>";
}

?>

</body>
</html>

Ciò che dobbiamo fare per avere accesso alle foto di un utente è di inviare una richiesta HTTP a questo URL:

https://www.instagram.com/{UTENTE}/media/

La risposta è costituita da un array JSON che possiamo decodificare per mostrare le foto del profilo Instagram. Tale risposta contiene molti dati, io nel codice ne ho usati solo una minima parte, quindi vi invito in ogni caso a fare copia & incolla della risposta dentro a un JSON formatter online (ce ne sono diversi) e a studiare tutti i vari campi nel dettaglio. Per esempio, io di solito uso uno di questi due:

Le foto in particolare le potete trovare iterando lungo l’array items della risposta, usando un classico foreach.

Ogni foto è disponibile in tre risoluzioni:

  • Anteprima (standard_resolution)
  • Bassa qualità (low_resolution)
  • Qualità normale (standard_resolution)

Ciascuna foto contiene quindi un array denominato images, il quale a sua volta contiene tre oggetti che identificano tre risoluzioni diverse. Ogni versione della foto contiene varie informazioni tra le quali:

  • URL
  • Larghezza (width)
  • Altezza (height)

Già con queste informazioni possiamo mostrare le foto su una qualsiasi pagina web, basta fare come ho fatto io una lista non ordinata di immagini. Ma in realtà, questa API di Instagram ci dà molto di più, come vedremo tra poco.

Per esempio, possiamo mostrare anche la descrizione della foto andando a recuperare la proprietà text del campo caption della foto corrente.

Possiamo inoltre mostrare i commenti! Per ogni foto è sempre presente un oggetto denominato comments, anche se di commenti non ce ne sono. Questo oggetto contiene la proprietà count, la quale ci dice quanti commenti ci sono (quindi se non ci sono il campo avrà valore 0) e l’array data, il quale contiene i commenti veri e propri.

Quindi, per mostrare i commenti, dovete per prima cosa valutare la proprietà count per sapere quanti ce ne sono, quindi iterare lungo l’array data per recuperare degli oggetti, ciascuno dei quali rappresenta un commento.

Ognuno di questi oggetti contiene diverse informazioni tra cui:

  • L’autore del commento (from)
  • Il contenuto del commento (text)

Come vedete, è veramente molto semplice mostrare le foto di un utente Instagram usando questa API. Nel prossimo paragrafo vedremo invece un metodo più simile ad un hack.

Secondo metodo: recuperare la pagina web del profilo ed estrarre i dati con un trucchetto

Cioè che andremo a fare con questo secondo metodo è in linea di massima molto semplice: utilizzando la funzione file_get_contents di PHP caricheremo la pagina web del profilo Instagram desiderato in una stringa e poi utilizzando le funzioni di splitting delle stringhe isoleremo nel codice l’array JavaScript che contiene le foto.

Infatti, ogni pagina web di un profilo Instagram contiene un array denominato _sharedData, che contiene tutte le foto caricate all’interno della pagina.

Per prima cosa vediamo il codice di questo secondo esempio:

<?php       
$html = file_get_contents("https://instagram.com/{UTENTE}");

$tokens = explode("window._sharedData = ", $html);
$instagramJSON = explode( ';</script>', $tokens[1]);
$instagram = json_decode($instagramJSON[0], true);

$arrayFoto = $instagram['entry_data']['ProfilePage'][0]['user']['media']['nodes'];
?>

<html>
<head>
<style>
img { width: 140px; height: auto; padding: 5px; }
</style>
</head>
<body>

<ul>
<?php
foreach ($arrayFoto as $foto) 
{
	echo "<li>";
	
	echo "<a href='https://www.instagram.com/p/" . $foto['code'] . "/' target='_blank'><img src='" . $foto['thumbnail_src'] . "' alt='' /></a>";
	echo "<p>" . $foto['caption'] . "</p>";
	
	echo "</li>";
}
?>
</ul>

</body>
</html>

La prima cosa da fare è, come dicevo poco fa, quella di recuperare la pagina web del profilo Instagram desiderato e di salvare il codice HTML dentro una variabile come stringa. Dopodiché, ecco la magia.

Con la prima istruzione explode spezziamo il codice in corrispondenza dell’inizio dell’array Javascript e prendiamo il secondo token (quindi tutto ciò che viene dopo la dichiarazione dell’array _sharedData).

Con la seconda istruzione explode, spezziamo la nuova stringa ottenuta nel passo precedente in corrispondenza del punto dove termina l’array JavaScript, e stavolta ne prendiamo il primo token (cioè l’array che stiamo cercando). Il processo è il seguente:

Prima divisione:

<script type="text/javascript">window._sharedData = { … };</script>

Seconda divisione:

{ … };</script>

Arrivati a questo punto, decodifichiamo la stringa in un oggetto PHP usando la funzione json_decode e siamo quasi pronti! L’array delle foto caricate nella pagina è il seguente:

$arrayFoto = $instagram['entry_data']['ProfilePage'][0]['user']['media']['nodes'];

Non rimane altro che iterare lungo questo array per mostrare le foto. In questo caso la struttura dei dati è differente.

  • L’URL della foto è contenuto nel campo thumbnail_src
  • Il link alla pagina della foto lo ottenete unendo la base che non cambia mai (“https://www.instagram.com/p/”) con il codice della foto contenuto nel campo code
  • La descrizione della foto è contenuta nel campo caption.

Una volta fatto ciò, salvate il vostro codice e provate a eseguirlo.

Conclusione

Oggi vi ho mostrato due metodi totalmente differenti per mostrare le foto di un profilo Instagram su una qualsiasi pagina web. Il codice sorgente di questo articolo lo potete trovare a questo indirizzo.

A presto!

Tag:

L'autore

La mia storia con l’informatica inizia in realtà molto presto, da bambino, quando osservavo mio padre smanettare con il suo primo PC. Da allora ho seguito questa strada, e nel 2014 mi sono laureato a Brescia in ingegneria informatica. Ho aperto quindi la mia ditta individuale e mi occupo di web design, grafica e sviluppo software e app. Nella vita ho tutto quello che desidero: una fidanzata meravigliosa, una famiglia fantastica e fortunatamente molto lavoro. Attualmente sono iscritto anche all’università di Bologna, per dare seguito ad un’altra mia grande passione: l’astronomia.

Sito web dell'autore | Altri articoli scritti da

Articoli correlati

Altri articoli

Ecco qualche altro articolo che potresti trovare interessante:

21 commenti

Trackback e pingback

Non ci sono trackback e pingback disponibili per questo articolo