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

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

用户有超过250张照片。

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

但它只返回20张照片。

也许instagram有获得媒体的限制。 如果是这样,响应有一个分页来解决它。 但是只有最大ID照片。 如何知道第一张(分钟)身份证照片来分页呢?

你说得对,Instagram API每次只能返回20个图片。 所以你必须使用分页function。

如果您正在尝试使用API​​控制台。 您将首先允许API控制台通过您的Instagramlogin进行身份validation。 要做到这一点,你需要在authentication下拉菜单中selectOAUTH2。

一旦通过身份validation,使用左侧菜单来selectusers / {user-id} / media / recent endpoint。 所以为了这个{user-id}的post,你可以用自己来replace它。 这将使用您的帐户来检索信息。

在这个端点上做一个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张照片。 然后,我分配图像的数据id(-id实际上可以是任何你想要的)。 然后在照片集的底部添加一个加载更多button。

当button被点击时,我使用jQuery抓取最后一个图像,它是data-id属性,并使用它通过ajax创build一个get调用,并将结果附加到已经在页面上的照片的末尾。 而不是一个button,你可以取而代之的是一个无限的滚动效果。

希望有所帮助。

我已经解决了这个问题,可选参数数量设置为-1。

这是在Instagram开发者控制台中的一个问题。 max_idmin_id在那里不起作用。

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

我所要做的是(使用Javascript)是通过使用recursion函数遍历所有页面。 这是危险的,因为instagram用户可能有成千上万的图片ia的一部分(所以你必须控制它)我使用这个代码:(计数参数我认为,没有太多)

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

有一些相关的东西打印出图片的画廊。

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

使用最好的recursion函数获取所有用户的post。

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

使用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的更多信息,请查看此博客post: 通过Instagram的API获取友善信息

2016年6月,Instagram将其API的大部分function仅提供给已通过审核stream程的应用程序。 但是他们仍然通过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 

Instagram开发者控制台已经为它提供了解决scheme。 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; } } } }