Como posso obter a mídia de um usuário do Instagram sem autenticar como usuário?

175

Estou tentando colocar a mídia recente do Instagram de um usuário em uma barra lateral. Estou tentando usar a API do Instagram para buscar a mídia.

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

A documentação diz para GET https://api.instagram.com/v1/users/<user-id>/media/recent/, mas diz para passar um token de acesso OAuth. Um token de acesso representa a autorização para agir em nome de um usuário. Eu não quero que os usuários façam login no Instagram para ver isso na barra lateral. Eles nem precisam ter uma conta no Instagram.

Por exemplo, eu posso ir para http://instagram.com/thebrainscoop sem estar conectado ao Instagram e ver fotos. Eu quero fazer isso através da API.

Na API do Instagram, solicitações não autenticadas pelo usuário passam um em client_idvez de um access_token. Se eu tentar isso, porém, recebo:

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

Então, isso não é possível? Não há como buscar a mídia (pública) mais recente de um usuário sem solicitar que ele faça login em uma conta do Instagram através do OAuth primeiro?

Peeja
fonte
É possível com este plug-in, basta verificar o código-fonte de como eles buscaram a mídia pública mais recente de um usuário sem pedir a um usuário que faça login em sua conta do instagram. : D smashballoon.com/instagram-feed/demo Você só precisa de um ID de cliente, não é necessário nenhum token de acesso. : D
jehzlau 24/10
Você precisa se autenticar para que eles possam rastreá-lo e limitar seus downloads (taxas ...) como todas as grandes APIs. Existe público para usuários reais e público para scrappers / bots, o que geralmente não é o mesmo que usuários reais veem anúncios e usam diretamente o serviço.
Christophe Roussy
1
Nenhum desses métodos funciona mais. Veja stackoverflow.com/questions/49852080/…
Moradnejad

Respostas:

123

É tarde, mas vale a pena se ajudar alguém, pois eu não o vi na documentação do Instagram.

Para executar o GET on https://api.instagram.com/v1/users/<user-id>/media/recent/(no momento da gravação), você realmente não precisa do token de acesso OAuth.

Você pode executar https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]

[ID DO CLIENTE] seria um ID de cliente válido registrado no aplicativo por meio de clientes de gerenciamento (não relacionados ao usuário). Você pode obter [USER ID] do nome de usuário executando a solicitação de pesquisa de usuários GET: https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]

Ersan J Sano
fonte
9
Eu acho que eles podem ter mudado de idéia novamente. Estou recebendo a mesma resposta de erro, como mostrado no OP
James
35
Isso é válido apenas em aplicativos criados antes de 17 de novembro de 2015 e não será suportado após junho de 2016. Depois disso, você precisará de um access_token oauth. instagram.com/developer/changelog
Dax Fohl
211
Isso é tão estúpido e irritante. Por que eles forçariam um token de acesso apenas para exibir imagens que são públicas ? Não estou tentando enxaguá-los para todos os usuários do mundo, só quero exibir o último insta de um cliente sem precisar passar horas mexendo nele. Gah!
Matt Fletcher
8
@ Limites de taxa de cabo, companheiro.
Walf
20
O @MattFletcher é ainda mais estúpido agora, é preciso passar pela revisão de permissão do aplicativo e não ter certeza se é viável, pois esse caso de uso "mostrando o próprio feed do cliente em sua própria página" não é um dos casos de uso. Duh, essas restrições são péssimas.
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>

Você pode fazer o download de qualquer feed de fotos do usuário do Instagram no formato JSON usando o ?__a=1endereço da página de destino como este . Não há necessidade de obter o ID do usuário ou registrar um aplicativo, sem tokens, sem oAuth.

min_ide max_idvariáveis ​​podem ser usadas para paginação, aqui está um exemplo

YQL pode não funcionar aqui dentro do iframe cortado, então você sempre pode verificá-lo manualmente em YQL Console

ATUALIZAÇÃO DE ABRIL DE 2018: Após as atualizações mais recentes do instagram, você não pode fazer isso no lado do cliente (javascript), porque os cabeçalhos personalizados da solicitação assinada não podem ser definidos com javascript devido a CORS Access-Control-Allow-Headersrestrições. É ainda possível fazer isso via phpou qualquer outro método do lado do servidor com a assinatura apropriada com base em rhx_gis, csrf_tokene parâmetros de solicitação. Você pode ler mais sobre isso aqui .

ATUALIZAÇÃO DE JANEIRO DE 2019: YQL desativado, portanto, verifique minha atualização mais recente com o Google Image Proxy como CORSproxy para a página do Instagram! Somente momento negativo - paginação não disponível com este método.

PHP solução:

    $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
fonte
14
@ 350D Como você encontrou isso? Não encontro em nenhum lugar na documentação deles. Eu só quero ler mais sobre o que é possível com esse ponto de extremidade (imagens quadradas do EG vs não quadradas, se isso tem planos para terminar em junho, etc.) - Obrigado!
Phil Johnston
8
@ John Johnston Apenas uma pesquisa 😀 Faça outra - você pode adicionar / media /? Size = L ao lado do URL da página de destino da foto e obter uma foto com resolução COMPLETA.
350D 07/01
9
@ user2659694 eu finalmente encontrei a solução para obter as páginas seguintes com este método que você pode usar / media / max_id = [MAX_ID]?
Reza
3
Para sua informação, isso parece funcionar apenas se você estiver conectado a uma conta do Instagram. Tente fazer isso no modo de navegação anônima no Chrome ou similar e você verá que a resposta JSON não contém itens. Eu estava tentando incorporar isso em um script para obter a lista de URLs em um servidor Web e tive que voltar aos métodos de autorização antigos.
Ryan Zink
9
@RyanZink você estava tentando uma conta privada? funciona ok para mim desconectado ou anônimo em contas públicas.
ryan
41

11.11.2017
Como o Instagram mudou a maneira como eles fornecem esses dados, nenhum dos métodos acima funciona atualmente. Aqui está a nova maneira de obter a mídia do usuário:
GET https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
Onde:
query_id- valor permanente: 17888483320059182 (observe que pode ser alterada no futuro).
id- ID do usuário. Pode vir com uma lista de usuários. Para obter a lista de usuários, você pode usar a seguinte solicitação: GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first- quantidade de itens a serem obtidos.
after- ID do último item, se você deseja obter itens desse ID.

Footniko
fonte
Você poderia me informar de onde obter query_id e o ID do usuário?
Vijaysinh Parmar
2
@VijaysinhParmar como mencionei, query_idé um valor permanente. Isso significa que é sempre 17888483320059182 (pelo menos, a menos que o Instagram mude). ID do usuário - é ID de usuário (editado minha resposta um pouco)
Footniko
1
Não me lembro exatamente, em algum lugar da internet. Mas eu não tenho nenhuma relação com o Instagram, então, caso isso mude, não poderei dizer o novo :(
Footniko 15/11
1
Gostaria de saber qual é a política de limitação de taxa dessa abordagem?
kkzxak47
1
Se alguém tiver problemas para solicitar esse URL por meio de uma solicitação CURL, será necessário obter o cabeçalho da solicitação de cookie (abra a guia Redes, depois de executar a URL, copie o cabeçalho do cookie e cole-o no cabeçalho da solicitação de ondulação. Se você não fizer isso, você receberá um erro 403 de acesso negado).
Anders
39

Consegui obter a mídia mais recente de um usuário usando a seguinte API sem autenticação (incluindo a descrição, curtidas, contagem de comentários).

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

Por exemplo

https://www.instagram.com/{username}/?__a=1
Michael
fonte
1
isso também funcionou para mim. mas quando "is_video = true", nenhum URL de vídeo nos dados.
didikee
4
Certo, você só pode obter as miniaturas (não o vídeo em si) - infelizmente, não encontrei nenhuma documentação oficial para isso e não tenho idéia se essa API está obsoleta ou por quanto tempo ela será suportada.
Michael
8
A partir de 13/04/2018, isso parece não funcionar mais. Talvez por causa do mais recente escândalo de dados da Cambridge Analytica no Facebook, eles estejam diminuindo muito as coisas. Alguma outra sugestão para obter dados básicos do usuário sem autenticação?
BakerStreetSystems
2
Sim, houve um tempo em que esta API não estava funcionando - Mas agora ele está de volta novamente
Michael
4
Funcionou para mim, mas apenas quando estou logado no Instagram.
zundi 7/09/18
16

Na semana passada, o Instagram desativou os /media/URLs, implementei uma solução alternativa, que funciona muito bem por enquanto.

Para resolver os problemas de todos neste segmento, escrevi o seguinte: https://github.com/whizzzkid/instagram-reverse-proxy

Ele fornece todos os dados públicos do instagram usando os seguintes pontos de extremidade:

Obter mídia do usuário:

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

Obter mídia do usuário com contagem limite:

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

Use JSONP:

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

A API do proxy também anexa os URLs da página seguinte e da página anterior à resposta, para que você não precise calcular isso ao final.

Espero que vocês gostem!

Obrigado a @ 350D por detectar isso :)

whizzzkid
fonte
1
@rex até que eles mudem como as coisas funcionam, estamos bem! Eles não se preocupou nos últimos 3 anos, provavelmente eles não vão na próxima 3.
whizzzkid
3
@whizzzkid Má sorte, eles mudam. Vi que você acha que o ponto de extremidade do usuário fará as coisas, mas existem limites para solicitações de usuários não conectados. Alguma ideia?
Nobilik
1
@nobilik, a solução alternativa está em vigor, igpi.ga/whizzzkid/media?count=3 e igpi.ga/graphql/query/?user_id=1606740656&count=3 devem retornar seus dados. Lembre-se de que referenciadores indefinidos estão desativados para esses URLs.
whizzzkid
1
@whizzzkid - Está funcionando! Muito obrigado - você é um estudioso e um cavalheiro!
precisa
1
Estou recebendo um erro "acesso negado ao referenciador". Talvez isso não funcione mais?
khalid13
14

A API do Instagram requer autenticação do usuário por meio do OAuth para acessar o terminal de mídia recente de um usuário. No momento, não parece haver outra maneira de obter todas as mídias para um usuário.

Bill Rollins
fonte
4
Isso não faz sentido, se eu quero exibir minha própria mídia no meu próprio site, por que preciso que todos que desejam vê-la tenham uma conta no instagram?
Ninjasense
5
ninjasense - Eu não acho que é assim que funciona. Acho que seu site precisaria ter um pouco de código para consultar a API do Instagram com suas credenciais oauth fornecidas para atrair sua mídia. Você mostraria sua mídia a qualquer usuário do seu site. Seu site seria a única coisa necessária para autenticar no Instagram.
Bill Rawlinson
9

Se você estiver procurando uma maneira de gerar um token de acesso para uso em uma única conta, tente isso -> https://coderwall.com/p/cfgneq .

Eu precisava de uma maneira de usar a API do Instagram para pegar todas as mídias mais recentes de uma conta específica.

Craig Heneveld
fonte
5
Isso é mais ou menos o que eu fiz no final: criei uma nova conta, criei um token de acesso e guardei esse token na configuração do meu servidor ao lado da chave da API. Essa é uma solução ruim para aplicativos JS, no entanto, uma vez que requer o envio de seu token de acesso ao usuário (o que vi muitos exemplos de código). Felizmente para mim, posso fazê-lo no lado do servidor.
Peeja
4
@CraigHeneveld Como você mantém atualizado o hat access_token? Não expirou em você?
Ryan Ore
O token expira algum tempo?
Monitus
Se minha memória me servir, a chave só expirará se você alterar sua senha. Aqui está outra discussão sobre o assunto -> stackoverflow.com/questions/22753170/…
Craig Heneveld 20/15/15
Como podemos obter várias fotos de usuário? Como podemos passar vários IDs de usuário separados por ","?
Aadil Keshwani 25/10
9

Aqui está uma solução de trilhos. É uma espécie de porta dos fundos, que na verdade é a porta da frente.

# 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

O objeto que você recebe varia dependendo de se tratar de uma pesquisa por usuário ou por tag. Eu recebo os dados assim:

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

Em seguida, recebo outra página de resultados construindo um URL da seguinte maneira:

  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'
Benjamin Talisman
fonte
esta solução está funcionando para mim, mas estou tendo alguns problemas com ela. Após carregar os dados, meu servidor Rails (usando o servidor Rails 5.0.0, Puma 3.6.0) é reiniciado inexplicavelmente ... Alguma solução possível?
Luis Eduardo Rojas Cabrera
8

Graças ao esquema de API em constante mudança (e de design horrível) do Instagram, a maioria dos itens acima não funcionará mais a partir de abril de 2018.

Aqui está o caminho mais recente para acessar dados de postagem individuais, se você estiver consultando a API diretamente usando o método https://www.instagram.com/username/?__a=1 método

Supondo que seus JSONdados retornados sejam $datapossíveis, você pode percorrer cada resultado usando os seguintes exemplos de caminho:

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 ....
}

As principais coisas nessa mudança recente foram graphqle edge_owner_to_timeline_media.

Parece que eles vão matar esse acesso à API para clientes não 'comerciais' em DEZ 2018, para aproveitar ao máximo enquanto você pode.

Espero que ajude alguém;)

especiaria
fonte
Isso só me ajudou, eu só quero mostrar as últimas postagens do instagram para um cliente. Obrigado!
Weston DeBoer
1
instagram.com/username/?__a=1 agora gera um erro: o acesso a www.instagram.com foi negado Você não tem autorização para visualizar esta página. HTTP ERRO 403 alguma outra idéia?
Hese
1
Sim, o Instagram acabou com isso. "Para melhorar continuamente a privacidade e a segurança dos usuários do Instagram, estamos acelerando a descontinuação da plataforma API do Instagram, efetivando as seguintes alterações imediatamente. Entendemos que isso pode afetar seus negócios ou serviços e agradecemos seu apoio para manter nossa plataforma segura. Esses recursos serão desativados imediatamente (previamente definidos para 31 de julho de 2018 ou 11 de dezembro de 2018) "
spice
Se o que estou lendo estiver correto, não será mais possível recuperar imagens ou dados de qualquer conta "não comercial". Eles estão matando totalmente a API da plataforma. Eu acho que é isso então ... instagram.com/developer/changelog
spice
1
@james_tookey não será possível companheiro. Devido às novas restrições de privacidade, não será mais possível consultar ou recuperar usuários / dados de contas pessoais, apenas comerciais. Basicamente, eles acabaram com todo o uso da API para contas pessoais.
Especiaria
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;
}
Leo
fonte
5

Só quero adicionar uma resposta à @ 350D, pois era difícil para mim entender.

Minha lógica no código é a seguinte:

Ao chamar a API pela primeira vez, estou ligando apenas https://www.instagram.com/_vull_ /media/. Quando recebo resposta, verifico o valor booleano de more_available. Se for verdade, recebo a última foto da matriz, identifico e chamo Instagram API novamente, mas desta vez https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433 .

É importante saber aqui, esse ID é o ID da última imagem na matriz. Portanto, ao solicitar maxId com o último ID da imagem na matriz, você terá as próximas 20 fotos e assim por diante.

Espero que isso esclareça as coisas.

Vulovic Vukasin
fonte
4

Se você ignorar Oauth, provavelmente não saberá qual usuário do instagram é. Dito isto, existem algumas maneiras de obter imagens do instagram sem autenticação.

  1. A API do Instagram permite visualizar as imagens mais populares de um usuário sem autenticação. Usando o seguinte terminal: Aqui está o link

  2. Instagram fornece feeds RSS para as tags no presente .

  3. As páginas de usuário do Instagram são públicas, então você pode usar o PHP com CURL para obter a página e um analisador DOM para pesquisar no html as tags de imagem que deseja.

Dorian Damon
fonte
9
Parece desatualizado.
Burak Tokak
é possível ignorar a autenticação para instagram
JAck
3

Mais um truque, pesquise fotos por hashtags:

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

Onde:

query_hash - valor permanente (acredito que seu hash de 17888483320059182 pode ser alterado no futuro)

tag_name - o titulo fala por si

first - quantidade de itens a serem obtidos (não sei por que, mas esse valor não funciona conforme o esperado. O número real de fotos retornadas é um pouco maior que o valor multiplicado por 4,5 (cerca de 110 para o valor 25 e cerca de 460 para o valor 100))

after- ID do último item, se você deseja obter itens desse ID. O valor da end_cursorresposta JSON pode ser usado aqui.

kara4k
fonte
Como você encontra isso?
Ekntrtmz # 21/19
2

Você pode usar este API para recuperar informações públicas do usuário instagram:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2

Se você não definir o parâmetro de limite, as mensagens são limitadas a 12 por padrão

Este A API foi criada no SpringBoot com HtmlUnit, como você pode ver no código:

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


É um exemplo de resposta:

{
  "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
        }
      ]
    }
  ]
}
Ruan Barroso
fonte
i pode obter dados pelo ID de usuário (pk)
Saurabh Rathod
Desculpe @SAURABHRATHOD Tentei, mas não encontrei uma maneira de fazer isso. Eu ficaria muito satisfeito se alguém resolver isso. Obrigado pelo comentário.
Ruan Barroso
2

Eu realmente precisava dessa função, mas para o Wordpress. Eu me encaixo e funcionou perfeitamente

<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>
Karra Max
fonte
1

O código nodejs abaixo raspa imagens populares de uma página do Instagram. A função 'ScrapeInstagramPage' cuida do efeito pós-envelhecimento.

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

Tente aqui

Exemplo: para determinado URL ' https://www.instagram.com/dress_blouse_designer/ ', pode-se chamar função

ScrapeInstagramPage ({username : "dress_blouse_designer", debug : false});
Vishnu Kanwar
fonte
Consigo ver apenas as 12 primeiras postagens, como posso obtê-las?
Rahul gawale
0

Isso funciona usando uma chamada ajax simples e caminhos de imagem iterativos.

        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>"
                );
            });
        })
Evin Weissenberg
fonte
Funcionou para mim, mas apenas quando estou logado no Instagram.
zundi 7/09/18
-1

Aqui está um script php que baixa as imagens e cria um arquivo html com links nas imagens. Crédito 350D para a versão php, isso é apenas elaborado .. Eu sugeriria que este seja um trabalho cron e disparasse quantas vezes você precisar. Confirmado a trabalhar em maio de 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
fonte