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


67

通常,我需要获取所有用户媒体。

用户有250多张照片。

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

但是它只返回20张照片。

也许instagram在获取媒体方面有限制。如果是这样,响应可以分页来解决。但是只有最大证件照。如何知道要分页的第一张(最小)身份证照片?

Answers:


56

没错,Instagram API每次调用仅返回20张图像。因此,您必须使用分页功能。

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

通过身份验证后,请使用左侧菜单选择用户/ {user-id} /媒体/最近的端点。因此,出于本{user-id}帖子的考虑,您可以将其替换为self。然后,它将使用您的帐户来检索信息。

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

next_max_id将用作查询的参数。请记住,max_id是图像的ID,该图像是最先返回的20张图像中的最旧的ID。这将用于返回早于该图像的图像。

如果不想,则不必使用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张照片。然后,我为图像分配一个数据ID(-ID实际上可以是您想要的任何名称)。然后在照片集的底部添加更多加载按钮。

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

希望能有所帮助。


谢谢,我做到了。我暂时没有检查,但是在今年5月,即使我设置了maxID或minID,我也只得到了前20个元素。
安东尼

从instagram API中删除了此功能吗?现在我无法从经过身份验证的用户那里获得超过20张图像
Pedram marandi 16'Jan

5
我也正在尝试此操作,并且响应的分页属性为空,因此我认为不再可能提取用户的整个提要。就像端点的名称所暗示的那样,它被称为“最近的”,因此看来我们现在正在获取最新的帖子。我仍在寻找解决方案。
jcaruso

21
事实证明,在沙盒模式下,您只会得到最近的20条帖子。一旦获得批准,您就可以从用户帐户中检索所有帖子。
jcaruso

19

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


1
504 Gateway Time-out根据我的测试,使用count = -1实际上会导致a发生。
艾伦·大卫·加西亚

1
-1实际上减少了1个结果
Rony Varghese 2013年

我丢失了字幕值和其他计数为-1的字幕。
cutez7boyz 2014年

1
这确实为我工作了大约一个月,但现在不再起作用。没有数据的API返回码200。
sim14 2014年

1
@RonyVarghese是不正确的。索引中的[-1]指向最后一个元素,因此它将一直计数到最后一个元素。不知道时不要说愚蠢的话。
罗卡蒙德


5

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


感谢您的回答。是的,就是这样,但是在控制台中您只能获得最后一些元素。最大和最小偏移量在控制台中不起作用。至少在半年前。
安东尼

2
在2016年3月运行端点将返回一个空的分页对象。似乎不再受支持。但是找不到关于为什么或是否有可能通过api获取用户整个提要的任何官方解释。
jcaruso

实际上,对于用户媒体最近的端点,分页似乎是空的。但是新的Instagram文档(2015年11月17日)明确表示:“数据仅限沙盒用户以及每个沙盒用户的20种最新媒体
sofia

1
而且“ 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

2
看起来现在已在此端点上忽略了max_id参数。
alnorth29 '18

4

我要做的是(使用Javascript)使用递归函数遍历所有页面。这很危险,因为instagram用户可能会从中获得数千张图片(因此您必须控制它),我使用以下代码:(我认为count参数没有太大作用)

        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,对我来说,它的工作对我来说是个好工作
devpro 2016年

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

?>

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

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显示URL以获取接下来的20张图片,因此只需获取该URL并为接下来的20张图片进行调用即可。

有关Instagram API的更多信息,请查看此博客文章:与Instagram API友好


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

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.