一般に、すべてのユーザーメディアを取得する必要があります。
ユーザーは250枚以上の写真を持っています。
私は/users/1/media/recent/?access_token=...&count=250
をします
ただし、20枚の写真しか返されません。
たぶん、instagramにはメディアの取得に制限があります。もしそうなら、応答にはそれを解決するためのページネーションがあります。ただし、最大の証明写真しかありません。それからページネーションする最初の(最小)証明写真を知る方法は?
そうです、Instagram APIは呼び出しごとに20個の画像のみを返します。そのため、ページネーション機能を使用する必要があります。
APIコンソールを使用しようとしている場合。まず、Instagramログイン経由でAPIコンソールを認証できるようにする必要があります。これを行うには、[認証]ドロップダウンで[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呼び出しを作成し、ページに既にある写真の最後に結果を追加します。ボタンの代わりに、ボタンを置き換えるだけで無限のスクロール効果を得ることができます。
それが役に立てば幸いです。
オプションのパラメーターカウントを-1に設定して、この問題を解決しました。
Instagram Developer Console の問題でした。 max_id
およびmin_id
はそこで機能しません。
pagination
の詳細については、 http://instagram.com/developer/endpoints/ を参照してください。結果がpagination
オブジェクトで指定されているnext_url
を使用して次の部分を要求するたびに、結果ページを順次実行する必要があります。
ユーザーのすべての投稿を取得するには、最適な再帰関数を使用します。
<?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);
?>
私がしなければならなかったのは(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;
};
写真のギャラリーの印刷に関連するものがあります。
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));
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
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を使って友好的になる
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;
}
}
}
}