web-dev-qa-db-fra.com

API Instagram: Comment obtenir tous les médias de l'utilisateur?

En général, je dois obtenir tous les médias de l'utilisateur.

L'utilisateur a plus de 250 photos.

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

Mais il ne retourne que 20 photos.

Peut-être qu'instagram a une limite pour obtenir des médias. Si c'est le cas, la réponse a une pagination pour le résoudre. Mais il n'y a que max photo d'identité. Comment connaître la première photo d'identité (min) pour la paginer ensuite?

65
Anthony

Vous avez raison, l'API Instagram ne renverra que 20 images par appel. Vous devrez donc utiliser la fonctionnalité de pagination.

Si vous essayez d'utiliser la console de l'API. Vous voudrez d'abord permettre à la console de l'API de s'authentifier via votre compte Instagram. Pour ce faire, vous devrez sélectionner OAUTH2 dans la liste déroulante Authentification.

Une fois authentifié, utilisez le menu de gauche pour sélectionner les utilisateurs/{user-id}/media/endpoint récent. Donc, dans l'intérêt de cet article pour {user-id}, vous pouvez simplement le remplacer par self. Cela utilisera ensuite votre compte pour récupérer des informations.

Au minimum, c'est ce qui est nécessaire pour effectuer une opération GET pour ce point de terminaison. Une fois que vous envoyez, vous aurez un JSON retourné à vous. Tout en haut des informations retournées après toutes les informations sur le serveur, vous verrez une portion de pagination avec next_url et next_max_id.

next_max_id est ce que vous utiliserez comme paramètre pour votre requête. Rappelez-vous que max_id est l'id de l'image la plus ancienne des 20 qui ont été retournés pour la première fois. Ceci sera utilisé pour retourner des images plus tôt que cette image.

Vous n'êtes pas obligé d'utiliser max_id si vous ne le souhaitez pas. Vous pouvez en fait simplement saisir l'id de l'image sur laquelle vous souhaitez commencer à interroger davantage d'images.

Donc, à partir des données renvoyées, copiez max_id dans le paramètre max_id. L’URL de la demande doit ressembler à quelque chose comme ceci https://api.instagram.com/v1/users/self/media/recent?max_id=XXXXXXXXXXX où XXXXXXXXXXX est le max_id. Hit envoyer à nouveau et vous devriez obtenir les 20 prochaines photos.

De là, vous recevrez également un max_id mis à jour. Vous pouvez ensuite l'utiliser à nouveau pour obtenir la prochaine série de 20 photos jusqu'à ce que toutes les photos de l'utilisateur soient passées en revue.

Ce que j'ai fait dans le projet sur lequel je travaille, c'est de charger les 20 premières photos renvoyées à partir de la demande média récente. J'assigne ensuite les images avec un identifiant de données (-id peut être ce que vous voudriez qu'il soit). Puis ajouté un bouton de chargement plus au bas de la série de photos.

Lorsque le bouton est cliqué, j'utilise jQuery pour saisir la dernière image et son attribut data-id et l'utiliser pour créer un appel via ajax et ajouter les résultats à la fin des photos déjà présentes sur la page. Au lieu d'un bouton, vous pouvez simplement le remplacer pour obtenir un effet de défilement infini.

J'espère que ça t'as aidé.

55
michaellee

J'ai résolu ce problème avec le paramètre optionnel count défini sur -1.

20
Stefan

C'était un problème dans Instagram Developer Console . max_id et min_id ne fonctionne pas là.

7
Anthony

Voir http://instagram.com/developer/endpoints/ pour plus d'informations sur pagination. Vous devez ensuite parcourir les pages de résultats, en demandant chaque fois la partie suivante avec le next_url que le résultat spécifie dans l'objet pagination.

5

Utilisez la meilleure fonction de récursivité pour obtenir tous les messages des utilisateurs.

<?php
    set_time_limit(0);
    function getPost($url,$i) 
    {
        static $posts=array();  
        $json=file_get_contents($url);
        $data = json_decode($json);
        $ins_links=array();
        $page=$data->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);

?>
4
user2536876

Ce que je devais faire est (en Javascript) est de parcourir toutes les pages en utilisant une fonction récursive. C’est dangereux car les utilisateurs d’instagram pourraient avoir des milliers de photos en plus de cela (donc vous devez le contrôler) j’utilise ce code: (paramètre de comptage je pense, ne fait pas grand chose)

        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 ='<ul>';

        for(var i=0;i<images.length;i++)
        {
            galleryHTML += '<li><img src="'+images[i].images.thumbnail.url+'" width="120" id="instagram-'+images[i].id+' data-type="instagram" data-source="'+images[i].images.standard_resolution.url+'" class="image"/></li>';

        }

        galleryHTML +='</ul>';

        return galleryHTML;
    };

Il y a quelques trucs liés à l’impression d’une galerie de photos.

Vous pouvez utiliser la pagination Instagram PHP API: https://github.com/cosenary/Instagram-PHP-API/wiki/Using-Pagination

Quelque chose comme ca:

    $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 '<img src="'.$picture_data->images->low_resolution->url.'">';

        endforeach;

    } while ($pictures = $instagram->pagination($pictures));
4
thiiisantos

En juin 2016, Instagram a rendu la plupart des fonctionnalités de son API disponibles uniquement pour les applications ayant passé un processus de révision. Cependant, ils fournissent toujours des données JSON via l'interface Web et vous pouvez ajouter le paramètre __a=1 À une URL pour n'inclure que les données 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

Edit: Comme mentionné dans le commentaire de alnorth29, le paramètre max_id Est maintenant ignoré. Instagram a également modifié le format de la réponse et vous devez effectuer des demandes supplémentaires pour obtenir les URL pleine taille des images dans les nouveaux messages de style avec plusieurs images par message. Vous pouvez maintenant faire quelque chose comme ceci pour lister les URL pleine taille des images sur la première page de résultats:

c=$(curl -s "https://www.instagram.com/username/?__a=1")
jq -r '.graphql.user.Edge_owner_to_timeline_media.edges[]?|.node|select(.__typename!="GraphSidecar").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

Pour dresser la liste des codes abrégés de chaque publication publiée par l'utilisateur dont le profil est ouvert dans l'onglet situé au premier plan dans Safari, j'utilise un script comme celui-ci:

sjs(){ osascript -e'{on run{a}','tell app"safari"to do javascript a in document 1',end} -- "$1";}

while :;do
  sjs 'o="";a=document.querySelectorAll(".v1Nh3 a");for(i=0;e=a[i];i++){o+=e.href+"\n"};o'>>/tmp/a
  sjs 'window.scrollBy(0,window.innerHeight)'
  sleep 1
done
3
nisetama

Utilisez le next_url objet pour obtenir les 20 prochaines images.

Dans la réponse JSON, il y a un tableau 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"
 }

Voici les informations sur l'appel spécifique à l'API et l'objet next_url montre l'URL pour obtenir les 20 prochaines images, prenez donc cette URL et appelez-la pour les 20 prochaines images.

Pour plus d’informations sur l’API Instagram, consultez cet article de blog: Comment utiliser l’API d’Instagram

2
user3632055

La console de développeur Instagram a fourni la solution. https://www.instagram.com/developer/endpoints/

Pour utiliser cela en PHP, voici l'extrait de code,

/**
**
** 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;
                   }
           }
    }

}
0
urvi sheth