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?
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é.
J'ai résolu ce problème avec le paramètre optionnel count défini sur -1.
C'était un problème dans Instagram Developer Console . max_id
et min_id
ne fonctionne pas là.
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
.
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);
?>
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));
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
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
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;
}
}
}
}