Usar la API de Instagram con PHP

Si requerimos agregar el contenido de nuestro instagram en nuestro sitio como una galería lo podemos hacer con la API que el mismo Instagram nos ofrece, en este artículo te muestro como hacerlo de la manera más simple usando PHP.
INFORMACIÓN IMPORTANTE
Por motivos de los cambios que Instagram ha hecho en su API este método parece no estar funcionando correctamente
Está será una de las formas más básicas de conectarte con la API de Instagram y obtener los últimos post de la cuenta, para ello requerimos 2 cosas, un ACCESS TOKEN y un USERID, más adelante te indicare como obtener ambos.

Obtener el ACCESS TOKEN:
Para obtenerlo debemos ir al sitio http://instagram.pixelunion.net y hacemos click en el botón Generate Access Token, después, debemos ingresar los datos de nuestra cuenta y dar los permisos a la aplicación, si todo va bien, esto debe generarnos el código que necesitamos.

Este es un código tipo 5479XXXX.XXXXXXX.6b950d5f7c6a463d96b8b3e9265XXXX el cual debemos copiar y guardar.


Obtener el USERID:
Para obtener este código debemos ir al sitio https://codeofaninja.com/tools/find-instagram-user-id donde deberemos ingresar nuestro usuario de Instagram y el sitio nos devolverá el código tipo 5479XXXX.

Igual que el ACCESS TOKEN, debemos copiarlo y guardarlo.

Una vez obtenidos estos códigos comencemos con la programación.

Como te comenté antes, intentare ser lo más practico y sencillo, ya algo más complejo dependerá de ti :-D.

Lo primero será crear un archivo, en este caso lo llamare instagram.php aunque tu puedes darle el nombre que desees. Este archivo tendrá el siguiente código:


instagram.php
<?php 

// Limite de post a mostrar, si no se indica se muestran 4 por default
$limit            = 8;

function getImages( $limit = 4 ){

    $user_id       = '5479XXXX';
    $access_token  = '5479XXXX.XXXXXXX.6b950d5f7c6a463d96b8b3e9265XXXX';
    $item_resource = 'userid';
    $hashtag       = '';
    $limit         = $limit;

    if (!$user_id || !$access_token) {
        echo '<p class="alert alert-warning">NO HAY INFORMACIÓN COMPLETA</p>';
        return;
    }

    if( $item_resource == 'hashtag' && $hashtag) {
        $api = "https://api.instagram.com/v1/tags/". $hashtag  ."/media/recent/?access_token=" . $access_token . "&count=". $limit;
    } else {
        $api = "https://api.instagram.com/v1/users/". $user_id  ."/media/recent/?access_token=" . $access_token . "&count=". $limit;
    }

    if( ini_get('allow_url_fopen') ) {
        $images = @file_get_contents($api);
        @file_put_contents($cache_file, $images, LOCK_EX);
    } else {
        $images = curl($api);
    }

    $json = json_decode($images);
    if(isset($json->data)) {
        return $json->data;
    }
    
    return array();

}
	
function curl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}​

Este código simplemente nos regresará un array con los datos de nuestros post. Aquí lo que debemos cambiar son los siguientes campos:


CAMPO VALOR
$limit  Será la cantidad de POST a mostrar
$user_id  El USERID obtenido anteriormente 
$access_token  El ACCESS TOKEN obtenido anteriormente 


Lo siguiente, y ya con el archivo instagram.php creado y configurado lo que sigue será poner el resto del código donde queramos mostrar nuestros POST, para esto debemos pegar el siguiente código:

<?php 

    // Llamamos al archivo que creamos anteriormente, si usaste otro nombre cambialo aquí
    include_once "instagram.php";

    $items = getImages($limit);
    $total_items = count($items);

    if ( $total_items <= 0 ) {
        
        $output = 'No hay publicaciones a mostrar';

    } else {
        $output = '<div class="row">';

        for ($i=0; $i < $limit; $i++) {
            // break if total items less than count
            if($i == $total_items){
                break;
            }

            $output .= '<div class="col-6 col-md-3 pb-3">';
            $output .= (!empty($items[$i]->images->standard_resolution->url)) ? '<a class="sppb-instagram-gallery-btn" href="' . $items[$i]->link . '" target="_blank">' : '';
            $output .= '<div class="addon-instagram-item-wrap">';

            $output .= '<div class="addon-instagram-image-wrap">';
            $output .= '<img class="instagram-image img-fluid" src="' . $items[$i]->images->standard_resolution->url . '" alt="">';
            $output .= '</div>';
            
            $output .= '</div>';
            
            $output .= (!empty($items[$i]->images->standard_resolution->url)) ? '</a>' : '';
            $output .= '</div>';

            }
        $output .= '</div>';
    }

    echo $output;    

?>​


Y listo, esto te deberá mostrar los últimos POST de tu cuenta de Instagram en tu sitio, el código que puse te genera un row (Etiqueta de fila de Bootstrap), por lo que podría ser conveniente que el código anterior lo encierres en una etiqueta container para darle un mejor formato y mostrarlo como un grid. Si requieres otro tipo de despliegue de los POST puedes ver el código y ver que no es tan difícil, solo habría que modificar la variable $output que se va generando dentro del for. En este caso se crean columnas con las clases col-6 col-md-3 pb-3.

También debes saber que la variable $items trae mucha más información de los POST que la utilizada en este ejemplo, pero te comente, trate de ser lo más practico y simple.

Un punto importante a destacar es que Instagram ha anunciado que eliminará este tipo de consultas próximamente, por lo que si el código deja de funcionar podría ser por ese motivo, más adelante intentare subir un ejemplo con el nuevo método que propone la gente de Facebook para este mismo objetivo.

Por lo pronto te sugiero que me sigas tanto en Twitter como en Youtube para estar informado de próximos artículos.


Twitter: @Javi_Mata