67

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

用户拥有超过 250 张照片。

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

但它只返回 20 张照片。

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

4

10 回答 10

56

没错,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 调用,并将结果附加到页面上已有照片的末尾。您可以将其替换为具有无限滚动效果的按钮,而不是按钮。

希望有帮助。

于 2012-12-05T16:42:05.923 回答
19

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

于 2013-01-29T15:20:20.453 回答
7

这是Instagram Developer Console中的一个问题。max_id并且min_id在那里不起作用。

于 2012-06-05T06:38:18.003 回答
5

有关. _ _ pagination您需要随后逐步浏览结果页面,每次都使用结果在对象next_url中指定的请求下一部分。pagination

于 2012-12-03T22:01:22.293 回答
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
于 2017-09-03T07:11:15.510 回答
4

我要做的是(在 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;
    };

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

于 2013-11-22T18:36:34.107 回答
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);

?>
于 2015-02-27T03:21:56.217 回答
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));
于 2015-08-10T18:13:20.393 回答
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 张图片的 URL,因此只需获取该 URL 并为接下来的 20 张图片调用它。

有关 Instagram API 的更多信息,请查看这篇博文:使用 Instagram 的 API 变得友好

于 2015-03-18T22:54:53.523 回答
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;
                   }
           }
    }

}
于 2017-09-06T12:39:50.817 回答