【问题标题】:Instagram API: How to get all user media?Instagram API:如何获取所有用户媒体?
【发布时间】:2012-06-08 12:55:14
【问题描述】:

一般来说,我需要获取所有用户媒体。

用户拥有超过 250 张照片。

我愿意/users/1/media/recent/?access_token=...&count=250

但它只返回 20 张照片。

也许 instagram 对获取媒体有限制。 如果是,则响应有一个分页来解决它。 但是只有最大的身份证照片。那么如何知道第一张(最少)身份证照片进行分页呢?

【问题讨论】:

    标签: api instagram


    【解决方案1】:

    没错,Instagram API 每次调用只会返回 20 张图片。所以你必须使用分页功能。

    如果您尝试使用 API 控制台。您需要首先允许 API 控制台通过您的 Instagram 登录进行身份验证。为此,您需要在 Authentication 下拉菜单中选择 OAUTH2。

    通过身份验证后,使用左侧菜单选择 users/{user-id}/media/recent 端点。因此,为了 {user-id} 的这篇文章,您可以将其替换为 self.然后,这将使用您的帐户检索信息。

    至少需要为此端点执行 GET。发送后,您会收到一些 json 返回给您。在所有服务器信息之后返回的信息的最顶部,您会看到带有 next_url 和 next_max_id 的分页部分。

    next_max_id 是您将用作查询参数的值。请记住,max_id 是第一次返回的 20 个图像中最旧的图像的 ID。这将用于返回比此图像更早的图像。

    如果您不想使用,则不必使用 max_id。实际上,您只需获取要从中查询更多图像的图像的 id。

    所以从返回的数据中,将max_id复制到参数max_id中。请求 URL 应该类似于 https://api.instagram.com/v1/users/self/media/recent?max_id=XXXXXXXXXXX,其中 XXXXXXXXXXX 是 max_id。再次点击发送,您应该会收到接下来的 20 张照片。

    您还将从那里收到更新的 max_id。然后,您可以再次使用它来获取下一组 20 张照片,直到最终浏览完用户的所有照片。

    我在我正在进行的项目中所做的是加载从最近的初始媒体请求返回的前 20 张照片。然后,我为图像分配一个 data-id(-id 实际上可以是你想要的任何东西)。然后在照片集的底部添加了一个加载更多按钮。

    单击按钮时,我使用 jQuery 获取最后一张图片及其 data-id 属性,并使用该属性通过 ajax 创建 get 调用并将结果附加到页面上已有照片的末尾。代替按钮,您可以将其替换为具有无限滚动效果。

    希望对您有所帮助。

    【讨论】:

    • 谢谢,我做到了。我现在没有检查它,但在今年 5 月,即使我设置了 maxID 或 minID,我也只得到了前 20 个元素。
    • 此功能是否已从 instagram API 中删除?现在我无法从经过身份验证的用户那里获得超过 20 张图片
    • 我也在尝试这个,响应的分页属性是空的,所以我认为不再可能拉入用户的整个提要。正如端点的名称所暗示的那样,它被称为“最近的”,所以看起来我们现在只是获取最新的帖子。我仍在寻找解决方案。
    • 原来在沙盒模式下你只能得到最后 20 个帖子。一旦获得批准,您就可以检索用户帐户中的所有帖子。
    【解决方案2】:

    我已经通过将可选参数计数设置为 -1 解决了这个问题。

    【讨论】:

    • 根据我的测试,使用 count=-1 实际上会导致 504 Gateway Time-out 发生。
    • count -1 实际上少了 1 个结果
    • 我失去了标题值和其他计数 -1。
    • 这确实为我工作了大约一个月,但现在它不再工作了。 API 返回代码 200,没有数据。
    • @RonyVarghese 这不是真的。索引中的 [-1] 是指最后一个元素,因此它会一直计数到最后一个元素。不知道的时候不要说傻话。
    【解决方案3】:

    这是Instagram Developer Console 的问题。 max_idmin_id 在那里不起作用。

    【讨论】:

      【解决方案4】:

      有关pagination 的信息,请参阅http://instagram.com/developer/endpoints/。您需要随后逐步浏览结果页面,每次都使用结果在pagination 对象中指定的next_url 请求下一部分。

      【讨论】:

      • 感谢您的回答。是的,就是这样,但在控制台中你只能得到最后一些元素。最大和最小偏移量在控制台中不起作用。至少是半年前。
      • 在 2016 年 3 月运行端点会返回一个空的分页对象。看起来它不再受支持。但是找不到任何官方解释说明为什么或者是否应该可以通过 api 获取用户的整个提要。
      • 对于用户媒体最近的端点,实际上分页似乎是空的。但新的 Instagram 文档(2015 年 11 月 17 日)明确表示“数据仅限于沙盒用户和每个沙盒用户的 20 个最新媒体
      • 而且“API 的行为就好像 Instagram 上的唯一用户是您的沙盒用户,并且发布的唯一媒体是每个用户的最后 20 个媒体。” ,所以我猜由于这个限制,分页是空的,并且在生产模式下它会工作得很好。
      【解决方案5】:

      2016 年 6 月,Instagram 将其 API 的大部分功能仅提供给已通过审核流程的应用程序使用。但是,它们仍然通过 Web 界面提供 JSON 数据,您可以将参数 __a=1 添加到 URL 以仅包含 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
      

      编辑:正如 alnorth29 的评论中所述,max_id 参数现在被忽略。 Instagram 还更改了响应的格式,您需要执行额外的请求才能获取新式帖子中图像的全尺寸 URL,每个帖子有多个图像。您现在可以执行以下操作以在结果的第一页上列出图像的完整 URL:

      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
      

      要列出在 Safari 最前面的选项卡中打开个人资料的用户发布的每个帖子的简码列表,我使用如下脚本:

      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
      

      【讨论】:

      • 看起来 max_id 参数现在在此端点上被忽略了。
      【解决方案6】:

      我要做的是(在 Javascript 中)使用递归函数遍历所有页面。这是危险的,因为 instagram 用户可能有数千张图片,我是其中的一部分(所以你必须控制它)我使用这个代码:(我认为计数参数,没有多大作用)

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

      有一些与打印图片库有关的东西。

      【讨论】:

      • 太棒了,复制你的 js 代码并将其转换为 php,它对我有用,干得好胜利者
      【解决方案7】:

      使用最佳递归函数获取用户的所有帖子。

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

      【讨论】:

        【解决方案8】:

        您可以对 Instagram PHP API 进行用户分页:https://github.com/cosenary/Instagram-PHP-API/wiki/Using-Pagination

        类似的东西:

            $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));
        

        【讨论】:

          【解决方案9】:

          使用next_url 对象获取接下来的 20 张图像。

          在 JSON 响应中有一个 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"
           }
          

          这是有关特定 API 调用的信息,对象 next_url 显示获取接下来 20 张图片的 URL,因此只需获取该 URL 并为接下来的 20 张图片调用它。

          有关 Instagram API 的更多信息,请查看此博文:Getting Friendly With Instagram’s API

          【讨论】:

            【解决方案10】:

            Instagram 开发者控制台为此提供了解决方案。 https://www.instagram.com/developer/endpoints/

            要在 PHP 中使用它,这里是代码 sn-p,

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-06-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多