通常,我需要获取所有用户媒体。
用户有250多张照片。
我做 /users/1/media/recent/?access_token=...&count=250
但是它只返回20张照片。
也许instagram在获取媒体方面有限制。如果是这样,响应可以分页来解决。但是只有最大证件照。如何知道要分页的第一张(最小)身份证照片?
Answers:
没错,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调用,并将结果附加到页面上已有照片的末尾。代替按钮,您可以将其替换为无限滚动效果。
希望能有所帮助。
我已经通过将可选参数计数设置为-1解决了此问题。
504 Gateway Time-out
根据我的测试,使用count = -1实际上会导致a发生。
这是Instagram开发者控制台中的问题。max_id
并且min_id
在那里不工作。
有关的信息,请参见http://instagram.com/developer/endpoints/pagination
。您需要随后逐步浏览结果页面,每次都要求使用next_url
结果在pagination
对象中指定的下一部分。
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
我要做的是(使用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;
};
有一些有关打印图片库的内容。
使用最佳递归功能获取用户的所有帖子。
<?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);
?>
您可以对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));
使用 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友好
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;
}
}
}
}