web-dev-qa-db-ja.com

Instagram API:すべてのユーザーメディアを取得する方法

一般に、すべてのユーザーメディアを取得する必要があります。

ユーザーは250枚以上の写真を持っています。

私は/users/1/media/recent/?access_token=...&count=250をします

ただし、20枚の写真しか返されません。

たぶん、instagramにはメディアの取得に制限があります。もしそうなら、応答にはそれを解決するためのページネーションがあります。ただし、最大の証明写真しかありません。それからページネーションする最初の(最小)証明写真を知る方法は?

65
Anthony

そうです、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呼び出しを作成し、ページに既にある写真の最後に結果を追加します。ボタンの代わりに、ボタンを置き換えるだけで無限のスクロール効果を得ることができます。

それが役に立てば幸いです。

55
michaellee

オプションのパラメーターカウントを-1に設定して、この問題を解決しました。

20
Stefan

Instagram Developer Console の問題でした。 max_idおよびmin_idはそこで機能しません。

7
Anthony

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

?>
4
user2536876

私がしなければならなかったのは(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 AP​​I: 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));
4
thiiisantos

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
3
nisetama

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を使って友好的になる

2
user3632055

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

}
0
urvi sheth