Instagram API:如何获取所有用户媒体?

时间:2012-06-04 12:43:23

标签: api instagram

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

用户有超过250张照片。

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

但它只返回20张照片。

也许Instagram对获取媒体有限制。 如果是,响应有一个分页来解决它。 但是只有最大ID照片。如何知道第一张(分钟)ID照片然后分页呢?

10 个答案:

答案 0 :(得分:54)

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

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

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

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

next_max_id是您将用作查询参数的内容。请记住,max_id是图像的id,它是最先返回的20个中最早的图像。这将用于返回早于此图像的图像。

如果您不想,则不必使用max_id。实际上,你可以抓住想要开始查询更多图像的图像的ID。

因此,从返回的数据中,将max_id复制到参数max_id中。请求网址应类似于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调用,并将结果追加到页面上已有的照片的末尾。您可以将其替换为具有无限滚动效果的按钮,而不是按钮。

希望有所帮助。

答案 1 :(得分:20)

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

答案 2 :(得分:7)

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

答案 3 :(得分:5)

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

答案 4 :(得分:4)

我必须做的是(在Javascript中)通过使用递归函数遍历所有页面。这是dangerouse,因为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;
    };

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

答案 5 :(得分:4)

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

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

?>

答案 6 :(得分:4)

您可以使用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));

答案 7 :(得分:3)

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

答案 8 :(得分:2)

使用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张图片的网址,因此只需获取该网址并在接下来的20张图片中调用该网址。

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

答案 9 :(得分:0)

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

要在PHP中使用它,这里是代码片段,

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

}