web-dev-qa-db-fra.com

Comment obtenir toutes les images de hashtag dans Instagram sans API?

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>
9
Jigs Parmar

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;
}
42
ilyapt

@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++)
0
Chad Elkins

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.

0
olaf