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

175

Я пытаюсь поместить последние пользовательские СМИ в Instagram на боковую панель. Я пытаюсь использовать Instagram API для получения медиа.

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

Документация говорит GET https://api.instagram.com/v1/users/<user-id>/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?

Peeja
источник
Это возможно с этим плагином, просто извлеките исходный код того, как они загрузили последние общедоступные медиа пользователя, не прося пользователя войти в его или ее учетную запись Instagram. : D smashballoon.com/instagram-feed/demo Вам просто нужен идентификатор клиента, токен доступа не требуется. : D
Jehzlau
Вам нужно авторизоваться, чтобы они могли отслеживать вас и ограничивать ваши загрузки (тарифы ...), как любой большой API. Существует общедоступная для реальных пользователей и публичная для скребков / ботов, которая обычно не совпадает с тем, что реальные пользователи будут видеть рекламу и напрямую пользоваться сервисом.
Кристоф Русси,
1
Ни один из этих методов больше не работает. См stackoverflow.com/questions/49852080/...
Moradnejad

Ответы:

123

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

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

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

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

Эрсан Дж Сано
источник
9
Я думаю, что они, возможно, снова передумали. Я получаю такой же ответ об ошибке, как показано в ОП
Джеймс
35
Это действительно только для приложений, созданных до 17 ноября 2015 года, и не будет поддерживаться вообще после июня 2016 года. После этого вам понадобится oauth access_token. instagram.com/developer/changelog
Дакс Фол
211
Это так глупо и раздражает. Почему они заставляют токен доступа только для отображения изображений, которые уже являются общедоступными ? Я едва пытаюсь промыть их для каждого пользователя в мире, я просто хочу показать последнюю инста клиента, не тратя на это много часов. Г!
Мэтт Флетчер
8
@ Кабус ограничения скорости, приятель.
Уолф
20
@MattFletcher теперь еще более глупо, нужно пройти проверку разрешений приложений, и не уверен, что это вообще возможно, так как этот вариант использования «показ собственной ленты клиента на его собственной веб-странице» не является одним из вариантов использования. Да, эти ограничения отстой.
Ciantic
334

var name = "smena8m";
$.get("https://images"+~~(Math.random()*3333)+"-focus-opensocial.googleusercontent.com/gadgets/proxy?container=none&url=https://www.instagram.com/" + name + "/", function(html) {
if (html) {
    var regex = /_sharedData = ({.*);<\/script>/m,
        json = JSON.parse(regex.exec(html)[1]),
        edges = json.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges;

      $.each(edges, function(n, edge) {
          var node = edge.node;
          $('body').append(
              $('<a/>', {
              href: 'https://instagr.am/p/'+node.shortcode,
              target: '_blank'
          }).css({
              backgroundImage: 'url(' + node.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;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Вы можете скачать любой Instagram фид пользователя фото в формате JSON с использованием ?__a=1рядом с целевой страницей адреса , как это . Нет необходимости получать идентификатор пользователя или регистрировать приложение, нет токенов, нет oAuth.

min_idи max_idпеременные могут быть использованы для нумерации страниц, вот пример

YQLможет не работать здесь внутри фрагментированного iframe, поэтому вы всегда можете проверить это вручную в консоли YQL

ОБНОВЛЕНИЕ АПРЕЛЯ 2018: После последних обновлений Instagram вы не можете сделать это на стороне клиента (javascript), потому что пользовательские заголовки для подписанного запроса не могут быть установлены с помощью javascript из-за CORS Access-Control-Allow-Headersограничений. Это еще можно сделать это с помощью phpили любого другого метода на стороне сервера при правильной подписи на основе rhx_gis, csrf_tokenи параметры запроса. Вы можете прочитать больше об этом здесь .

ОБНОВЛЕНИЕ ЯНВАРЯ 2019: YQL вышел на пенсию, поэтому проверьте мое последнее обновление с Google Image Proxy в качестве CORSпрокси для страницы Instagram! Тогда только отрицательный момент - нумерация страниц недоступна при использовании этого метода.

PHP решение:

    $html = file_get_contents('https://instagram.com/apple/');
    preg_match('/_sharedData = ({.*);<\/script>/', $html, $matches);
    $profile_data = json_decode($matches[1])->entry_data->ProfilePage[0]->graphql->user;
350D
источник
14
@ 350D Как ты это нашел? Я не могу найти это нигде в их документации. Я просто хочу прочитать больше о том, что возможно с этой конечной точкой (например, квадратные изображения EG против неквадратных, есть ли у них планы на конец июня и т. Д.) - Спасибо!
Фил Джонстон
8
@Phil Johnston Просто исследование 😀 Возьмите другое - вы можете добавить / media /? Size = L рядом с URL целевой страницы фотографии и получить фотографию в полном разрешении.
350D
9
@ user2659694 Я наконец нашел решение, чтобы получить следующие страницы с помощью этого метода, который вы можете использовать / media /? max_id = [MAX_ID]
Реза
3
К вашему сведению, это работает, только если вы вошли в учетную запись Instagram самостоятельно. Попробуйте сделать это в Incognito в Chrome или аналогичном, и вы увидите, что ответ JSON не содержит элементов. Я пытался включить это в скрипт, чтобы получить список URL-адресов на веб-сервере, и мне пришлось вернуться к старым методам авторизации.
Райан Цинк
9
@RyanZink ты пробовал личный аккаунт? это работает нормально для меня, вышли из системы или инкогнито на общественных счетах.
Райан
41

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

Footniko
источник
Не могли бы вы дать мне знать, откуда взять query_id и идентификатор пользователя?
Виджайсин Пармар
2
@VijaysinhParmar, как я уже говорил, query_idявляется постоянной ценностью. Это означает, что это всегда 17888483320059182 (по крайней мере, если Instagram не изменит его). id пользователя - это id пользователя (немного отредактировал мой ответ)
Footniko
1
Я точно не помню, где-то в интернете. Но у меня нет никаких отношений с Instagram, поэтому, если он изменится, я не смогу рассказать вам о новом :(
Footniko
1
Интересно, какова политика ограничения скорости этого подхода?
kkzxak47
1
Если у кого-то возникают проблемы с запросом этого URL-адреса с помощью запроса CURL, вам необходимо получить заголовок запроса на cookie (откройте вкладку «Сети», после запуска url скопируйте заголовок cookie и вставьте его в заголовок запроса curl. Если вы этого не сделаете, вы получите ошибку 403 доступа отказано).
Андерс
40

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

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

Например

https://www.instagram.com/{username}/?__a=1
Майкл
источник
1
это также сработало для меня. но когда "is_video = true", нет видео URL в данных.
Дидике
4
Правильно, вы можете получить только миниатюры (но не само видео) - к сожалению, я не нашел никакой официальной документации для этого, и я понятия не имею, является ли этот API устаревшим или как долго он будет поддерживаться.
Майкл
8
По состоянию на 2018-04-13, это, кажется, больше не работает. Может быть, из-за последнего скандала с данными Facebook Cambridge Analytica, они затягивают дело на тонну. Любые другие предложения для получения основных пользовательских данных без аутентификации?
BakerStreetSystems
2
Да, было время, когда этот API не работал - но теперь он снова вернулся
Майкл
4
Это сработало для меня, но только когда я вошел в Instagram.
Зунди
16

На прошлой неделе в Instagram отключены /media/URL-адреса, я реализовал обходной путь, который пока работает довольно хорошо.

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

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

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

https://igapi.ga/<username>/media
e.g.: https://igapi.ga/whizzzkid/media 

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

https://igapi.ga/<username>/media?count=N // 1 < N < 20
e.g.: https://igapi.ga/whizzzkid/media?count=5

Используйте JSONP:

https://igapi.ga/<username>/media?callback=foo
e.g.: https://igapi.ga/whizzzkid/media?callback=bar

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

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

Спасибо @ 350D за это :)

whizzzkid
источник
1
@ rex, пока они не изменят то, как все работает в их конце, мы хороши! Они не беспокоили в последние 3 года, вероятно, не будут в следующие 3.
whizzzkid
3
@ whizzzkid Не повезло, они меняют это. Я видел, что вы думаете, что конечная точка пользователя будет делать вещи, но есть ограничения для запросов для не авторизованных пользователей. Любые идеи?
Благородный
1
@nobilik Обходной путь на месте, igpi.ga/whizzzkid/media?count=3 и igpi.ga/graphql/query/?user_id=1606740656&count=3 должны возвращать ваши данные. Помните, неопределенные рефереры отключены для этих URL.
whizzzkid
1
@ whizzzkid - Работай! Большое спасибо - вы ученый и джентльмен!
Джеймс Трики,
1
Я получаю сообщение об ошибке "Рефереру было отказано в доступе". Может быть, это больше не работает?
khalid13
14

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

Билл Роллинс
источник
4
Это не имеет смысла, если я хочу отображать свои собственные медиафайлы на своем собственном веб-сайте, зачем мне всем, кто хочет их видеть, иметь учетную запись в Instagram?
ниндзясенсе
5
Ниндзясенсе - я не думаю, что так оно и есть. Я думаю, что на вашем веб-сайте должен был бы быть фрагмент кода, который запрашивал бы API Instagram с вашими учетными данными oauth, чтобы получить доступ к вашим медиа. Затем вы бы показывали свои медиа всем пользователям вашего сайта. Ваш сайт будет единственным, что нужно для аутентификации в Instagram.
Билл Роулинсон
9

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

Мне нужен был способ использовать API Instagram, чтобы получить все последние медиа для конкретной учетной записи.

Крейг Хеневельд
источник
5
Это более или менее то, что я сделал в итоге: создал новую учетную запись, создал для нее токен доступа и сохранил этот токен в конфигурации моего сервера рядом с ключом API. Однако это плохое решение для приложений JS, поскольку требует доставки вашего токена доступа пользователю (что я видел во многих примерах кода). К счастью для меня, я могу сделать это на стороне сервера.
Peeja
4
@CraigHeneveld Как вы держите шляпу access_token в актуальном состоянии? Разве это не истекло для вас?
Райан Оре
Срок действия токена истекает?
Монит
Если мне не изменяет память, срок действия ключа истекает только после смены пароля. Вот еще одна тема по этому вопросу -> stackoverflow.com/questions/22753170/…
Крейг Хеневельд,
Как мы можем получить несколько фотографий пользователя? Например, можем ли мы передать несколько идентификаторов пользователей через ","?
Адил Кешвани,
9

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

# 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'
Бенджамин Талисман
источник
это решение работает для меня, но у меня возникли некоторые проблемы с ним. После загрузки данных мой сервер rails (использующий Rails 5.0.0, сервер Puma 3.6.0) перезагружается необъяснимым образом ... Любое возможное решение?
Луис Эдуардо Рохас Кабрера
8

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

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

Предполагая, что вы вернули 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.

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

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

пряность
источник
Это только помогло мне, я просто хочу показать последние сообщения Instagram для клиента. Спасибо!
Вестон Дебоер
1
instagram.com/username/?__a=1 выдаёт ошибку: доступ к www.instagram.com запрещен. У вас нет прав для просмотра этой страницы. HTTP ERROR 403 какие-нибудь другие идеи?
Хесе
1
Да, Instagram теперь убил это. «Чтобы постоянно улучшать конфиденциальность и безопасность пользователей Instagram, мы ускоряем устаревание платформы API Instagram, немедленно делая следующие изменения эффективными. Мы понимаем, что это может повлиять на ваш бизнес или услуги, и мы ценим вашу поддержку в обеспечении безопасности нашей платформы. Эти возможности будут немедленно отключены (ранее было установлено на 31 июля 2018 года или на 11 декабря 2018 года амортизация). "
специя
Если то, что я читаю правильно, больше не будет возможности извлекать изображения или данные из любого «некоммерческого» аккаунта. Они полностью убивают API платформы. Я думаю, что это то, что ... instagram.com/developer/changelog
spice
1
@james_tookey не будет возможным, приятель. Из-за их новых ограничений конфиденциальности он больше не сможет запрашивать или извлекать пользователей / данные личных учетных записей, а только бизнес. В основном они просто убили все использование API для личных аккаунтов.
специи
7

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 = "<li><a target='_blank' href='https://www.instagram.com/p/"+item.node.shortcode+"'><img src='" + item.node.thumbnail_src + "'/></a></li>";
                $("ul.instagram").append(data_li);
            }
        });

    });

});

HTML:

<ul class="instagram">
</ul>

CSS:

ul.instagram {
    list-style: none;
}

ul.instagram li {
  float: left;
}

ul.instagram li img {
    height: 100px;
}
Лео
источник
5

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

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

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

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

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

Вулович Вукасин
источник
4

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

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

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

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

Дориан Дэймон
источник
9
Кажется устаревшим.
Бурак Токак
возможно ли обойти аутентификацию для Instagram
JAck
3

Еще один трюк, поиск фотографий по хэштегам:

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

Куда:

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

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

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

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

kara4k
источник
Как вы это нашли?
ekntrtmz
3

Если вы хотите искать пользователей, не имея clientID и токена доступа:

1: Если вы хотите найти всех пользователей, имена которых похожи на ваше поисковое слово:

замените SeachName на текст, который вы хотите найти:

https://www.instagram.com/web/search/topsearch/?query=SearchName

2: если вы хотите найти точно такое же имя пользователя:

замените UserName на желаемое имя для поиска:

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

Рахул Гусейн
источник
2

Вы можете использовать этот API для получения общедоступной информации о пользователе Instagram:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2.

Если вы не установите параметр limit, посты будут ограничены 12 по умолчанию.

Это API был сделан в SpringBoot с HtmlUnit, как вы можете видеть в коде:

public JSONObject getPublicInstagramByUserName(String userName, Integer limit) {
    String html;
    WebClient webClient = new WebClient();

    try {
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setJavaScriptEnabled(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getCookieManager().setCookiesEnabled(true);

        Page page = webClient.getPage("https://www.instagram.com/" + userName);
        WebResponse response = page.getWebResponse();

        html = response.getContentAsString();
    } catch (Exception ex) {
        ex.printStackTrace();

        throw new RuntimeException("Ocorreu um erro no Instagram");
    }

    String prefix = "static/bundles/es6/ProfilePageContainer.js";
    String sufix = "\"";
    String script = html.substring(html.indexOf(prefix));

    script = script.substring(0, script.indexOf(sufix));

    try {
        Page page = webClient.getPage("https://www.instagram.com/" + script);
        WebResponse response = page.getWebResponse();

        script = response.getContentAsString();
    } catch (Exception ex) {
        ex.printStackTrace();

        throw new RuntimeException("Ocorreu um erro no Instagram");
    }

    prefix = "l.pagination},queryId:\"";

    String queryHash = script.substring(script.indexOf(prefix) + prefix.length());

    queryHash = queryHash.substring(0, queryHash.indexOf(sufix));
    prefix = "<script type=\"text/javascript\">window._sharedData = ";
    sufix = ";</script>";
    html = html.substring(html.indexOf(prefix) + prefix.length());
    html = html.substring(0, html.indexOf(sufix));

    JSONObject json = new JSONObject(html);
    JSONObject entryData = json.getJSONObject("entry_data");
    JSONObject profilePage = (JSONObject) entryData.getJSONArray("ProfilePage").get(0);
    JSONObject graphql = profilePage.getJSONObject("graphql");
    JSONObject user = graphql.getJSONObject("user");
    JSONObject response = new JSONObject();

    response.put("id", user.getString("id"));
    response.put("username", user.getString("username"));
    response.put("fullName", user.getString("full_name"));
    response.put("followedBy", user.getJSONObject("edge_followed_by").getLong("count"));
    response.put("following", user.getJSONObject("edge_follow").getLong("count"));
    response.put("isBusinessAccount", user.getBoolean("is_business_account"));
    response.put("photoUrl", user.getString("profile_pic_url"));
    response.put("photoUrlHD", user.getString("profile_pic_url_hd"));

    JSONObject edgeOwnerToTimelineMedia = user.getJSONObject("edge_owner_to_timeline_media");
    JSONArray posts = new JSONArray();

    try {
        loadPublicInstagramPosts(webClient, queryHash, user.getString("id"), posts, edgeOwnerToTimelineMedia, limit == null ? 12 : limit);
    } catch (Exception ex) {
        ex.printStackTrace();

        throw new RuntimeException("Você fez muitas chamadas, tente mais tarde");
    }

    response.put("posts", posts);

    return response;
}

private void loadPublicInstagramPosts(WebClient webClient, String queryHash, String userId, JSONArray posts, JSONObject edgeOwnerToTimelineMedia, Integer limit) throws IOException {
    JSONArray edges = edgeOwnerToTimelineMedia.getJSONArray("edges");

    for (Object elem : edges) {
        if (limit != null && posts.length() == limit) {
            return;
        }

        JSONObject node = ((JSONObject) elem).getJSONObject("node");

        if (node.getBoolean("is_video")) {
            continue;
        }

        JSONObject post = new JSONObject();

        post.put("id", node.getString("id"));
        post.put("shortcode", node.getString("shortcode"));

        JSONArray captionEdges = node.getJSONObject("edge_media_to_caption").getJSONArray("edges");

        if (captionEdges.length() > 0) {
            JSONObject captionNode = ((JSONObject) captionEdges.get(0)).getJSONObject("node");

            post.put("caption", captionNode.getString("text"));
        } else {
            post.put("caption", (Object) null);
        }

        post.put("photoUrl", node.getString("display_url"));

        JSONObject dimensions = node.getJSONObject("dimensions");

        post.put("photoWidth", dimensions.getLong("width"));
        post.put("photoHeight", dimensions.getLong("height"));

        JSONArray thumbnailResources = node.getJSONArray("thumbnail_resources");
        JSONArray thumbnails = new JSONArray();

        for (Object elem2 : thumbnailResources) {
            JSONObject obj = (JSONObject) elem2;
            JSONObject thumbnail = new JSONObject();

            thumbnail.put("photoUrl", obj.getString("src"));
            thumbnail.put("photoWidth", obj.getLong("config_width"));
            thumbnail.put("photoHeight", obj.getLong("config_height"));
            thumbnails.put(thumbnail);
        }

        post.put("thumbnails", thumbnails);
        posts.put(post);
    }

    JSONObject pageInfo = edgeOwnerToTimelineMedia.getJSONObject("page_info");

    if (!pageInfo.getBoolean("has_next_page")) {
        return;
    }

    String endCursor = pageInfo.getString("end_cursor");
    String variables = "{\"id\":\"" + userId + "\",\"first\":12,\"after\":\"" + endCursor + "\"}";

    String url = "https://www.instagram.com/graphql/query/?query_hash=" + queryHash + "&variables=" + URLEncoder.encode(variables, "UTF-8");
    Page page = webClient.getPage(url);
    WebResponse response = page.getWebResponse();
    String content = response.getContentAsString();
    JSONObject json = new JSONObject(content);

    loadPublicInstagramPosts(webClient, queryHash, userId, posts, json.getJSONObject("data").getJSONObject("user").getJSONObject("edge_owner_to_timeline_media"), limit);
}


Это пример ответа:

{
  "id": "290482318",
  "username": "thebrainscoop",
  "fullName": "Official Fan Page",
  "followedBy": 1023,
  "following": 6,
  "isBusinessAccount": false,
  "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/447ffd0262082f373acf3d467435f130/5C709C77/t51.2885-19/11351770_612904665516559_678168252_a.jpg",
  "photoUrlHD": "https://scontent-gru2-1.cdninstagram.com/vp/447ffd0262082f373acf3d467435f130/5C709C77/t51.2885-19/11351770_612904665516559_678168252_a.jpg",
  "posts": [
    {
      "id": "1430331382090378714",
      "shortcode": "BPZjtBUly3a",
      "caption": "If I have any active followers anymore; hello! I'm Brianna, and I created this account when I was just 12 years old to show my love for The Brain Scoop. I'm now nearly finished high school, and just rediscovered it. I just wanted to see if anyone is still active on here, and also correct some of my past mistakes - being a child at the time, I didn't realise I had to credit artists for their work, so I'm going to try to correct that post haste. Also; the font in my bio is horrendous. Why'd I think that was a good idea? Anyway, this is a beautiful artwork of the long-tailed pangolin by @chelsealinaeve . Check her out!",
      "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/ab823331376ca46136457f4654bf2880/5CAD48E4/t51.2885-15/e35/16110915_400942200241213_3503127351280009216_n.jpg",
      "photoWidth": 640,
      "photoHeight": 457,
      "thumbnails": [
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/43b195566d0ef2ad5f4663ff76d62d23/5C76D756/t51.2885-15/e35/c91.0.457.457/s150x150/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 150,
          "photoHeight": 150
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/ae39043a7ac050c56d741d8b4355c185/5C93971C/t51.2885-15/e35/c91.0.457.457/s240x240/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 240,
          "photoHeight": 240
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/ae7a22d09e3ef98d0a6bbf31d621a3b7/5CACBBA6/t51.2885-15/e35/c91.0.457.457/s320x320/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 320,
          "photoHeight": 320
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/1439dc72b70e7c0c0a3afcc30970bb13/5C8E2923/t51.2885-15/e35/c91.0.457.457/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 480,
          "photoHeight": 480
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/1439dc72b70e7c0c0a3afcc30970bb13/5C8E2923/t51.2885-15/e35/c91.0.457.457/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 640,
          "photoHeight": 640
        }
      ]
    },
    {
      "id": "442527661838057235",
      "shortcode": "YkLJBXJD8T",
      "caption": null,
      "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/dc94b38da679826b9ac94ccd2bcc4928/5C7CDF93/t51.2885-15/e15/11327349_860747310663863_2105199307_n.jpg",
      "photoWidth": 612,
      "photoHeight": 612,
      "thumbnails": [
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/c1153c6513c44a6463d897e14b2d8f06/5CB13ADD/t51.2885-15/e15/s150x150/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 150,
          "photoHeight": 150
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/47e60ec8bca5a1382cd9ac562439d48c/5CAE6A82/t51.2885-15/e15/s240x240/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 240,
          "photoHeight": 240
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/da0ee5b666ab40e4adc1119e2edca014/5CADCB59/t51.2885-15/e15/s320x320/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 320,
          "photoHeight": 320
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/02ee23571322ea8d0992e81e72f80ef2/5C741048/t51.2885-15/e15/s480x480/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 480,
          "photoHeight": 480
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/dc94b38da679826b9ac94ccd2bcc4928/5C7CDF93/t51.2885-15/e15/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 640,
          "photoHeight": 640
        }
      ]
    }
  ]
}
Руан Баррозу
источник
я могу получить данные по идентификатору пользователя (pk)
SAURABH RATHOD
Извините @SAURABHRATHOD Я пытался, но я не нашел способ сделать это. Я был бы очень рад, если бы кто-то решил это. Спасибо за комментарий.
Руан Баррозу
2

Мне действительно нужна была эта функция, но для Wordpress. Я вписался, и это сработало отлично

<script>
    jQuery(function($){
        var name = "caririceara.comcariri";
        $.get("https://images"+~~(Math.random()*33)+"-focus-opensocial.googleusercontent.com/gadgets/proxy?container=none&url=https://www.instagram.com/" + name + "/", function(html) {
            if (html) {
                var regex = /_sharedData = ({.*);<\/script>/m,
                  json = JSON.parse(regex.exec(html)[1]),
                  edges = json.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges;
              $.each(edges, function(n, edge) {
                   if (n <= 7){
                     var node = edge.node;
                    $('.img_ins').append('<a href="https://instagr.am/p/'+node.shortcode+'" target="_blank"><img src="'+node.thumbnail_src+'" width="150"></a>');
                   }
              });
            }
        });
    }); 
    </script>
Карра Макс
источник
1

Приведенный ниже код 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});
Вишну Канвар
источник
Я могу видеть только первые 12 сообщений, как я могу получить их все?
Рахул Гавале
0

Это работает с использованием простого вызова 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(
                    "<div class='col-md-4'><img class='img-fluid d-block' src='" + item.display_src + "'></div>"
                );
            });
        })
Эвин Вайссенберг
источник
Это сработало для меня, но только когда я вошел в Instagram.
Зунди
-1

Вот скрипт php, который загружает изображения и создает HTML-файл со ссылками на изображения. Кредит 350D за версию php, это только что проработано. Я бы посоветовал поставить это на постоянную работу и увольнять как угодно часто. Проверено работает по состоянию на май 2019 года .

<?
$user = 'smena8m';
$igdata = file_get_contents('https://instagram.com/'.$user.'/');
preg_match('/_sharedData = ({.*);<\/script>/',$igdata,$matches);
$profile_data = json_decode($matches[1])->entry_data->ProfilePage[0]->graphql->user;
$html = '<div class="instagramBox" style="display:inline-grid;grid-template-columns:auto auto auto;">';
$i = 0;
$max = 9;
while($i<$max){
    $imglink = $profile_data->edge_owner_to_timeline_media->edges[$i]->node->shortcode;
    $img = $profile_data->edge_owner_to_timeline_media->edges[$i]->node->thumbnail_resources[0]->src;
    file_put_contents('ig'.$i.'.jpg',file_get_contents($img));
    $html .= '<a href="https://www.instagram.com/p/'.$imglink.'/" target="_blank"><img src="ig'.$i.'.jpg" /></a>';
    $i++;
}
$html .= '</div>';
$instagram = fopen('instagram.html','w');
fwrite($instagram,$html);
fclose($instagram);
?>
drooh
источник