Instagram API: как получить все пользовательские медиа?
В общем мне нужно получить всех пользователей СМИ.
пользователь имеет более 250 фотографий.
Я /users/1/media/recent/?access_token=...&count=250
но он возвращает только 20 фотографий.
может быть, instagram имеет ограничение на получении средств массовой информации.
Если это так, ответ имеет разбиение на страницы, чтобы решить эту проблему.
Но есть только Макс удостоверение личности с фотографией. Как узнать первый (мин) удостоверение личности с фотографией, чтобы вставить его потом?
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 и добавления результатов в конец фотографий уже на странице. Вместо кнопки вы можете просто заменить ее, чтобы иметь бесконечный эффект прокрутки.
надеюсь, что помогает.
Это была проблема в 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 doneEdit: как упоминалось в комментарии 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