如何在没有 API 的情况下获取 Instagram 中标签的所有图像?

Posted

技术标签:

【中文标题】如何在没有 API 的情况下获取 Instagram 中标签的所有图像?【英文标题】:How to get all images of hashtag in Instagram without API? 【发布时间】:2016-11-11 06:29:29 【问题描述】:

这是我用来在没有 API 的情况下获取主题标签图像的代码。我不想使用任何凭据。它不需要我添加client_id 或访问令牌。但我只得到 15 张图片。如何获取所有图像?

 <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>

【问题讨论】:

太好了,这仍然有效,谢谢 【参考方案1】:

简单的方法是使用?__a=1 请求https://www.instagram.com/explore/tags/girls/?__a=1 并在不解析HTML 和window._sharedData = 的情况下接收JSON

在 json 你可以看到 page_info 范围与 end_cursor:

"page_info": 
    "has_previous_page": false,
    "start_cursor": "1381007800712523480",
    "end_cursor": "J0HWCVx1AAAAF0HWCVxxQAAAFiYA",
    "has_next_page": true
,

使用 end_cursor 请求图像的下一部分:

https://www.instagram.com/explore/tags/girls/?__a=1&amp;max_id=J0HWCVx1AAAAF0HWCVxxQAAAFiYA

更新:

<?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;

【讨论】:

@jigsparmar 您需要通过https://www.instagram.com/p/BM39M3XBz-F/?__a=1 之类的简码请求每个视频帖子(将BM39M3Xbz-F 更改为您想要的帖子的简码,您将收到带有视频网址的json) 效果很好!我从未听说过?__a=1 标签。对于希望了解如何从 JSON 数据中提取信息的其他人,请查看此人的文章:http://www.picssel.com/build-a-simple-instagram-api-case-study/ 任何想法如何获取 JSON(或其他格式的数据)以获取关注者和关注者列表? 希望 Instagram 暂时不会注意到这一点…… @ilyapt 你是怎么知道这个方法的?这很棒!您能指出我们的文档链接吗?【参考方案2】:

Legionar 的回答很棒,但它不再起作用了。我必须在我的工作环境中更新代码,这对我来说是这样的:

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>"; 

  

您可能需要根据需要更改“newPosting”数组,但至少现在您可以使用此方法获取 instagram 数据。 $latest_array 内部还有更多数据。例如,不同的图像尺寸、cmets 和喜好。

【讨论】:

你能在 $limit 变量上再扩展一点吗?您是否使用它来限制对 instagram 服务器的调用? 嘿,在这种情况下,$limit 变量没有什么重要的作用。我们在调用时执行一个请求:file_get_contents("..."),然后我们将结果转换为我们可以使用的数组。然后我们只是遍历数组,直到达到“限制”。我不知道这样的请求中通常存储了多少帖子,但通常你想显示最新的 15 张左右的图片......【参考方案3】:

这个非常适合我。

我只需要缩略图。您可以轻松地将其更改为全尺寸图像。 此示例无法解决分页问题,​​但您可以通过 @ilyapt 回答来解决。

$tag = 'coronavirus';
$json = json_decode(file_get_contents("https://www.instagram.com/explore/tags/$tag/?__a=1", true));

$i = 0;
foreach($json->graphql->hashtag->edge_hashtag_to_media->edges as $key => $value) 
    $img = $value->node->thumbnail_resources[0]->src;
    echo "<img src='$img'>";
    if (++$i == 9) break; // limit to the 9 newest posts

【讨论】:

谢谢,这在 20 年有效。从字面上看标签选择。【参考方案4】:

@olaf 的回答对我很有帮助!

@Tomas 限制是函数将返回的帖子数量,因此它不会返回所有帖子。

另外:此功能将 Instagram 帖子按从旧到新的顺序排列。如果您希望最新的排在第一位并倒退到限制数量:

改变

for ($i=$limit; $i >= 0; $i--)

for ($i=0; $i < $limit; $i++)

【讨论】:

以上是关于如何在没有 API 的情况下获取 Instagram 中标签的所有图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有用户交互的情况下获取 instagram access_token(新 api)?

如何在没有 Web 源模块的情况下从 Oracle APEX 中的 API 获取数据

如何在没有 instagram API 的情况下从 instagram 获取公共用户的所有帖子

TypeScript Compiler API:如何在没有绝对路径的情况下获取类型的完全限定名称?

如何在没有 Web Audio API 的情况下直接从 ArrayBuffer 获取通道数据?

如何在没有谷歌地图 API 的情况下在我的应用程序中获取经度和纬度?