Подтвердить что ты не робот

API Instagram: как получить все пользовательские носители?

В общем, мне нужно получить все пользовательские носители.

Пользователь имеет более 250 фотографий.

Я делаю /users/1/media/recent/?access_token=...&count=250

Но он возвращает только 20 фотографий.

Возможно, у instagram есть предел для получения медиа. Если это так, ответ имеет разбиение на страницы, чтобы решить проблему. Но есть только макс. ID-фотография. Как узнать первую (минимальную) ID-фотографию для разбивки на страницы?

4b9b3361

Ответ 1

Вы правы, API Instagram вернет только 20 изображений за звонок. Поэтому вам придется использовать функцию разбиения на страницы.

Если вы пытаетесь использовать консоль API. Сначала вы хотите, чтобы консоль API аутентифицировалась через ваш вход в Instagram. Для этого вам нужно выбрать OAUTH2 в раскрывающемся списке "Аутентификация".

После проверки подлинности используйте меню левой стороны, чтобы выбрать пользователей /{user-id}/media/recent endpoint. Итак, ради этого сообщения для {user-id} вы можете просто заменить его на себя. Затем он будет использовать вашу учетную запись для извлечения информации.

На минимальном уровне это то, что нужно для GET для этой конечной точки. Как только вы отправите, вы получите несколько json вернулся к вам. В самом верху возвращенной информации после всей информации о сервере вы увидите фрагментацию с next_url и next_max_id.

next_max_id - это то, что вы будете использовать в качестве параметра для своего запроса. Помните, что max_id - это идентификатор изображения, который является самым старым из 20, который был сначала возвращен. Это будет использоваться для возврата изображений раньше этого изображения.

Вам не нужно использовать max_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 фотографий, возвращенных из первоначального недавнего медиа-запроса. Затем я назначаю изображения идентификатором данных (-ид может быть тем, кем бы вы хотели). Затем добавлена ​​кнопка "Загрузить больше" в нижней части набора фотографий.

Когда нажимается кнопка, я использую jQuery для захвата последнего изображения и атрибута data-id и использую его для создания вызова get через ajax и добавления результатов в конец фотографий, уже находящихся на странице. Вместо кнопки вы можете просто заменить ее на бесконечный эффект прокрутки.

Надеюсь, что это поможет.

Ответ 2

Я решил эту проблему с дополнительным параметром count, установленным в -1.

Ответ 4

См. Http://instagram.com/developer/endpoints/ для получения информации о pagination. Вам нужно последовательно пройтись по страницам результатов, каждый раз запрашивая следующую часть с next_url который результат указывает в объекте pagination на pagination.

Ответ 5

Мне нужно было (в 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;
    };

Есть некоторые вещи, связанные с печатью галереи изображений.

Ответ 6

Используйте лучшую функцию рекурсии для получения всех сообщений пользователей.

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

?>

Ответ 7

Вы можете разбивать страницы на PHP API Instagram: 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));

Ответ 8

В июне 2016 года Instagram предоставил большую часть функциональности своего API только для приложений, прошедших процесс обзора. Однако они по-прежнему предоставляют данные 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

Ответ 9

Используйте объект 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 изображений.

Дополнительные сведения об API-интерфейсе Instagram см. в этом блоге: "Подходит для использования с API-интерфейсом"

Ответ 10

Консоль разработчика 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;
                   }
           }
    }

}