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



В общем мне нужно получить всех пользователей СМИ.



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



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



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



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

789   10  

10 ответов:

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

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

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

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

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

надеюсь, что помогает.

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

Это была проблема в Instagram Developer Console. max_id и min_id не работает.

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

то, что я должен был сделать, это (в 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;
    };

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

вы можете использовать пагинацию 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));

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

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

?>

в июне 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

Edit: как упоминалось в комментарии alnorth29,

использовать 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 Instagram

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

}

Comments

    Ничего не найдено.