Come posso ottenere i media di un utente da Instagram senza autenticarsi come utente?


175

Sto cercando di mettere i media recenti di Instagram di un utente su una barra laterale. Sto cercando di utilizzare l'API di Instagram per recuperare i media.

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

La documentazione dice a GET https://api.instagram.com/v1/users/<user-id>/media/recent/, ma dice di passare un token di accesso OAuth. Un token di accesso rappresenta l'autorizzazione ad agire per conto di un utente. Non voglio che gli utenti accedano a Instagram per vederlo sulla barra laterale. Non dovrebbero nemmeno aver bisogno di avere un account Instagram.

Ad esempio, posso andare su http://instagram.com/thebrainscoop senza essere connesso a Instagram e vedere le foto. Voglio farlo attraverso l'API.

Nell'API di Instagram, le richieste non autenticate dall'utente passano a client_idanziché a access_token. Se lo provo, però, ottengo:

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

Quindi, questo non è possibile? Non c'è modo di recuperare i media (pubblici) più recenti di un utente senza chiedere prima a un utente di accedere a un account Instagram tramite OAuth?


È possibile con questo plugin, basta controllare il codice sorgente di come hanno recuperato gli ultimi media pubblici di un utente senza chiedere a un utente di accedere al proprio account Instagram. : D smashballoon.com/instagram-feed/demo Hai solo bisogno di un ID client, nessun token di accesso necessario. : D
jehzlau,

Devi autenticarti in modo che possano seguirti e limitare i tuoi download (tariffe ...) come ogni grande API. C'è pubblico per utenti reali e pubblico per scrappers / bot, che di solito non è lo stesso che gli utenti reali vedranno annunci e utilizzeranno direttamente il servizio.
Christophe Roussy,

1
Nessuno di questi metodi funziona più. Vedere stackoverflow.com/questions/49852080/...
Moradnejad

Risposte:


123

Questo è in ritardo, ma vale la pena se aiuta qualcuno perché non l'ho visto nella documentazione di Instagram.

Per eseguire GET su https://api.instagram.com/v1/users/<user-id>/media/recent/(al momento attuale della scrittura) in realtà non è necessario il token di accesso OAuth.

Puoi esibirti https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]

[ID CLIENT] sarebbe un ID client valido registrato nell'app tramite la gestione dei client (non correlato all'utente in alcun modo). È possibile ottenere [ID UTENTE] dal nome utente eseguendo la richiesta di ricerca degli utenti GET: https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]


9
Penso che potrebbero aver cambiato idea di nuovo. Ricevo la stessa risposta di errore mostrata nell'OP
James

35
Questo è valido solo per le app create prima del 17 novembre 2015 e non sarà supportato affatto dopo giugno 2016. Successivamente avrai bisogno di un access_token oauth. instagram.com/developer/changelog
Dax Fohl,

211
È così stupido e irritante. Perché dovrebbero forzare un token di accesso solo per visualizzare immagini che sono già pubbliche ? Sto quasi cercando di sciacquarli per ogni utente del mondo, voglio solo mostrare l'ultima insta di un client senza dover passare ore a scherzare con esso. Gah!
Matt Fletcher,

8
@Cabus limiti di velocità, amico.
Walf,

20
@MattFletcher è ancora più stupido ora, si deve passare attraverso la revisione dei permessi delle app, e non sono sicuro che sia fattibile dal momento che questo caso d'uso "che mostra il feed del client nella propria pagina web" non è uno dei casi d'uso. Duh, queste restrizioni fanno schifo.
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>

Puoi scaricare qualsiasi feed di foto degli utenti Instagram in formato JSON utilizzando ?__a=1accanto all'indirizzo della pagina di destinazione in questo modo . Non è necessario ottenere l'ID utente o registrare un'app, nessun token, nessun oAuth.

min_ide le max_idvariabili possono essere utilizzate per l'impaginazione, ecco un esempio

YQLpotrebbe non funzionare qui all'interno di iframe frammentato, quindi puoi sempre controllarlo manualmente nella console YQL

AGGIORNAMENTO APRILE 2018: dopo gli ultimi aggiornamenti di Instagram non è possibile farlo sul lato client (javascript) perché le intestazioni personalizzate per la richiesta firmata non possono essere impostate con JavaScript a causa di CORS Access-Control-Allow-Headersrestrizioni. E 'ancora possibile farlo tramite phpo qualsiasi altro metodo lato server con la firma corretta sulla base rhx_gis, csrf_tokene parametri di richiesta. Puoi leggere di più qui .

AGGIORNAMENTO GENNAIO 2019: YQL si è ritirato, quindi controlla il mio ultimo aggiornamento con Google Image Proxy come CORSproxy per la pagina Instagram! Quindi solo momento negativo - l'impaginazione non è disponibile con questo metodo.

PHP soluzione:

    $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;

14
@ 350D Come l'hai trovato? Non riesco a trovarlo da nessuna parte nella loro documentazione. Voglio solo leggere di più su ciò che è possibile con questo endpoint (immagini quadrate EG vs non quadrate, se questo ha intenzione di terminare a giugno, ecc.) - Grazie!
Phil Johnston,

8
@Phil Johnston Solo una ricerca 😀 Prendine un'altra: puoi aggiungere / media /? Size = L accanto all'URL della pagina di destinazione della foto e ottenere una foto a risoluzione COMPLETA.
350 D

9
@ user2659694 Ho finalmente trovato la soluzione per ottenere le pagine successive con questo metodo che puoi usare / media /? max_id = [MAX_ID]
Reza il

3
Cordiali saluti, questo sembra funzionare solo se si è effettuato l'accesso a un account Instagram da soli. Prova a farlo in incognito in Chrome o simili e vedrai che la risposta JSON non contiene elementi. Stavo cercando di incorporare questo in uno script per ottenere l'elenco di URL su un server Web e ho dovuto tornare ai vecchi metodi di autorizzazione.
Ryan Zink

9
@RyanZink stavi provando un account privato? funziona bene per me disconnesso o in incognito su account pubblici.
Ryan,

41

11.11.2017
Da quando Instagram ha cambiato il modo in cui forniscono questi dati, nessuno dei metodi sopra funziona al giorno d'oggi. Ecco il nuovo modo per ottenere supporto dell'utente:
GET https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
Dove:
query_id- valore permanente: 17888483320059182 (nota che potrebbe essere modificato in futuro).
id- ID dell'utente. Potrebbe venire con un elenco di utenti. Per ottenere l'elenco degli utenti è possibile utilizzare la seguente richiesta: GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first- quantità di elementi da ottenere.
after- ID dell'ultimo elemento se desideri ottenere articoli da quell'ID.


Potresti farmi sapere da dove ottenere query_id e ID utente?
Vijaysinh Parmar,

2
@VijaysinhParmar, come ho già detto, query_idè un valore permanente. Ciò significa che è sempre 17888483320059182 (almeno a meno che Instagram non lo cambi). id dell'utente - è l'id dell'utente (ha modificato un po 'la mia risposta)
Footniko

1
Non ricordo esattamente, da qualche parte su Internet. Ma non ho alcun rapporto con Instagram, quindi nel caso in cui cambi non potrò dirti quello nuovo :(
Footniko

1
Mi chiedo qual è la politica di limitazione dei tassi di questo approccio?
kkzxak47,

1
Se qualcuno ha problemi con la richiesta di questo URL tramite una richiesta CURL, è necessario ottenere l'intestazione della richiesta di cookie (aprire la scheda Reti, dopo aver eseguito l'URL, copiare l'intestazione del cookie e incollarla nell'intestazione della richiesta di arricciatura. In caso contrario, verrà visualizzato un errore di accesso negato 403).
Anders,

40

Sono stato in grado di ottenere i media più recenti di un utente utilizzando la seguente API senza autenticazione (inclusa la descrizione, i Mi piace, il conteggio dei commenti).

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

Per esempio

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

1
questo ha funzionato anche per me. ma quando "is_video = true", nessun URL del video nei dati.
didikee

4
Bene, puoi solo ottenere le miniature (non il video stesso) - sfortunatamente, non ho trovato alcuna documentazione ufficiale per questo e non ho idea se questa API è obsoleta o per quanto tempo sarà supportata.
Michael

8
A partire dal 13-04-2018, questo sembra non funzionare più. Forse a causa dell'ultimo scandalo dei dati di Cambridge Analytica su Facebook, stanno restringendo di molto le cose. Altri suggerimenti per ottenere dati utente di base senza autenticazione?
BakerStreetSystems

2
Sì, c'è stato un tempo in cui questa API non funzionava - Ma ora è tornata di nuovo
Michael,

4
Ha funzionato per me, ma solo quando ho effettuato l'accesso a Instagram.
zundi,

16

A partire dalla scorsa settimana, Instagram ha disabilitato gli /media/URL, ho implementato una soluzione alternativa, che per ora funziona abbastanza bene.

Per risolvere i problemi di tutti in questo thread, ho scritto questo: https://github.com/whizzzkid/instagram-reverse-proxy

Fornisce tutti i dati pubblici di Instagram utilizzando i seguenti endpoint:

Ottieni media utente:

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

Ottieni media utente con numero limite:

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

Usa JSONP:

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

L'API proxy aggiunge anche gli URL della pagina successiva e della pagina precedente alla risposta, quindi non è necessario calcolarla alla fine.

Ragazzi, spero che vi piaccia!

Grazie a @ 350D per aver individuato questo :)


1
@rex finché non cambiano il modo in cui le cose funzionano alla fine, siamo bravi! Non si sono preoccupati negli ultimi 3 anni, probabilmente non lo faranno nei prossimi 3.
Whizzzkid,

3
@whizzzkid Sfortuna, lo cambiano. Ho visto che pensi che l'endpoint utente farà le cose, ma ci sono limiti per le richieste per gli utenti non registrati. Qualche idea?
nobilik,

1
@nobilik la soluzione è a posto, igpi.ga/whizzzkid/media?count=3 e igpi.ga/graphql/query/?user_id=1606740656&count=3 dovrebbero entrambi restituire i tuoi dati. Ricorda, i referrer indefiniti sono disabilitati per questi URL.
Whizzzkid,

1
@whizzzkid - Ha funzionato! Grazie mille - sei uno studioso e un gentiluomo!
James Trickey,

1
Ricevo un errore "accesso negato al referrer". Forse questo non funziona più?
khalid13,

14

L'API di Instagram richiede l'autenticazione utente tramite OAuth per accedere all'endpoint multimediale recente per un utente. Non sembra esserci nessun altro modo in questo momento per ottenere tutti i media per un utente.


4
Questo non ha senso, se voglio visualizzare i miei media sul mio sito Web, perché ho bisogno di tutti coloro che vogliono vederlo per avere un account Instagram?
ninjasense,

5
ninjasense - Non penso che funzioni così. Penso che il tuo sito web dovrebbe avere un po 'di codice in esso che interrogherebbe l'API di Instagram con le tue credenziali oauth fornite per estrarre i tuoi media. Mostreresti quindi i tuoi file multimediali a tutti gli utenti del tuo sito. Il tuo sito sarebbe l'unica cosa che doveva essere autenticata con Instagram.
Bill Rawlinson,

9

Se stai cercando un modo per generare un token di accesso da utilizzare su un singolo account, puoi provare questo -> https://coderwall.com/p/cfgneq .

Avevo bisogno di un modo per usare l'api instagram per afferrare tutti i media più recenti per un determinato account.


5
Questo è più o meno quello che ho fatto alla fine: ho creato un nuovo account, creato un token di accesso e memorizzato quel token nella mia configurazione del server accanto alla chiave API. Questa è una soluzione scadente per le app JS, poiché richiede la spedizione del token di accesso all'utente (cosa che ho visto fare un sacco di codice di esempio). Fortunatamente per me, posso farlo sul lato server.
Peeja,

4
@CraigHeneveld Come si aggiorna il cappello access_token aggiornato? Non è scaduto con te?
Ryan Ore,

Il token scade qualche tempo?
Monitus,

Se la mia memoria mi serve, la chiave scade solo se si cambia la password. Ecco un altro thread in materia -> stackoverflow.com/questions/22753170/...
Craig Heneveld

Come possiamo ottenere più foto dell'utente ?? Come possiamo trasmettere più ID utente separati da ","?
Aadil Keshwani,

9

Ecco una soluzione per rotaie. È una specie di porta sul retro, che in realtà è la porta d'ingresso.

# 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

L'oggetto che ottieni varia a seconda che si tratti di una ricerca utente o di una ricerca tag. Ottengo i dati in questo modo:

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

Quindi ottengo un'altra pagina di risultati costruendo un URL nel modo seguente:

  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'

questa soluzione funziona per me, ma ho dei problemi. Dopo aver caricato i dati, il mio server rails (usando Rails 5.0.0, server Puma 3.6.0) si riavvia inspiegabilmente ... Qualche soluzione possibile?
Luis Eduardo Rojas Cabrera,

8

Grazie allo schema API in continua evoluzione (e progettato in modo orribile) la maggior parte di quanto sopra non funzionerà più da aprile 2018.

Ecco il percorso più recente per accedere ai dati dei singoli post se si esegue una query delle loro API direttamente utilizzando il https://www.instagram.com/username/?__a=1metodo.

Supponendo che i JSONdati restituiti siano in $datagrado di scorrere ogni risultato usando i seguenti esempi di percorso:

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

Le cose principali in questo recente cambiamento sono state graphqle edge_owner_to_timeline_media.

Sembra che stiano per uccidere questo accesso API per i clienti non "business" nel dicembre 2018, quindi sfruttalo al massimo delle tue possibilità.

Spero che aiuti qualcuno;)


Questo mi ha solo aiutato, voglio solo mostrare gli ultimi post di Instagram per un cliente. Grazie!
Weston Deboer,

1
instagram.com/username/?__a=1 restituisce ora errore: accesso a www.instagram.com negato Non hai l'autorizzazione per visualizzare questa pagina. HTTP ERROR 403 altre idee?
Hese

1
Yep Instagram ora lo ha ucciso. "Per migliorare continuamente la privacy e la sicurezza degli utenti di Instagram, stiamo accelerando il deprezzamento della piattaforma API di Instagram, rendendo immediatamente effettive le seguenti modifiche. Comprendiamo che ciò può influire sulla tua attività o sui tuoi servizi e apprezziamo il tuo supporto per proteggere la nostra piattaforma. Queste funzionalità saranno disabilitate immediatamente (precedentemente impostate per il deprezzamento del 31 luglio 2018 o dell'11 dicembre 2018). "
spice

Se ciò che sto leggendo è corretto, non sarà più possibile recuperare immagini o dati da qualsiasi account "non commerciale". Stanno uccidendo totalmente l'API della piattaforma. Immagino che sia allora ... instagram.com/developer/changelog
spice

1
@james_tookey non sarà possibile amico. A causa delle loro nuove restrizioni sulla privacy, non sarà più possibile interrogare o recuperare utenti / dati di account personali, ma solo quelli aziendali. Fondamentalmente hanno appena ucciso tutto l'utilizzo dell'API per gli account personali.
spezie

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

Voglio solo aggiungere alla risposta @ 350D, poiché è stato difficile per me capire.

La mia logica nel codice è la prossima:

Quando chiamo l'API per la prima volta, chiamo solo https://www.instagram.com/_vull_ /media/. Quando ricevo risposta, controllo il valore booleano di more_available. Se è vero, ottengo l'ultima foto dall'array, ottengo il suo ID e quindi chiamo di nuovo l'API di Instagram ma questa volta https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433.

Cosa importante da sapere qui, questo ID è l'id dell'ultima immagine dell'array. Quindi, quando si richiede maxId con l'ultimo ID dell'immagine nell'array, si otterranno le prossime 20 immagini e così via.

Spero che questo chiarisca le cose.


4

Se bypassa Oauth probabilmente non sapresti quale utente instagram sono. Detto questo, ci sono alcuni modi per ottenere immagini instagram senza autenticazione.

  1. L'API di Instagram ti consente di visualizzare le immagini più popolari di un utente senza eseguire l'autenticazione. Utilizzando il seguente endpoint: ecco il link

  2. Instagram fornisce feed rss per i tag a questo .

  3. Le pagine utente di Instagram sono pubbliche, quindi puoi usare PHP con CURL per ottenere la loro pagina e un parser DOM per cercare i tag immagine che desideri nell'html.


9
Sembra obsoleto.
Burak Tokak,

è possibile bypassare l'autenticazione per instagram
JAck

3

Un altro trucco, cerca le foto per hashtag:

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

Dove:

query_hash - valore permanente (credo che il suo hash di 17888483320059182, possa essere modificato in futuro)

tag_name - il titolo parla da solo

first - quantità di elementi da ottenere (non so perché, ma questo valore non funziona come previsto. Il numero effettivo di foto restituite è leggermente maggiore del valore moltiplicato per 4,5 (circa 110 per il valore 25 e circa 460 per il valore 100))

after- ID dell'ultimo elemento se desideri ottenere articoli da quell'ID. end_cursorQui è possibile utilizzare il valore della risposta JSON.


Come lo trovi?
ekntrtmz,



2

Puoi utilizzare questa API per recuperare informazioni pubbliche dell'utente instagram:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2

Se non imposti il ​​parametro limit, i post sono limitati a 12 per impostazione predefinita

Questo api è stato realizzato in SpringBoot con HtmlUnit come puoi vedere nel codice:

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


È un esempio di risposta:

{
  "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
        }
      ]
    }
  ]
}

posso ottenere i dati da userid (pk)
SAURABH RATHOD

Scusa @SAURABHRATHOD Ho provato ma non ho trovato il modo di farlo. Sarei molto contento se qualcuno lo risolvesse. Grazie per il commento.
Ruan Barroso,

2

Avevo davvero bisogno di questa funzione ma per Wordpress. Mi sono adattato e ha funzionato perfettamente

<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

Il seguente codice nodejs raschia le immagini popolari da una pagina Instagram. La funzione 'ScrapeInstagramPage' si occupa dell'effetto post invecchiamento.

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

Provalo qui

Esempio: per un dato URL ' https://www.instagram.com/dress_blouse_designer/ ' si può chiamare la funzione

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

Sono in grado di vedere solo i primi 12 post, come posso ottenerli tutti?
Rahul Gawale,

0

Funziona usando una semplice chiamata Ajax e iterando percorsi di immagine.

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

Ha funzionato per me, ma solo quando ho effettuato l'accesso a Instagram.
zundi,

-1

Ecco uno script php che scarica le immagini e crea un file html con collegamenti sulle immagini. Credito 350D per la versione php, questo è solo elaborato .. Suggerirei di mettere questo è un lavoro cron e sparare per quanto spesso sia necessario. Lavoro verificato a partire da maggio 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);
?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.