C'est mon code que j'ai utilisé pour obtenir des images de hashtag sans API. Je ne veux utiliser aucune information d'identification. Pas besoin d'ajouter client_id
ou un jeton d'accès. Mais je ne reçois que 15 images. Comment puis-je obtenir toutes les images?
<div>
<form action='#' method='post'>
<input type='input' name='txttag' />
<input type='submit' value='Get Image' />
</form>
</div>
<?php
function scrape_insta_hash($tag) {
$insta_source = file_get_contents('https://www.instagram.com/explore/tags/'.$tag.'/'); // instagrame tag url
$shards = explode('window._sharedData = ', $insta_source);
$insta_json = explode(';</script>', $shards[1]);
$insta_array = json_decode($insta_json[0], TRUE);
return $insta_array; // this return a lot things print it and see what else you need
}
if(isset($_POST['txttag']))
{
$tag =$_POST['txttag']; // tag for which ou want images
$results_array = scrape_insta_hash($tag);
$limit = 15; // provide the limit thats important because one page only give some images then load more have to be clicked
$image_array= array(); // array to store images.
for ($i=0; $i < $limit; $i++) {
$latest_array = $results_array['entry_data']['TagPage'][0]['tag']['media']['nodes'][$i];
$image_data = '<img src="'.$latest_array['thumbnail_src'].'">'; // thumbnail and same sizes
//$image_data = '<img src="'.$latest_array['display_src'].'">'; actual image and different sizes
array_Push($image_array, $image_data);
}
foreach ($image_array as $image) {
echo $image;// this will echo the images wrap it in div or ul li what ever html structure
}
//https://www.instagram.com/explore/tags/your-tag-name/
}
?>
<style>
img {
height: 200px;
margin: 10px;
}
</style>
Effectuez facilement une requête avec ?__a=1
comme https://www.instagram.com/explore/tags/girls/?__a=1
et recevez du JSON sans analyser HTML et window._sharedData =
Dans json, vous pouvez voir page_info scope avec end_cursor :
"page_info": {
"has_previous_page": false,
"start_cursor": "1381007800712523480",
"end_cursor": "J0HWCVx1AAAAF0HWCVxxQAAAFiYA",
"has_next_page": true
},
utilisez end_cursor pour demander la prochaine partie des images:
https://www.instagram.com/explore/tags/girls/?__a=1&max_id=J0HWCVx1AAAAF0HWCVxxQAAAFiYA
UPD:
<?php
$baseUrl = 'https://www.instagram.com/explore/tags/girls/?__a=1';
$url = $baseUrl;
while(1) {
$json = json_decode(file_get_contents($url));
print_r($json->tag->media->nodes);
if(!$json->tag->media->page_info->has_next_page) break;
$url = $baseUrl.'&max_id='.$json->tag->media->page_info->end_cursor;
}
@olaf answer a bien fonctionné pour moi!
@Tomas La limite est le nombre de messages qui seront renvoyés par la fonction afin qu'elle ne les renvoie pas tous.
Aussi: cette fonction met en ordre les publications Instagram des plus anciennes aux plus récentes. Si vous voulez que le dernier soit le premier et revienne en arrière au nombre limite:
Changement
for ($i=$limit; $i >= 0; $i--)
à
for ($i=0; $i < $limit; $i++)
La réponse de Legionar était excellente mais cela ne fonctionne plus. J'ai dû mettre à jour le code dans mon environnement de travail. Voici comment cela fonctionne pour moi:
function scrape_insta_hash($tag) {
$insta_source = file_get_contents('https://www.instagram.com/explore/tags/'.$tag.'/'); // instagrame tag url
$shards = explode('window._sharedData = ', $insta_source);
$insta_json = explode(';</script>', $shards[1]);
$insta_array = json_decode($insta_json[0], TRUE);
return $insta_array; // this return a lot things print it and see what else you need
}
$tag = "my_hashtag";
$results_array = scrape_insta_hash($tag);
$limit = 18; // provide the limit thats important because one page only give some images then load more have to be clicked
for ($i=$limit; $i >= 0; $i--) {
if(array_key_exists($i,$results_array['entry_data']['TagPage'][0]["graphql"]["hashtag"]["Edge_hashtag_to_media"]["edges"])){
$latest_array = $results_array['entry_data']['TagPage'][0]["graphql"]["hashtag"]["Edge_hashtag_to_media"]["edges"][$i]["node"];
$newPosting = [
"image"=>$latest_array['display_url'],
"thumbnail"=>$latest_array['thumbnail_src'],
"instagram_id"=>$latest_array['id'],
"caption"=>$latest_array['caption']['Edge_media_to_caption']['edges'][0]["node"]["text"],
"link"=>"https://www.instagram.com/p/".$latest_array['shortcode'],
"date"=>$latest_array['taken_at_timestamp']
];
echo "<pre>";
print_r($newPosting);
echo "/<pre>";
}
}
Vous devrez peut-être modifier le tableau "newPosting" en fonction de vos besoins, mais au moins pour le moment, vous pouvez obtenir les données instagram avec cette méthode. De plus, il y a plus de données dans $ latest_array. Différentes tailles d'image, commentaires et aime par exemple.