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

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

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?


person Peeja    schedule 28.06.2013    source источник
comment
Это возможно с помощью этого плагина, просто проверьте исходный код того, как они получают последние общедоступные медиа пользователя, не прося пользователя войти в его или ее учетную запись Instagram. : D smashballoon.com/instagram-feed/demo Вам просто нужен идентификатор клиента, нет необходим токен доступа. : D   -  person jehzlau    schedule 25.10.2016
comment
Вам нужно авторизоваться, чтобы они могли отслеживать вас и ограничивать ваши загрузки (ставки ...), как и любой большой API. Есть общедоступные для реальных пользователей и общедоступные для парсеров / ботов, что обычно не то же самое, что реальные пользователи будут видеть рекламу и напрямую использовать сервис.   -  person Christophe Roussy    schedule 16.04.2018
comment
Ни один из этих методов больше не работает. См. stackoverflow.com/questions/49852080/   -  person Moradnejad    schedule 21.04.2018
comment
stackoverflow.com/questions/59526137/   -  person Amrut Bidri    schedule 30.12.2019
comment
Вы можете использовать profilepageimages.usecue.com. Внимание: я являюсь автором этого инструмента.   -  person JoostS    schedule 22.01.2021


Ответы (20)


Это поздно, но стоит того, если это кому-то поможет, поскольку я не видел этого в документации 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]

person Ersan J Sano    schedule 11.12.2013
comment
Вау, похоже, ты прав. Я почти уверен, что раньше он отвечал какой-то ошибкой аутентификации. Рад, что они передумали! (Даже если это еще не задокументировано.) - person Peeja; 12.12.2013
comment
Думаю, они, возможно, снова передумали. Я получаю тот же ответ об ошибке, что и в OP - person James; 26.01.2014
comment
Моя ошибка, вам просто нужно указать client_id, как описано здесь: instagram.com/developer/authentication - person James; 26.01.2014
comment
вы можете установить ограничение на количество возвращаемых носителей? - person Asher; 05.06.2015
comment
Это отлично работает для меня, захватывая идентификатор пользователя для любого имени пользователя, а затем запрашивая последнюю версию для этого идентификатора пользователя. Спасибо - person jamescampbell; 24.06.2015
comment
@Asher Просто добавьте &count=5 в конец URL, чтобы получить последние 5 элементов. Заменить любым количеством предметов. - person jsejcksn; 07.10.2015
comment
Это действительно только для приложений, созданных до 17 ноября 2015 года, и не будет поддерживаться вообще после июня 2016 года. После этого вам понадобится oauth access_token. instagram.com/developer/changelog - person Dax Fohl; 23.11.2015
comment
Это так глупо и раздражает. Зачем им принудительно использовать токен доступа только для отображения изображений, которые уже общедоступны? Я вряд ли пытаюсь промыть их для каждого пользователя в мире, я просто хочу отобразить последнюю версию клиента, не тратя часы на то, чтобы возиться с ней. Ага! - person Matt Fletcher; 17.12.2015
comment
Просто подумайте: нельзя ли один раз запросить токен аутентификации с помощью api.instagram .com / oauth / authorize /? client_id = {client_id} & redirect_uri = {redirectURI} & response_type = token & scope = public_content и просто использовать этот токен для каждого будущего запроса? Каждый экземпляр вашего приложения / веб-сеанса будет запрашивать от одного и того же пользователя, но что делать, если он работает? : D - person CodingMeSwiftly; 14.01.2016
comment
@ Ограничения скорости кабуса, приятель. - person Walf; 25.05.2016
comment
@MattFletcher теперь еще более глупо, нужно пройти проверку разрешений приложения и не быть уверенным, что это вообще возможно, поскольку этот вариант использования, показывающий собственный канал клиента на его собственной веб-странице, не является одним из вариантов использования. Да уж, эти ограничения - отстой. - person Ciantic; 04.06.2016
comment
@ Мэтт Флетчер, теперь у вас есть представление, как показывать общедоступное содержимое из instgram. у меня такая же проблема - person Albert; 15.07.2016
comment
О нет .. Значит уже невозможно забрать фото из инстаграмм другого пользователя. Вот почему мои социальные ленты от разных инстаграмеров больше не работают. T___T Жаль, даже если он общедоступен. - person jehzlau; 24.10.2016
comment
Ой, подождите, плагин smashballoon смог получить фотографии из Instagram без токенов доступа пользователя. Таким образом, все еще возможно отображение чужих фото в instagram без аутентификации. :) smashballoon.com/instagram-feed/demo - person jehzlau; 25.10.2016
comment
Спасибо за ответ. Как мы можем получить несколько пользовательских фотографий ?? Например, можем ли мы передать несколько идентификаторов пользователей, разделенных,? - person Aadil Keshwani; 25.10.2016
comment
По крайней мере, с API Facebook вы можете просто использовать app_id|app_secret в качестве токена доступа для выполнения общедоступных запросов. - person adamj; 12.04.2017
comment
У вас нет авторизации для просмотра этой страницы. ОШИБКА HTTP 403 - person Mohsen Molaei; 13.04.2018
comment
Это так глупо ... к счастью, виджет inwidget.apiroad.net обходит ограничения Instagram для изображений пользователей и хэштегов (все еще Работает в 2021 году) - person superjet; 07.05.2021

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;
person 350D    schedule 18.11.2015
comment
Я пробовал, но, похоже, мы получаем только около 20 записей, не могли бы вы сказать мне, как получить все медиа или фото из учетной записи Instagram? - person user2659694; 24.11.2015
comment
@ user2659694, к сожалению, стандартные параметры url в этом случае не работают - person 350D; 25.11.2015
comment
@ 350D Как ты это нашел? Я нигде не могу найти его в их документации. Я просто хочу узнать больше о том, что возможно с этой конечной точкой (квадратные изображения EG против неквадратных, есть ли планы закончиться в июне и т. Д.) - Спасибо! - person Phil Johnston; 08.01.2016
comment
@Phil Johnston Просто исследование ???? Возьмите еще одно - вы можете добавить / media /? Size = L рядом с URL-адресом целевой страницы фотографии и получить фотографию ПОЛНОГО разрешения. - person 350D; 08.01.2016
comment
@ 350D Я хотел бы знать, где находится это исследование - у вас есть ссылка, которой вы могли бы поделиться? Я искал это целую неделю. - person Phil Johnston; 08.01.2016
comment
Это круто! Однако Instagram может закрыть это в любой день. Я не уверен, что буду использовать это в приложении и т. Д.: / Жаль, потому что это действительно хорошо - person CodingMeSwiftly; 14.01.2016
comment
@ user2659694 Я наконец нашел решение для получения следующих страниц с помощью этого метода, который вы можете использовать / media /? max_id = [MAX_ID] - person Reza; 18.01.2016
comment
@PhilJohnston сегодня я обнаружил, что вы можете получить некоторую информацию о /media/?size= в официальной документации здесь! - person 350D; 19.01.2016
comment
Как получить min_id и max_id? Я немного запутался, я тоже хочу получить более 20 изображений, я использую PHP, я просто не могу понять. - person Kenziiee Flavius; 19.02.2016
comment
@KenziieeFlavius ​​у вас есть items[].id, поэтому используйте эту id форму max / min - person 350D; 19.02.2016
comment
Фантастика. Хотелось бы, чтобы они поместили это в центр документации. Потратил полдня на поиски такого простого решения. - person shacker; 02.03.2016
comment
Я попытался получить более 20 каналов из instragram, используя этот метод, но когда я передаю max_id или min_id, это не имеет никакого эффекта, я все равно получаю те же 20 каналов. - person Edris; 04.04.2016
comment
Я тоже занимаюсь этим. 20 элементов выглядят как ограничение песочницы: данные ограничены 10 пользователями и 20 самыми последними носителями от каждого из этих пользователей из instagram.com/developer/sandbox - person bertster; 05.04.2016
comment
К вашему сведению, это работает только в том случае, если вы сами вошли в учетную запись Instagram. Попробуйте сделать это в режиме инкогнито в Chrome или аналогичном, и вы увидите, что ответ JSON не содержит элементов. Я пытался включить это в сценарий, чтобы получить список URL-адресов на веб-сервере, и мне пришлось вернуться к старым методам авторизации. - person Ryan Zink; 01.05.2016
comment
@ 350D Есть ли способ получить такой доступ к моей ленте Instagram? а не только пользовательский канал. - person Arvand; 24.05.2016
comment
@RyanZink не соответствует действительности для меня - я даже использовал его без авторизации с помощью Tor - person gerbz; 25.05.2016
comment
@RyanZink вы пытались открыть личный аккаунт? он работает нормально для меня, вышедшего из системы или инкогнито в публичных аккаунтах. - person ryan; 25.05.2016
comment
@VivekSancheti min / max работает нормально. Просто сделайте max_id равным 20-му идентификатору в предыдущем ответе. - person gerbz; 25.05.2016
comment
@ryan В этом, возможно, была разница. Учетная запись, которую я пробовал, была частной. - person Ryan Zink; 25.05.2016
comment
Если вы пытаетесь обойти ошибку CORS в JS, вы можете вместо этого позвонить на свой сервер или использовать обратный прокси. - person stephen.hanson; 01.06.2016
comment
FYI count не работает. Даже использование max_id и min_id всегда будет возвращать 20 результатов. Если до / после _4 _ / _ 5_ больше нет содержимого, он все равно вернет 20 результатов. max_id и min_id работают, хотя на момент этого комментария. - person Robbie Trencheny; 09.06.2016
comment
Этот. Является. Потрясающие. - person NICO; 12.07.2016
comment
Для тех, кому нужна помощь с разбивкой на страницы: просто получите items.id последнего элемента и передайте его как max_id, как показано в примерах выше. Это даст вам следующие 20 изображений. Спасибо за находку, это потрясающе !!! - person Micro; 17.07.2016
comment
это так просто и легко, и это должен быть общепринятый ответ - прямо в точку! - person benzkji; 21.07.2016
comment
@ 350D и все такое. Ребят .. Как это решение сделать с помощью JS. Не могу получить ответ. jsfiddle.net/4ozz2nj9 - person bCliks; 08.08.2016
comment
@bCliks Здесь нет параметров, для этих конечных точек недоступен JSONP или междоменный доступ - person 350D; 09.08.2016
comment
Кажется, что у этого URL-адреса есть проблема с cors, и он также не отвечает на запрос jsonp. - person user5363938; 10.08.2016
comment
Отличное решение, спасибо! Кто-нибудь знает, как получить имя пользователя из идентификатора пользователя? - person João Abrantes; 14.08.2016
comment
Я пытался использовать jquery и использовать этот код как API '$ .getJSON (' instagram. com / smena8m / media / ', function (insta) {});' Я получаю сообщение об ошибке XMLHttpRequest не может загрузить instagram.com/smena8m/media. На запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin. Следовательно, к источнику 's.codepen.io' не разрешен доступ. Я пытаюсь из codepen. Что мне не хватает? - person Hadnazzar; 15.08.2016
comment
@Hadnazzar, вам не хватает междоменных ограничений. Для этих конечных точек нет ни cors, ни jsonp, ни междоменного доступа. Только сервер использовать. - person 350D; 15.08.2016
comment
возможно ли подсчитать количество подписчиков публичных профилей без доступа ?? - person Vijaysinh Parmar; 08.09.2016
comment
@ 350D Отлично ... большое спасибо ... ты спас мне день ... это сработало ... можешь поделиться ссылкой, откуда ты это взял ?? Какие еще общедоступные данные я могу получить? - person Vijaysinh Parmar; 09.09.2016
comment
о боже ... почему это не буквально первое, что есть в документации API Instagram? - person danielgormly; 16.09.2016
comment
да ничего себе, 30 минут чтения разного, что это, именно то, что мне нужно! +++ - person edencorbin; 04.10.2016
comment
Это отличный ответ! Не могу поверить, что я потратил так много времени на попытки других решений, прежде чем случайно столкнулся с этим. +1! - person Eric; 06.10.2016
comment
Как мы можем получить несколько пользовательских фотографий ?? Например, можем ли мы передать несколько идентификаторов пользователей, разделенных,? - person Aadil Keshwani; 25.10.2016
comment
Спасибо тебе за это. Не знаю, как вы это нашли, но большое вам спасибо за то, что поделились! - person henk.io; 25.10.2016
comment
Есть ли что-то подобное, что я мог бы использовать для надежного получения изображения профиля пользователя? - person Luke Taylor; 29.01.2017
comment
Есть ли какая-нибудь библиотека C #, которая обертывает эту функциональность, не беспокоясь об аутентификации? - person skeletank; 01.02.2017
comment
@skeletank, в частности: instagram.com/smena8m/media? Он доступен без аутентификации и представляет собой простой REST API: вы запрашиваете данные со страницы и получаете JSON;) Это очень просто и хорошо документировано для C #, просто Google получает и анализирует JSON c # - person ignacy130; 21.02.2017
comment
@ 350D на основе вашего исследования я написал этот github.com/whizzzkid/instagram-reverse-proxy - person whizzzkid; 11.03.2017
comment
@Reza этот метод не отображает все тексты комментариев ... ограничивается 4 последними. есть ли способ увидеть все комментарии? (то же самое для лайков и информации о пользователях, которым понравился пост) - person AmiNadimi; 23.04.2017
comment
@Legionar Проверить обновленный фрагмент. Старая /media/ конечная точка сегодня не работает по какой-то причине ... - person 350D; 08.11.2017
comment
@Choletski Проверьте АПРЕЛЬСКОЕ ОБНОВЛЕНИЕ в посте - person 350D; 22.06.2018
comment
привет, спасибо за блестящее решение, вы знаете, как загрузить изображение профиля с помощью этого метода? - person iKamy; 02.04.2019
comment
@CameronA Это уже есть, проверьте раздел user в ответе json в примере фрагмента - person 350D; 02.04.2019
comment
можно ли получить другую информацию, такую ​​как информация, имя, сообщения, например номер ...? - person iKamy; 03.04.2019
comment
не могли бы вы описать возвращенный объект? - person iKamy; 03.04.2019
comment
@CameronA log и проверьте вашу консоль, пожалуйста - person 350D; 03.04.2019
comment
да, спасибо, я проверил консоль и могу получить доступ ко всему об объекте - person iKamy; 04.04.2019
comment
Почему этого нет в их документации? И как вам удалось получить всю эту информацию? Меня беспокоит, что если эта конечная точка никогда не предназначалась для публичного использования, она могла быть отключена в любой момент, если окажется, что это брешь в безопасности. - person Roel; 25.07.2020
comment
@ 350D min_id / max_id не работает, каждый раз возвращает один и тот же результат. Есть новости по этому поводу? - person Yasitha; 02.10.2020
comment
Я получаю 403 запрещенных на дату этого комментария. Когда я посещаю URL-адрес, сгенерированный в этом запросе, я получаю страницу с сообщением "Приносим извинения ... но ваш компьютер или сеть могут отправлять автоматические запросы". Чтобы защитить наших пользователей, мы не можем обработать ваш запрос прямо сейчас. Это было весело, пока он продолжался!! - person kennsorr; 02.04.2021
comment
Меня заблокировали: NotSameOrigin. Также иногда изображения не отображаются, пожалуйста, помогите. - person Olajide Olaolorun; 27.04.2021
comment
Кто-нибудь может помочь? - person Olajide Olaolorun; 10.06.2021

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 - идентификатор последнего элемента, если вы хотите получить элементы с этого идентификатора.

person Footniko    schedule 11.11.2017
comment
Не могли бы вы сообщить мне, откуда взять query_id и id пользователя? - person Vijaysinh Parmar; 14.11.2017
comment
@VijaysinhParmar, как я уже упоминал, query_id - постоянное значение. Это означает, что это всегда 17888483320059182 (по крайней мере, если Instagram не изменит его). id пользователя - это id пользователя (немного отредактировал свой ответ) - person Footniko; 14.11.2017
comment
Спасибо @Footniko, но не могли бы вы сообщить мне, откуда у вас этот query_id? не могли бы вы поделиться ссылкой, чтобы получить это? - person Vijaysinh Parmar; 15.11.2017
comment
Точно не помню, где-то в Интернете. Но у меня нет никаких отношений с Инстаграмом, поэтому если он изменится, я не смогу сказать вам новый :( - person Footniko; 15.11.2017
comment
Интересно, какова политика ограничения скорости этого подхода? - person kkzxak47; 23.11.2017
comment
Я озадачен этим. Он работает отлично, и создать какой-нибудь HTML-код для отображения эскизов со ссылками на полные изображения из него тривиально. Но нет URL-адресов для обратной ссылки на Instagram, чтобы увидеть полную историю / комментарии, опубликованные с изображением? - person Codemonkey; 09.01.2018
comment
Неважно, я искал URL-адреса, теперь я вижу шорткод, из которого я могу создавать полезные URL-адреса. - person Codemonkey; 09.01.2018
comment
Кто-нибудь понял, как получить URL-адреса с высоким разрешением из этих миниатюр? - person paranoidhominid; 13.01.2018
comment
Если у кого-то есть проблемы с запросом этого URL-адреса через запрос CURL, вам необходимо получить заголовок запроса cookie (откройте вкладку Networks, после запуска url скопируйте заголовок cookie и вставьте его в заголовок запроса curl. Если вы этого не сделаете, вы получите ошибку 403 отказано в доступе). - person Anders; 11.08.2018
comment
Я также проверил, что он выдает ошибку 403 отказано в доступе. Вроде заблокировали. - person OyeHarish; 30.01.2019
comment
Есть идеи, как получить Reels? Это возвращает только Posts. - person Georgios; 09.02.2021

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

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

E.g.

https://www.instagram.com/{username}/?__a=1
person Michael    schedule 30.11.2017
comment
это сработало для меня. Вы хоть представляете, как долго это будет работать ?? Не могли бы вы указать, откуда вы взяли эту ссылку? - person Vijaysinh Parmar; 06.12.2017
comment
это также сработало для меня. но когда is_video = true, в данных нет URL-адреса видео. - person didikee; 30.12.2017
comment
Правильно, вы можете получить только эскизы (а не само видео) - к сожалению, я не нашел для этого официальной документации и понятия не имею, устарел ли этот API или как долго он будет поддерживаться. - person Michael; 11.01.2018
comment
По состоянию на 13 апреля 2018 года это, похоже, больше не работает. Может быть, из-за последнего скандала с данными Facebook, связанного с Cambridge Analytica, они все ужесточают. Есть ли другие предложения по получению базовых данных пользователя без аутентификации? - person BakerStreetSystems; 13.04.2018
comment
Да, было время, когда этот API не работал - но теперь он снова вернулся - person Michael; 15.08.2018
comment
У меня это сработало, но только когда я вхожу в Instagram. - person zundi; 07.09.2018
comment
Работает у меня на данный момент .. 20.08.2019 - person Rishi; 21.08.2019
comment
Все еще работает, но я хотел бы знать, как увеличить количество возвращаемых узлов - person Elesin Olalekan Fuad; 30.09.2019
comment
@Michael Если имя пользователя можно изменить на сайте Instagram. Я думаю, что после внесения изменений вы не сможете получить достоверные данные ... - person Ram; 06.06.2020
comment
Я не уверен, что можно изменить имя пользователя. - person Michael; 10.06.2020

На прошлой неделе 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

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

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

Спасибо @ 350D за то, что это заметил :)

person whizzzkid    schedule 31.03.2017
comment
Работает как шарм .. Спасибо, дружище - person Aniket Dhandhukia; 21.07.2017
comment
он возвращает поддельные данные - person reza jafari; 25.08.2017
comment
Выглядит великолепно - по какой причине вы ожидаете, что IG заблокирует вам предоставление этой услуги в будущем? - person rex; 01.09.2017
comment
@rex, пока они не изменят принцип работы, в конце концов, мы в порядке! Они не беспокоились последние 3 года, вероятно, не будут в следующие 3. - person whizzzkid; 07.09.2017
comment
@whizzzkid Не повезло, меняют. Я видел, что вы думаете, что конечная точка пользователя будет делать то же самое, но есть ограничения на запросы для незарегистрированных пользователей. Любые идеи? - person nobilik; 08.11.2017
comment
@nobilik, обходной путь существует, igpi.ga/whizzzkid/media?count=3 и igpi.ga/graphql/query/?user_id=1606740656&count=3 оба должны возвращать вам данные. Помните, что для этих URL-адресов отключены неопределенные источники перехода. - person whizzzkid; 14.11.2017
comment
Отлично, пользовался старым медиа-вызовом - рад видеть, что я не единственный. Попробовал вашу конечную точку с именем пользователя моего клиента и получил следующее: {code: 5, desc: Referer был запрещен доступ.} Есть идеи? Спасибо! - person James Trickey; 22.11.2017
comment
@JamesTrickey конечные точки prod отклоняют запросы от неопределенных референтов. Попробуйте это: plnkr.co/4oCwpbMm6p9cyJb1UWld - person whizzzkid; 22.11.2017
comment
@whizzzkid Какова политика ограничения скорости для 'graphql / query /'? Вы сталкивались с этим у себя на службе? - person kkzxak47; 23.11.2017
comment
@whizzzkid Спасибо, что вернулись. Я не совсем понимаю, на что смотрю ... - person James Trickey; 23.11.2017
comment
Ваш звонок в igpi.ga/explore/tags/yyc/media дает мне то же самое результат, как я упоминал ранее. Не уверен, что я здесь ошибаюсь. (извиняюсь, я прикладной программист - здесь совершенно не для меня) :-) - person James Trickey; 23.11.2017
comment
Это дает мне пустой массив: igpi.ga/explore/tags/[username provided/media).. Спасибо за твою помощь. - person James Trickey; 23.11.2017
comment
@JamesTrickey, это потому, что вы ошиблись путем. igpi.ga/[usernameght/media и igpi.ga/explore/tags/[hashtagpting/media) - это два разных шаблона. - person whizzzkid; 24.11.2017
comment
@whizzzkid - Все заработало! Большое спасибо - вы ученый и джентльмен! - person James Trickey; 24.11.2017
comment
Я получаю сообщение об ошибке отказа в доступе. Может, это уже не работает? - person khalid13; 18.12.2017
comment
@ khalid13 github.com/ whizzzkid / instagram-proxy-api / wiki / - person whizzzkid; 21.12.2017
comment
Эта конечная точка недоступна - person Georgios; 09.02.2021

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

person Bill Rollins    schedule 29.06.2013
comment
В этом нет смысла, если я хочу отображать свои собственные медиафайлы на моем собственном веб-сайте, зачем мне нужно, чтобы все, кто хочет их увидеть, имели учетную запись в Instagram? - person ninjasense; 18.11.2013
comment
ninjasense - я не думаю, что это так. Я думаю, что на вашем веб-сайте должен быть немного кода, который будет запрашивать API Instagram с вашими учетными данными oauth, предоставленными для извлечения ваших медиа. Затем вы показываете свои медиафайлы всем пользователям вашего сайта. Ваш сайт будет единственным, что нужно для аутентификации в Instagram. - person Bill Rawlinson; 12.12.2013

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

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

person Craig Heneveld    schedule 17.07.2013
comment
Это примерно то, что я сделал в итоге: создал новую учетную запись, сделал для нее токен доступа и сохранил этот токен в конфигурации моего сервера рядом с ключом API. Однако это плохое решение для приложений JS, поскольку оно требует доставки вашего токена доступа пользователю (что я видел во многих примерах кода). К счастью для меня, я могу делать это на стороне сервера. - person Peeja; 18.07.2013
comment
@CraigHeneveld Как вы обновляете шляпу access_token? Разве он не истек? - person Ryan Ore; 10.10.2013
comment
Срок действия токена истекает? - person Monitus; 17.04.2015
comment
Если мне не изменяет память, срок действия ключа истекает только в случае смены пароля. Вот еще одна тема по этому поводу - ›stackoverflow.com/questions/22753170 / - person Craig Heneveld; 20.04.2015
comment
Как мы можем получить несколько пользовательских фотографий ?? Например, можем ли мы передать несколько идентификаторов пользователей, разделенных,? - person Aadil Keshwani; 25.10.2016

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

# 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'
person Benjamin Talisman    schedule 25.07.2016
comment
это решение работает для меня, но у меня с ним проблемы. После загрузки данных мой сервер rails (использующий Rails 5.0.0, сервер Puma 3.6.0) перезапускается необъяснимо ... Любое возможное решение? - person Luis Eduardo Rojas Cabrera; 02.08.2016

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

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

person spice    schedule 03.04.2018
comment
Это мне просто помогло, я просто хочу показать клиенту последние посты в инстаграмм. Спасибо! - person weston deboer; 12.04.2018
comment
instagram.com/username/?__a=1 теперь выдает ошибку: доступ к www .instagram.com был отклонен. У вас нет авторизации для просмотра этой страницы. HTTP ERROR 403 другие идеи? - person Hese; 13.04.2018
comment
Да, Instagram убил это. Чтобы постоянно улучшать конфиденциальность и безопасность пользователей Instagram, мы ускоряем прекращение поддержки платформы Instagram API, немедленно вступая в силу следующие изменения. Мы понимаем, что это может повлиять на ваш бизнес или услуги, и ценим вашу поддержку в обеспечении безопасности нашей платформы. Эти возможности будут немедленно отключены (ранее было установлено, что поддержка прекращена 31 июля 2018 г. или 11 декабря 2018 г.). - person spice; 16.04.2018
comment
Если то, что я читаю, верное, получить изображения или данные из любой некоммерческой учетной записи будет невозможно. Они полностью убивают API платформы. Полагаю, что тогда ... instagram.com/developer/changelog - person spice; 16.04.2018
comment
Похоже, URL-адрес instagram.com/username/?__a=1 работает опять таки... - person BakerStreetSystems; 17.04.2018
comment
URL-адрес instagram.com/username/?__a=1, похоже, временно работал (этого достаточно для большинства моих поставщиков, чтобы обновить его один раз за ночь) и теперь перестал работать. Подумайте, что лучше всего реализовать это правильно и использовать Graph API. - person james_tookey; 17.04.2018
comment
@james_tookey не будет возможным помощником. Из-за их новых ограничений конфиденциальности он больше не сможет запрашивать или извлекать пользователей / данные личных учетных записей, только бизнес-аккаунты. По сути, они просто убили все использование API для личных учетных записей. - person spice; 17.04.2018
comment
2020, работает нормально. curl -I instagram.com/onhate/?__a=1 HTTP / 2 405 но возвращает правильные данные - person Marcelo Luiz Onhate; 01.03.2020
comment
Июль 2020 года по-прежнему работает, но возвращает только 12 последних медиафайлов. Есть ли способ показать все СМИ? - person Cid; 22.07.2020

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

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

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

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

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

person Vulovic Vukasin    schedule 17.01.2017

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;
}
person Leo    schedule 07.02.2018

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

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 - id последнего элемента, если вы хотите получить предметы с этого идентификатора. Здесь можно использовать значение end_cursor из ответа JSON.

person kara4k    schedule 26.01.2018
comment
Как вы это нашли? - person ekntrtmz; 22.05.2019
comment
Могу ли я получить опубликованное имя пользователя, например @xyz, в хэш-теге Instagram api @ kara4k - person Rajesh Smartwebtech; 19.11.2020

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

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

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

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

person Dorian Damon    schedule 11.10.2013
comment
можно ли обойти аутентификацию для инстаграмм - person JAck; 24.08.2016

Если вы хотите искать пользователей без идентификатора клиента и токена доступа:

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

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

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

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

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

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

person Rahul Gusain    schedule 23.12.2019
comment
привет, что? __ a = 1 означает? - person Alex Hunter; 23.08.2020
comment
@AlexHunter, это запрос для поиска точно такого же имени пользователя, как вы хотите. он будет соответствовать точно так же. - person Rahul Gusain; 26.08.2020
comment
Как получать сообщения со следующей страницы в instagram.com/UserName/?__a=1 есть идеи? Параметр max_id не имеет значения. - person Ghayoor ul Haq; 23.07.2021

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

person altinturk    schedule 16.04.2018

Эта функция мне очень нужна, но для 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>
person Karra Max    schedule 08.07.2019
comment
Есть идеи о разбиении на страницы? - person Prashant Rajpoot; 29.12.2020

Приведенный ниже код 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});
person Vishnu Kanwar    schedule 17.06.2017
comment
Я могу видеть только первые 12 сообщений, как я могу получить их все? - person rahul gawale; 26.12.2018

Это работает с использованием простого вызова 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>"
                );
            });
        })
person Evin Weissenberg    schedule 19.12.2017
comment
У меня это сработало, но только когда я вхожу в Instagram. - person zundi; 07.09.2018

Вот php-скрипт, который загружает изображения и создает HTML-файл со ссылками на изображения. Кредит 350D для версии php, это просто доработано .. Я бы посоветовал поставить это задание cron и запускать, как часто вам нужно. Проверено, работает по состоянию на май 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);
?>
person drooh    schedule 27.05.2019

person    schedule
comment
Могу ли я получить данные по идентификатору пользователя (pk) - person SAURABH RATHOD; 08.12.2018
comment
Извините, @SAURABHRATHOD Я пробовал, но не нашел способа сделать это. Буду очень рад, если кто-нибудь это решит. Спасибо за комментарий. - person Ruan Barroso; 01.06.2019
comment
Ссылка на эти ответы, похоже, перенаправляет на вредоносное ПО ... - person Random; 11.02.2021