Как я могу получить пользовательский носитель из Instagram без аутентификации в качестве пользователя?

Я пытаюсь поместить свежий материал Instagram для пользователей на боковой панели. Я пытаюсь использовать API-интерфейс Instagram для извлечения носителя.

http://instagram.com/developer/endpoints/users/

В документации говорится, что GET https://api.instagram.com/v1/users//media/recent/ , но он говорит, чтобы передать токен доступа OAuth. Маркер доступа представляет авторизацию для действий от имени пользователя. Я не хочу, чтобы пользователи входили в Instagram, чтобы увидеть это на боковой панели. Им также не нужно иметь учетную запись Instagram.

Например, я могу перейти на http://instagram.com/thebrainscoop, не войдя в Instagram и не увидев фотографии. Я хочу сделать это через API.

В API Instagram запросы, не прошедшие аутентификацию пользователя, передают client_id вместо access_token . Если я попробую это, я получаю:

 { "meta":{ "error_type":"OAuthParameterException", "code":400, "error_message":"\"access_token\" URL parameter missing. This OAuth request requires an \"access_token\" URL parameter." } } 

Итак, разве это невозможно? Невозможно ли получить последние (общедоступные) носители пользователя, не спрашивая пользователя сначала войти в учетную запись Instagram через OAuth?

    Это поздно, но стоит того, если это помогает кому-то, поскольку я не видел его в документации Instagram.

    Чтобы выполнить GET на https://api.instagram.com/v1/users//media/recent/ (в настоящее время написания), вам действительно не нужен токен доступа OAuth.

    Вы можете выполнить https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]

    [ID КЛИЕНТА] будет действительным идентификатором клиента, зарегистрированным в приложении, через управление клиентами (не относящимися к пользователю вообще). Вы можете получить [USER ID] от имени пользователя, выполнив запрос на поиск пользователей GET: https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]

     var name = "smena8m", items; $.getJSON("https://query.yahooapis.com/v1/public/yql", { q: "select * from json where url='https://www.instagram.com/" + name + "/?__a=1'", format: "json", _: name }, function(data) { console.log(data); if (data.query.results) { items = data.query.results.json.user.media.nodes; $.each(items, function(n, item) { $('body').append( $('', { href: 'https://www.instagram.com/p/'+item.code, target: '_blank' }).css({ backgroundImage: 'url(' + item.thumbnail_src + ')' })); }); } }); 
     html, body { font-size: 0; line-height: 0; } a { display: inline-block; width: 25%; height: 0; padding-bottom: 25%; background: #eee 50% 50% no-repeat; background-size: cover; } 
      

    11.11.2017
    Поскольку Instagram изменил способ предоставления этих данных, ни один из вышеперечисленных методов не работает в настоящее время. Вот новый способ получить пользовательские носители:
    GET https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
    Где:
    query_id – постоянное значение: 17888483320059182 (обратите внимание, что он может быть изменен в будущем).
    id – id пользователя. Он может поставляться со списком пользователей. Чтобы получить список пользователей, вы можете использовать следующий запрос: GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
    first – количество предметов, которые нужно получить.
    after – id последнего элемента, если вы хотите получить элементы из этого идентификатора.

    На прошлой неделе, Instagram disabled /media/ urls, я применил обходной путь, который сейчас работает очень хорошо.

    Чтобы решить все проблемы в этом streamе, я написал следующее: https://github.com/whizzzkid/instagram-reverse-proxy

    Он предоставляет все общедоступные данные instagram, используя следующие конечные точки:

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

     https://igapi.ga//media eg: https://igapi.ga/whizzzkid/media 

    Получите пользовательские носители с лимитом:

     https://igapi.ga//media?count=N // 1 < N < 20 eg: https://igapi.ga/whizzzkid/media?count=5 

    Использовать JSONP:

     https://igapi.ga//media?callback=foo eg: https://igapi.ga/whizzzkid/media?callback=bar 

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

    Надеюсь вам, ребята, нравится это!

    Благодаря @ 350D для определения этого 🙂

    Я смог получить самые последние средства пользователя, используя следующий API без аутентификации (включая описание, отзывы, комментарии).

    https://www.instagram.com/apple/?__a=1

    Например

     https://www.instagram.com/{username}/?__a=1 

    API-интерфейс Instagram требует аутентификации пользователя через OAuth для доступа к последней конечной точке мультимедиа для пользователя. Кажется, сейчас нет другого способа получить все носители для пользователя.

    Если вы ищете способ создания токена доступа для использования в одной учетной записи, вы можете попробовать это -> https://coderwall.com/p/cfgneq .

    Мне нужен был способ использовать instagram api, чтобы захватить все последние носители для определенной учетной записи.

    Вот рельсовые решения. Это своего рода задняя дверь, которая на самом деле является входной дверью.

     # create a headless browser b = Watir::Browser.new :phantomjs uri = 'https://www.instagram.com/explore/tags/' + query uri = 'https://www.instagram.com/' + query if type == 'user' b.goto uri # all data are stored on this page-level object. o = b.execute_script( 'return window._sharedData;') b.close 

    Возвращаемый объект изменяется в зависимости от того, является ли он поиском пользователя или поиском тегов. Я получаю такие данные:

     if type == 'user' data = o[ 'entry_data' ][ 'ProfilePage' ][ 0 ][ 'user' ][ 'media' ][ 'nodes' ] page_info = o[ 'entry_data' ][ 'ProfilePage' ][ 0 ][ 'user' ][ 'media' ][ 'page_info' ] max_id = page_info[ 'end_cursor' ] has_next_page = page_info[ 'has_next_page' ] else data = o[ 'entry_data' ][ 'TagPage' ][ 0 ][ 'tag' ][ 'media' ][ 'nodes' ] page_info = o[ 'entry_data' ][ 'TagPage' ][ 0 ][ 'tag' ][ 'media' ][ 'page_info' ] max_id = page_info[ 'end_cursor' ] has_next_page = page_info[ 'has_next_page' ] end 

    Затем я получаю другую страницу результатов, создавая URL-адрес следующим образом:

      uri = 'https://www.instagram.com/explore/tags/' + query_string.to_s\ + '?&max_id=' + max_id.to_s uri = 'https://www.instagram.com/' + query_string.to_s + '?&max_id='\ + max_id.to_s if type === 'user' 

    Благодаря постоянно изменяющейся (и ужасно разработанной) схеме API Instagram большинство из вышеперечисленных функций больше не будет работать с апреля 2018 года.

    Ниже приведен последний путь к доступу к отдельным пост-данным, если вы напрямую обращаетесь к их API, используя метод https://www.instagram.com/username/?__a=1 .

    Предполагая, что ваши возвращенные данные JSON – это $data вы можете прокручивать каждый результат, используя следующие примеры путей:

     foreach ($data->graphql->user->edge_owner_to_timeline_media->edges as $item) { $content_id = $item->node->id; $date_posted = $item-node->taken_at_timestamp; $comments = $item->node->edge_media_to_comment->count; $likes = $item->node->edge_liked_by->count; $image = $item->node->display_url; $content = $item->node->edge_media_to_caption->edges[0]->node->text; // etc etc .... } 

    Главными в этом недавнем изменении были graphql и edge_owner_to_timeline_media .

    Похоже, что они собираются убить этот доступ API для клиентов, не являющихся «бизнес» в DEC 2018, поэтому максимально используйте его, пока можете.

    Надеюсь, это поможет кому-то;)

    Просто хочу добавить к ответу @ 350D, поскольку мне было трудно понять.

    Моя логика в коде следующая:

    При первом вызове API я вызываю только https://www.instagram.com/_vull_ /media/ . Когда я получаю ответ, я проверяю значение boolean more_available . Если это правда, я получаю последнюю фотографию из массива, получаю свой идентификатор, а затем снова вызываю Instagram API, но на этот раз https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433 .

    Важно знать здесь, этот Id – это идентификатор последнего изображения в массиве. Поэтому, когда вы запрашиваете maxId с последним идентификатором изображения в массиве, вы получите следующие 20 снимков и так далее.

    Надеюсь, это прояснит ситуацию.

    Если вы обойдете Oauth, вы, вероятно, не знаете, какой пользователь instagram они есть. При этом есть несколько способов получить изображения instagram без аутентификации.

    1. API Instagram позволяет просматривать наиболее популярные изображения пользователя без проверки подлинности. Использование следующей конечной точки: вот ссылка

    2. При этом Instagram предоставляет rss-каналы для тегов.

    3. Пользовательские страницы Instagram являются общедоступными, поэтому вы можете использовать PHP с CURL, чтобы получить свою страницу и парсер DOM для поиска html для требуемых тегов изображений.

    Еще один трюк, поиск фотографий по hashtags:

     GET https://www.instagram.com/graphql/query/?query_hash=3e7706b09c6184d5eafd8b032dbcf487&variables={"tag_name":"nature","first":25,"after":""} 

    Где:

    query_hash – постоянное значение (я верю в его hash 17888483320059182, можно изменить в будущем)

    tag_name – название говорит само за себя

    first – количество элементов, которые нужно получить (я не знаю почему, но это значение не работает должным образом. Фактическое количество возвращенных фотографий немного больше значения, умноженного на 4,5 (около 110 для значения 25 и около 460 для значение 100))

    after – id последнего элемента, если вы хотите получить элементы из этого идентификатора. Значение end_cursor из ответа JSON можно использовать здесь.

    Ну, поскольку /?__a=1 перестали работать к настоящему времени, лучше использовать curl и проанализировать страницу instagram, как написано в этом ответе: Создать токен доступа к API-интерфейсу Instagram без необходимости входа в систему?

    Обновить

    Этот метод больше не работает

    JSFiddle

    Javascript:

     $(document).ready(function(){ var username = "leomessi"; var max_num_items = 5; var jqxhr = $.ajax( "https://www.instagram.com/"+username+"/?__a=1" ).done(function() { //alert( "success" ); }).fail(function() { //alert( "error" ); }).always(function(data) { //alert( "complete" ) items = data.graphql.user.edge_owner_to_timeline_media.edges; $.each(items, function(n, item) { if( (n+1) <= max_num_items ) { var data_li = "
  • "; $("ul.instagram").append(data_li); } }); }); });

    HTML:

     

    CSS:

     ul.instagram { list-style: none; } ul.instagram li { float: left; } ul.instagram li img { height: 100px; } 

    Следующий код nodejs сбрасывает популярные изображения с страницы Instagram. Функция «ScrapeInstagramPage» заботится о эффекте старения.

     var request = require('parse5'); var request = require('request'); var rp = require('request-promise'); var $ = require('cheerio'); // Basically jQuery for node.js const jsdom = require("jsdom"); const { JSDOM } = jsdom; function ScrapeInstagramPage (args) { dout("ScrapeInstagramPage for username -> " + args.username); var query_url = 'https://www.instagram.com/' + args.username + '/'; var cookieString = ''; var options = { url: query_url, method: 'GET', headers: { 'x-requested-with' : 'XMLHttpRequest', 'accept-language' : 'en-US,en;q=0.8,pt;q=0.6,hi;q=0.4', 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'referer' : 'https://www.instagram.com/dress_blouse_designer/', 'Cookie' : cookieString, 'Accept' : '*/*', 'Connection' : 'keep-alive', 'authority' : 'www.instagram.com' } }; function dout (msg) { if (args.debug) { console.log(msg); } } function autoParse(body, response, resolveWithFullResponse) { // FIXME: The content type string could contain additional values like the charset. // Consider using the `content-type` library for a robust comparison. if (response.headers['content-type'] === 'application/json') { return JSON.parse(body); } else if (response.headers['content-type'] === 'text/html') { return $.load(body); } else { return body; } } options.transform = autoParse; rp(options) .then(function (autoParsedBody) { if (args.debug) { console.log("Responce of 'Get first user page': "); console.log(autoParsedBody); console.log("Creating JSDOM from above Responce..."); } const dom = new JSDOM(autoParsedBody.html(), { runScripts: "dangerously" }); if (args.debug) console.log(dom.window._sharedData); // full data doc form instagram for a page var user = dom.window._sharedData.entry_data.ProfilePage[0].user; if (args.debug) { console.log(user); // page user console.log(user.id); // user ID console.log(user.full_name); // user full_name console.log(user.username); // user username console.log(user.followed_by.count); // user followed_by console.log(user.profile_pic_url_hd); // user profile pic console.log(autoParsedBody.html()); } if (user.is_private) { dout ("User account is PRIVATE"); } else { dout ("User account is public"); GetPostsFromUser(user.id, 5000, undefined); } }) .catch(function (err) { console.log( "ERROR: " + err ); }); var pop_posts = []; function GetPostsFromUser (user_id, first, end_cursor) { var end_cursor_str = ""; if (end_cursor != undefined) { end_cursor_str = '&after=' + end_cursor; } options.url = 'https://www.instagram.com/graphql/query/?query_id=17880160963012870&id=' + user_id + '&first=' + first + end_cursor_str; rp(options) .then(function (autoParsedBody) { if (autoParsedBody.status === "ok") { if (args.debug) console.log(autoParsedBody.data); var posts = autoParsedBody.data.user.edge_owner_to_timeline_media; // POSTS processing if (posts.edges.length > 0) { //console.log(posts.edges); pop_posts = pop_posts.concat (posts.edges.map(function(e) { var d = new Date(); var now_seconds = d.getTime() / 1000; var seconds_since_post = now_seconds - e.node.taken_at_timestamp; //console.log("seconds_since_post: " + seconds_since_post); var ageing = 10; // valuses (1-10]; big value means no ageing var days_since_post = Math.floor(seconds_since_post/(24*60*60)); var df = (Math.log(ageing+days_since_post) / (Math.log(ageing))); var likes_per_day = (e.node.edge_liked_by.count / df); // console.log("likes: " + e.node.edge_liked_by.count); //console.log("df: " + df); //console.log("likes_per_day: " + likes_per_day); //return (likes_per_day > 10 * 1000); var obj = {}; obj.url = e.node.display_url; obj.likes_per_day = likes_per_day; obj.days_since_post = days_since_post; obj.total_likes = e.node.edge_liked_by.count; return obj; } )); pop_posts.sort(function (b,a) { if (a.likes_per_day < b.likes_per_day) return -1; if (a.likes_per_day > b.likes_per_day) return 1; return 0; }); //console.log(pop_posts); pop_posts.forEach(function (obj) { console.log(obj.url); }); } if (posts.page_info.has_next_page) { GetPostsFromUser(user_id, first, posts.page_info.end_cursor); } } else { console.log( "ERROR: Posts AJAX call not returned good..." ); } }) .catch(function (err) { console.log( "ERROR: " + err ); }); } } ScrapeInstagramPage ({username : "dress_blouse_designer", debug : false}); 

    Попробуйте здесь

    Пример. Для заданного URL-адреса « https://www.instagram.com/dress_blouse_designer/ » можно вызвать функцию

     ScrapeInstagramPage ({username : "dress_blouse_designer", debug : false}); 

    Это работает с использованием простого вызова ajax и итерации путей изображения.

      var name = "nasa"; $.get("https://www.instagram.com/" + name + "/?__a=1", function (data, status) { console.log('IG_NODES', data.user.media.nodes); $.each(data.user.media.nodes, function (n, item) { console.log('ITEMS', item.display_src); $('body').append( "
    " ); }); })

    jsfiddle

      $(document).ready(function(){ var username = "hadidapp"; var max_num_items = 5; var jqxhr = $.ajax( "https://www.instagram.com/"+username+"/?__a=1&" ).done(function() { //alert( "success" ); }).fail(function() { //alert( "error" ); }).always(function(data) { //alert( "complete" ) items = data.graphql.user.edge_owner_to_timeline_media.edges; $.each(items, function(n, item) { if( (n+1) <= max_num_items ) { var data_li = "
  • "; $("ul.instagram").append(data_li); } }); }); });

    рабочий образец

    Давайте будем гением компьютера.