API de Instagram: ¿cómo obtener todos los medios de los usuarios?

En general, necesito obtener todos los medios de los usuarios.

El usuario tiene más de 250 fotos.

Hago /users/1/media/recent/?access_token=...&count=250

Pero devuelve solo 20 fotos.

Tal vez instagram tiene un límite para obtener medios. Si lo es, la respuesta tiene una paginación para resolverlo. Pero solo hay una foto de identificación máxima. ¿Cómo saber la primera (min) foto de identificación para paginarla?

Tienes razón, la API de Instagram solo devolverá 20 imágenes por llamada. Entonces deberás usar la función de paginación.

Si estás tratando de usar la consola API. Primero debe permitir que la consola API se autentique a través de su inicio de sesión de Instagram. Para hacer esto, deseará seleccionar OAUTH2 en el menú desplegable Autenticación.

Una vez autenticado, use el menú del lado izquierdo para seleccionar los usuarios / {user-id} / media / endpoint reciente. Entonces, por el bien de esta publicación para {user-id}, puedes reemplazarlo por uno mismo. Esto usará su cuenta para recuperar información.

Como mínimo, eso es lo que se necesita para hacer un GET para este punto final. Una vez que envíe, obtendrá un json devuelto a usted. En la parte superior de la información devuelta después de toda la información del servidor, verá una parte de paginación con next_url y next_max_id.

next_max_id es lo que usarás como parámetro para tu consulta. Recuerde que max_id es la identificación de la imagen que es la más antigua de las 20 que se devolvió por primera vez. Esto se usará para devolver imágenes antes que esta imagen.

No tiene que usar max_id si no lo desea. En realidad, puede tomar la identificación de la imagen desde donde desea comenzar a consultar más imágenes.

Por lo tanto, a partir de los datos devueltos, copie el max_id en el parámetro max_id. La URL de solicitud debe tener un aspecto similar a este https://api.instagram.com/v1/users/self/media/recent?max_id=XXXXXXXXXXX donde XXXXXXXXXXX es max_id. Pulse enviar de nuevo y debería obtener las próximas 20 fotos.

Desde allí, también recibirá un max_id actualizado. Luego puede usar eso nuevamente para obtener el siguiente conjunto de 20 fotos hasta que eventualmente revise todas las fotos del usuario.

Lo que hice en el proyecto en el que estoy trabajando es cargar las primeras 20 fotos devueltas desde la solicitud de medios reciente inicial. Luego, asigno las imágenes con una identificación de datos (-id puede ser lo que te gustaría que fuera). Luego se agregó un botón para cargar más en la parte inferior del conjunto de fotos.

Cuando se hace clic en el botón, utilizo jQuery para tomar la última imagen y su atributo de identificación de datos y lo uso para crear una llamada a través de ajax y anexar los resultados al final de las fotos que ya están en la página. En lugar de un botón, puede reemplazarlo para tener un efecto de desplazamiento infinito.

Espero que ayude.

He resuelto este problema con el recuento de parámetros opcional establecido en -1.

Fue un problema en la Consola para desarrolladores de Instagram . max_id y min_id no funcionan allí.

Consulte http://instagram.com/developer/endpoints/ para obtener información sobre la pagination . next_url pasar paso a paso por las páginas de resultados, cada vez solicitando la siguiente parte con la next_url que el resultado especifica en el objeto de pagination .

Lo que tuve que hacer es (en Javascript) ir a todas las páginas usando una función recursiva. Es peligroso porque los usuarios de instagram podrían tener miles de imágenes, parte de eso (así que tienes que controlarlo). Utilizo este código: (el parámetro de conteo creo, no hace mucho)

  instagramLoadDashboard = function(hash) { code = hash.split('=')[1]; $('#instagram-pictures .images-list .container').html('').addClass('loading'); ts = Math.round((new Date()).getTime() / 1000); url = 'https://api.instagram.com/v1/users/self/media/recent?count=200&min_timestamp=0&max_timestamp='+ts+'&access_token='+code; instagramLoadMediaPage(url, function(){ galleryHTML = instagramLoadGallery(instagramData); //console.log(galleryHTML); $('#instagram-pictures .images-list .container').html(galleryHTML).removeClass('loading'); initImages('#instagram-pictures'); IGStatus = 'loaded'; }); }; instagramLoadMediaPage = function (url, callback) { $.ajax({ url : url, dataType : 'jsonp', cache : false, success: function(response){ console.log(response); if(response.code == '400') { alert(response.error_message); return false; } if(response.pagination.next_url !== undefined) { instagramData = instagramData.concat(response.data); return instagramLoadMediaPage(response.pagination.next_url,callback); } instagramData = instagramData.concat(response.data); callback.apply(); } }); }; instagramLoadGallery = function(images) { galleryHTML ='
    '; for(var i=0;i'; } galleryHTML +='
'; return galleryHTML; };

Hay algunas cosas relacionadas con imprimir una galería de imágenes.

Puede paginar el usuario de la API PHP de Instagram: https://github.com/cosenary/Instagram-PHP-API/wiki/Using-Pagination

Algo como eso:

  $Instagram = new MetzWeb\Instagram\Instagram(array( "apiKey" => IG_APP_KEY, "apiSecret" => IG_APP_SECRET, "apiCallback" => IG_APP_CALLBACK )); $Instagram->setSignedHeader(true); $pictures = $Instagram->getUserMedia(123); do { foreach ($pictures->data as $picture_data): echo ''; endforeach; } while ($pictures = $instagram->pagination($pictures)); 

Utilice la mejor función de recursión para obtener todas las publicaciones de los usuarios.

 pagination; $pagearray=json_decode(json_encode($page),true); $pagecount=count($pagearray); foreach( $data->data as $user_data ) { $posts[$i++]=$user_data->link; } if($pagecount>0) return getPost($page->next_url,$i); else return $posts; } $posts=getPost("https://api.instagram.com/v1/users/CLIENT-ACCOUNT-NUMBER/media/recent?client_id=CLIENT-ID&count=33",0); print_r($posts); ?> 

En junio de 2016, Instagram hizo que la mayoría de las funciones de su API solo estuvieran disponibles para las aplicaciones que pasaron por un proceso de revisión. Sin embargo, todavía proporcionan datos JSON a través de la interfaz web, y puede agregar el parámetro __a=1 a una URL para incluir solo los datos JSON.

 max= while :;do c=$(curl -s "https://www.instagram.com/username/?__a=1&max_id=$max") jq -r '.user.media.nodes[]?|.display_src'<<<"$c" max=$(jq -r .user.media.page_info.end_cursor<<<"$c") jq -e .user.media.page_info.has_next_page<<<"$c">/dev/null||break done 

Editar: como se mencionó en el comentario de alnorth29, el parámetro max_id ahora se ignora. Instagram también cambió el formato de la respuesta, y necesita realizar solicitudes adicionales para obtener las URL de tamaño completo de las imágenes en las nuevas publicaciones de estilo con múltiples imágenes por publicación. Ahora puede hacer algo como esto para enumerar las URL de tamaño completo de las imágenes en la primera página de resultados:

 c=$(curl -s "https://www.instagram.com/username/?__a=1") jq -r '.graphql.user.edge_owner_to_timeline_media.edges[]?|.node.display_url'<<<"$c" jq -r '.graphql.user.edge_owner_to_timeline_media.edges[]?|.node|select(.__typename=="GraphSidecar")|.shortcode'<<<"$c"|while read l;do curl -s "https://www.instagram.com/p/$l?__a=1"|jq -r '.graphql.shortcode_media|.edge_sidecar_to_children.edges[]?.node|.display_url' done 

Utilice el objeto next_url para obtener las siguientes 20 imágenes.

En la respuesta JSON hay una matriz de pagination :

  "pagination":{ "next_max_tag_id":"1411892342253728", "deprecation_warning":"next_max_id and min_id are deprecated for this endpoint; use min_tag_id and max_tag_id instead", "next_max_id":"1411892342253728", "next_min_id":"1414849145899763", "min_tag_id":"1414849145899763", "next_url":"https:\/\/api.instagram.com\/v1\/tags\/lemonbarclub\/media\/recent?client_id=xxxxxxxxxxxxxxxxxx\u0026max_tag_id=1411892342253728" } 

Esta es la información sobre una llamada API específica y el objeto next_url muestra la URL para obtener las siguientes 20 imágenes, así que simplemente toma esa URL y next_url para las siguientes 20 imágenes.

Para obtener más información acerca de la API de Instagram, consulte este blogpost: Cómo ser amigable con la API de Instagram

La consola de desarrolladores de Instagram ha proporcionado la solución para ello. https://www.instagram.com/developer/endpoints/

Para usar esto en PHP, aquí está el fragmento de código,

 /** ** ** Add this code snippet after your first curl call ** assume the response of the first call is stored in $userdata ** $access_token have your access token */ $maximumNumberOfPost = 33; // it can be 20, depends on your instagram application $no_of_images = 50 // Enter the number of images you want if ($no_of_images > $maximumNumberOfPost) { $ImageArray = []; $next_url = $userdata->pagination->next_url; while ($no_of_images > $maximumNumberOfPost) { $originalNumbersOfImage = $no_of_images; $no_of_images = $no_of_images - $maximumNumberOfPost; $next_url = str_replace("count=" . $originalNumbersOfImage, "count=" . $no_of_images, $next_url); $chRepeat = curl_init(); curl_setopt_array($chRepeat, [ CURLOPT_URL => $next_url, CURLOPT_HTTPHEADER => [ "Authorization: Bearer $access_token" ], CURLOPT_RETURNTRANSFER => true ]); $userRepeatdata = curl_exec($chRepeat); curl_close($chRepeat); if ($userRepeatdata) { $userRepeatdata = json_decode($userRepeatdata); $next_url = $userRepeatdata->pagination->next_url; if (isset($userRepeatdata->data) && $userRepeatdata->data) { $ImageArray = $userRepeatdata->data; } } } }