Wie kann ich die Medien eines Benutzers von Instagram abrufen, ohne mich als Benutzer zu authentifizieren?

175

Ich versuche, die neuesten Instagram-Medien eines Benutzers in eine Seitenleiste zu stellen. Ich versuche, die Instagram-API zum Abrufen der Medien zu verwenden.

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

Die Dokumentation sagt zu GET https://api.instagram.com/v1/users/<user-id>/media/recent/, aber es heißt, ein OAuth-Zugriffstoken zu übergeben. Ein Zugriffstoken stellt die Berechtigung dar, im Namen eines Benutzers zu handeln. Ich möchte nicht, dass sich Benutzer bei Instagram anmelden, um dies in der Seitenleiste zu sehen. Sie sollten nicht einmal einen Instagram-Account benötigen.

Zum Beispiel kann ich zu http://instagram.com/thebrainscoop gehen, ohne bei Instagram angemeldet zu sein und Fotos zu sehen. Ich möchte das über die API tun.

In der Instagram-API übergeben nicht vom Benutzer authentifizierte Anforderungen ein client_idanstelle eines access_token. Wenn ich das versuche, bekomme ich:

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

Ist das nicht möglich? Gibt es keine Möglichkeit, die neuesten (öffentlichen) Medien eines Benutzers abzurufen, ohne einen Benutzer zu bitten, sich zuerst über OAuth bei einem Instagram-Konto anzumelden?

Peeja
quelle
Mit diesem Plugin ist es möglich, einfach den Quellcode zu überprüfen, wie die neuesten öffentlichen Medien eines Benutzers abgerufen wurden, ohne einen Benutzer zu bitten, sich bei seinem Instagram-Konto anzumelden. : D smashballoon.com/instagram-feed/demo Sie benötigen lediglich eine Client-ID, kein Zugriffstoken erforderlich. : D
Jehzlau
Sie müssen sich authentifizieren, damit sie Sie verfolgen und Ihre Downloads (Raten ...) wie bei jeder großen API begrenzen können. Es gibt eine Öffentlichkeit für echte Benutzer und eine Öffentlichkeit für Scrapper / Bots. Dies ist normalerweise nicht dasselbe, da echte Benutzer Anzeigen sehen und den Dienst direkt nutzen.
Christophe Roussy
1
Keine dieser Methoden funktioniert mehr. Siehe stackoverflow.com/questions/49852080/…
Moradnejad

Antworten:

123

Dies ist spät, aber es lohnt sich, wenn es jemandem hilft, da ich es in der Dokumentation von Instagram nicht gesehen habe.

Zum Ausführen von GET https://api.instagram.com/v1/users/<user-id>/media/recent/(zum Zeitpunkt des Schreibens) benötigen Sie kein OAuth-Zugriffstoken.

Sie können durchführen https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]

[CLIENT ID] ist eine gültige Client-ID, die in der App über die Verwaltung von Clients registriert ist (unabhängig vom Benutzer). Sie können [USER ID] vom Benutzernamen erhalten, indem Sie eine Suchanforderung für GET-Benutzer ausführen: https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]

Ersan J Sano
quelle
9
Ich denke, sie haben vielleicht wieder ihre Meinung geändert. Ich erhalte die gleiche Fehlerantwort wie im OP
James
35
Dies gilt nur für Apps, die vor dem 17. November 2015 erstellt wurden, und wird nach Juni 2016 überhaupt nicht mehr unterstützt. Danach benötigen Sie ein oauth access_token. instagram.com/developer/changelog
Dax Fohl
210
Das ist so dumm und irritierend. Warum sollten sie ein Zugriffstoken erzwingen, um bereits öffentliche Bilder anzuzeigen ? Ich versuche kaum, sie für jeden Benutzer auf der Welt zu spülen. Ich möchte nur die neuesten Insta eines Kunden anzeigen, ohne stundenlang damit herumspielen zu müssen. Gah!
Matt Fletcher
8
@Cabus Rate Limits, Kumpel.
Walf
20
@MattFletcher es ist jetzt noch dümmer, man muss die App-Berechtigungsprüfung durchlaufen und nicht sicher sein, ob es überhaupt machbar ist, da dieser Anwendungsfall "Anzeigen des eigenen Feeds des Kunden auf seiner eigenen Webseite" nicht zu den Anwendungsfällen gehört. Duh, diese Einschränkungen sind scheiße.
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>

Verwendung Sie können eine beliebige Instagram Benutzer Foto - Feed in JSON - Format herunterladen ?__a=1neben Zielseite Adresse wie folgt aus . Keine Notwendigkeit, Benutzer-ID zu erhalten oder eine App zu registrieren, keine Token, keine oAuth.

min_idund max_idVariablen können für die Paginierung verwendet werden, hier ein Beispiel

YQLfunktioniert hier möglicherweise nicht in einem abgeschnittenen Iframe, sodass Sie ihn jederzeit manuell in der YQL-Konsole überprüfen können

APRIL 2018 UPDATE: Nach den letzten Instagram-Updates können Sie dies nicht auf der Clientseite (Javascript) tun, da benutzerdefinierte Header für signierte Anforderungen aufgrund von CORS Access-Control-Allow-HeadersEinschränkungen nicht mit Javascript festgelegt werden können . Es ist immer noch möglich , dies zu tun , über phpoder ein anderes Server Side - Verfahren mit dem richtigen Signatur basierend auf rhx_gis, csrf_tokenund Anforderungsparameter. Sie können mehr darüber lesen Sie hier .

UPDATE JANUAR 2019: YQL ist im Ruhestand. Überprüfen Sie daher mein aktuelles Update mit Google Image Proxy als CORSProxy für die Instagram-Seite! Dann nur negative Moment - Paginierung mit dieser Methode nicht verfügbar.

PHP Lösung:

    $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
quelle
14
@ 350D Wie hast du das gefunden? Ich kann es nirgendwo in ihrer Dokumentation finden. Ich möchte nur mehr darüber lesen, was mit diesem Endpunkt möglich ist (z. B. quadratische Bilder im Vergleich zu nicht quadratischen Bildern, ob dies im Juni enden soll usw.) - Danke!
Phil Johnston
8
@Phil Johnston Nur eine Recherche 😀 Nehmen Sie eine andere - Sie können / media /? Size = L neben der URL der Foto-Landingpage hinzufügen und ein Foto in voller Auflösung erhalten.
350D
9
@ user2659694 Ich habe endlich die Lösung gefunden, um die nächsten Seiten mit dieser Methode zu erhalten, die Sie verwenden können / media /? max_id = [MAX_ID]
Reza
3
Zu Ihrer Information, dies scheint nur zu funktionieren, wenn Sie selbst in einem Instagram-Konto angemeldet sind. Versuchen Sie es in Incognito in Chrome oder ähnlichem und Sie werden sehen, dass die JSON-Antwort keine Elemente enthält. Ich habe versucht, dies in ein Skript zu integrieren, um die Liste der URLs auf einem Webserver abzurufen, und musste zu den alten Autorisierungsmethoden zurückkehren.
Ryan Zink
9
@ RyanZink hast du ein privates Konto ausprobiert? es funktioniert in Ordnung für mich abgemeldet oder inkognito auf öffentlichen Konten.
Ryan
40

11.11.2017
Da Instagram die Art und Weise geändert hat, wie diese Daten bereitgestellt werden, funktioniert heutzutage keine der oben genannten Methoden. Hier ist der neue Weg, um die Medien des Benutzers abzurufen :
GET https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
Where:
query_id- permanenter Wert: 17888483320059182 (beachten Sie, dass er möglicherweise in Zukunft geändert wird).
id- ID des Benutzers. Es kann mit einer Liste von Benutzern kommen. Um die Liste der Benutzer zu erhalten, können Sie folgende Anfrage verwenden: GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first- Anzahl der zu erhaltenden Elemente.
after- ID des letzten Elements, wenn Sie Elemente von dieser ID erhalten möchten.

Footniko
quelle
Könnten Sie mir bitte mitteilen, woher die Abfrage-ID und die ID des Benutzers stammen?
Vijaysinh Parmar
2
@ VijaysinhParmar ist, wie ich bereits erwähnte, query_idein dauerhafter Wert. Das heißt, es ist immer 17888483320059182 (zumindest wenn Instagram es nicht ändert). ID des Benutzers - ist die ID des Benutzers (hat meine Antwort ein wenig bearbeitet)
Footniko
1
Ich erinnere mich nicht genau, irgendwo im Internet. Aber ich habe keine Beziehung zu Instagram, und falls es sich ändert, kann ich dir das neue nicht sagen :(
Footniko
1
Frage mich, wie die Ratenbegrenzungspolitik dieses Ansatzes aussieht?
kkzxak47
1
Wenn jemand Probleme beim Anfordern dieser URL über eine CURL-Anforderung hat, müssen Sie den Cookie-Anforderungsheader abrufen (öffnen Sie die Registerkarte Netzwerke, kopieren Sie nach dem Ausführen der URL den Cookie-Header und fügen Sie ihn in den Curl-Anforderungsheader ein. Wenn Sie dies nicht tun, Sie erhalten den Fehler 403 Zugriff verweigert.
Anders
38

Ich konnte die neuesten Medien eines Benutzers mithilfe der folgenden API ohne Authentifizierung abrufen (einschließlich Beschreibung, Likes, Anzahl der Kommentare).

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

Z.B

https://www.instagram.com/{username}/?__a=1
Michael
quelle
1
Dies funktionierte auch für mich. Aber wenn "is_video = true", keine Video-URL in Daten.
Didikee
4
Richtig, Sie können nur die Miniaturansichten abrufen (nicht das Video selbst) - leider habe ich keine offizielle Dokumentation dafür gefunden und ich habe keine Ahnung, ob diese API veraltet ist oder wie lange sie unterstützt wird.
Michael
8
Ab dem 13.04.2018 scheint dies nicht mehr zu funktionieren. Vielleicht verschärfen sie aufgrund des neuesten Datenskandals von Cambridge Analytica bei Facebook die Dinge um eine Tonne. Irgendwelche anderen Vorschläge, um grundlegende Benutzerdaten ohne Authentifizierung zu erhalten?
BakerStreetSystems
2
Ja, es gab eine Zeit, in der diese API nicht funktionierte - aber jetzt ist sie wieder da
Michael
4
Es hat bei mir funktioniert, aber nur, wenn ich bei Instagram angemeldet bin.
Zundi
16

Seit letzter Woche, als Instagram /media/URLs deaktiviert hat, habe ich eine Problemumgehung implementiert, die im Moment ziemlich gut funktioniert.

Um alle Probleme in diesem Thread zu lösen, habe ich Folgendes geschrieben: https://github.com/whizzzkid/instagram-reverse-proxy

Es stellt alle öffentlichen Daten von instagram unter Verwendung der folgenden Endpunkte bereit:

Holen Sie sich Benutzermedien:

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

Holen Sie sich Benutzermedien mit maximaler Anzahl:

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

Verwenden Sie JSONP:

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

Die Proxy-API hängt auch die URLs der nächsten Seite und der vorherigen Seite an die Antwort an, sodass Sie diese nicht am Ende berechnen müssen.

Hoffe es gefällt euch!

Vielen Dank an @ 350D für das Erkennen :)

whizzzkid
quelle
1
@rex bis sie ändern, wie die Dinge am Ende funktionieren, sind wir gut! Sie haben sich in den letzten 3 Jahren nicht darum gekümmert, wahrscheinlich auch nicht in den nächsten 3.
gekümmert whizzzkid
3
@whizzzkid Pech, sie ändern es. Ich habe gesehen, dass Sie glauben, dass der Benutzerendpunkt die Dinge erledigt, aber es gibt Grenzen für Anfragen für nicht angemeldete Benutzer. Irgendwelche Ideen?
Nobilik
1
@nobilik Die Problemumgehung ist vorhanden. igpi.ga/whizzzkid/media?count=3 und igpi.ga/graphql/query/?user_id=1606740656&count=3 sollten beide Daten zurückgeben. Denken Sie daran, dass undefinierte Verweise für diese URLs deaktiviert sind.
Whizzzkid
1
@whizzzkid - Hat es funktioniert! Vielen Dank - Sie sind ein Gelehrter und ein Gentleman!
James Trickey
1
Ich erhalte die Fehlermeldung "Referrer wurde der Zugriff verweigert". Vielleicht funktioniert das nicht mehr?
Khalid13
14

Die Instagram-API erfordert eine Benutzerauthentifizierung über OAuth, um auf den aktuellen Medienendpunkt für einen Benutzer zugreifen zu können. Derzeit scheint es keine andere Möglichkeit zu geben, alle Medien für einen Benutzer abzurufen.

Bill Rollins
quelle
4
Dies macht keinen Sinn. Wenn ich meine eigenen Medien auf meiner eigenen Website anzeigen möchte, warum brauche ich dann jeden, der sie sehen möchte, um ein Instagram-Konto zu haben?
Ninjasense
5
ninjasense - Ich glaube nicht, dass es so funktioniert. Ich denke, Ihre Website müsste ein bisschen Code enthalten, der die Instagram-API mit Ihren angegebenen Anmeldeinformationen abfragt, um Ihre Medien abzurufen. Sie würden dann Ihre Medien allen Benutzern Ihrer Website zeigen. Ihre Website ist das einzige, was zur Authentifizierung bei Instagram erforderlich ist.
Bill Rawlinson
9

Wenn Sie nach einer Möglichkeit suchen, ein Zugriffstoken für die Verwendung in einem einzelnen Konto zu generieren, können Sie dies versuchen -> https://coderwall.com/p/cfgneq .

Ich brauchte eine Möglichkeit, die Instagram-API zu verwenden, um die neuesten Medien für ein bestimmtes Konto abzurufen.

Craig Heneveld
quelle
5
Dies ist mehr oder weniger das, was ich am Ende getan habe: ein neues Konto erstellt, ein Zugriffstoken dafür erstellt und dieses Token in meiner Serverkonfiguration neben dem API-Schlüssel gespeichert. Dies ist jedoch eine schlechte Lösung für JS-Apps, da Ihr Zugriffstoken an den Benutzer gesendet werden muss (was ich bei vielen Beispielcodes gesehen habe). Zum Glück kann ich es serverseitig machen.
Peeja
4
@CraigHeneveld Wie gehen Sie vor, um hat access_token auf dem neuesten Stand zu halten? Ist es bei dir nicht abgelaufen?
Ryan Ore
Läuft der Token einige Zeit ab?
Monitus
Wenn mein Gedächtnis mir dient, läuft der Schlüssel nur ab, wenn Sie Ihr Passwort ändern. Hier ist ein weiterer Thread zu diesem Thema -> stackoverflow.com/questions/22753170/…
Craig Heneveld
Wie können wir mehrere Benutzerfotos bekommen? Wie können wir mehrere Benutzer-IDs übergeben, die durch "," getrennt sind?
Aadil Keshwani
9

Hier ist eine Schienenlösung. Es ist eine Art Hintertür, die eigentlich die Haustür ist.

# 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

Das Objekt, das Sie zurückerhalten, hängt davon ab, ob es sich um eine Benutzersuche oder eine Tag-Suche handelt. Ich bekomme die Daten so:

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

Ich erhalte dann eine weitere Ergebnisseite, indem ich eine URL wie folgt erstelle:

  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
quelle
Diese Lösung funktioniert für mich, aber ich habe einige Probleme damit. Nach dem Laden der Daten wird mein Rails-Server (mit Rails 5.0.0, Puma 3.6.0-Server) unerklärlich neu gestartet ... Gibt es eine mögliche Lösung?
Luis Eduardo Rojas Cabrera
8

Dank des sich ständig ändernden (und schrecklich gestalteten) API-Schemas von Instagram funktionieren die meisten der oben genannten Funktionen ab April 2018 nicht mehr.

Hier ist der neueste Pfad für den Zugriff auf einzelne Post-Daten, wenn Sie deren API direkt über das abfragen https://www.instagram.com/username/?__a=1 Methode .

Angenommen, Ihre zurückgegebenen JSONDaten $datakönnen Sie jedes Ergebnis anhand der folgenden Pfadbeispiele durchlaufen:

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

Die wichtigsten Dinge in dieser jüngsten Änderung waren graphqlundedge_owner_to_timeline_media .

Sieht so aus, als würden sie diesen API-Zugriff für Nicht-Geschäftskunden im Dezember 2018 beenden beenden. Machen Sie also das Beste daraus, solange Sie können.

Hoffe es hilft jemandem;)

würzen
quelle
Das hat mir nur geholfen, ich möchte nur die neuesten Instagram-Beiträge für einen Kunden anzeigen. Vielen Dank!
Weston Deboer
1
instagram.com/username/?__a=1 gibt jetzt den Fehler aus: Der Zugriff auf www.instagram.com wurde verweigert. Sie haben keine Berechtigung zum Anzeigen dieser Seite. HTTP ERROR 403 irgendwelche anderen Ideen?
Hese
1
Ja, Instagram hat das jetzt erledigt. "Um die Privatsphäre und Sicherheit von Instagram-Nutzern kontinuierlich zu verbessern, beschleunigen wir die Ablehnung der Instagram API-Plattform und nehmen die folgenden Änderungen sofort in Kraft. Wir wissen, dass dies Auswirkungen auf Ihr Unternehmen oder Ihre Dienste haben kann, und bedanken uns für Ihre Unterstützung bei der Gewährleistung der Sicherheit unserer Plattform. Diese Funktionen werden sofort deaktiviert (zuvor für den 31. Juli 2018 oder den 11. Dezember 2018 festgelegt). "
Spice
Wenn das, was ich lese, korrekt ist, ist es nicht mehr möglich, Bilder oder Daten von einem "nicht geschäftlichen" Konto abzurufen. Sie töten die Plattform-API total ab. Ich denke, das ist es dann ... instagram.com/developer/changelog
Spice
1
@ James_Tookey wird nicht möglich sein Kumpel. Aufgrund ihrer neuen Datenschutzbeschränkungen können Benutzer / Daten persönlicher Konten nicht mehr abgefragt oder abgerufen werden, sondern nur noch geschäftliche. Grundsätzlich haben sie nur die gesamte API-Nutzung für persönliche Konten beendet.
Gewürz
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;
}
Löwe
quelle
5

Ich möchte nur zu @ 350D Antwort hinzufügen, da es für mich schwer zu verstehen war.

Meine Logik im Code ist die nächste:

Wenn ich API zum ersten Mal aufrufe, rufe ich nur an https://www.instagram.com/_vull_ /media/. Wenn ich eine Antwort erhalte, überprüfe ich den Booleschen Wert von more_available. Wenn es wahr ist, bekomme ich das letzte Foto aus dem Array, bekomme seine ID und rufe dann erneut die Instagram-API auf, diesmal jedoch https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433 .

Wichtig hier zu wissen, diese ID ist die ID des letzten Bildes im Array. Wenn Sie also nach maxId mit der letzten ID des Bildes im Array fragen, erhalten Sie die nächsten 20 Bilder und so weiter.

Hoffe das klärt die Dinge.

Vulovic Vukasin
quelle
4

Wenn Sie Oauth umgehen, wissen Sie wahrscheinlich nicht, um welchen Instagram-Benutzer es sich handelt. Davon abgesehen gibt es einige Möglichkeiten, um Instagram-Bilder ohne Authentifizierung zu erhalten.

  1. Mit der Instagram-API können Sie die beliebtesten Bilder eines Benutzers anzeigen, ohne sich zu authentifizieren. Verwenden des folgenden Endpunkts: Hier ist der Link

  2. Instagram bietet RSS - Feeds für Tags auf diese .

  3. Instagram-Benutzerseiten sind öffentlich, sodass Sie PHP mit CURL verwenden können, um ihre Seite abzurufen, und einen DOM-Parser, um das HTML nach den gewünschten Bild-Tags zu durchsuchen.

Dorian Damon
quelle
9
Scheint veraltet zu sein.
Burak Tokak
ist es möglich, die Authentifizierung für Instagram zu umgehen
JAck
3

Ein weiterer Trick: Suchen Sie Fotos nach Hashtags:

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

Wo:

query_hash - permanenter Wert (ich glaube, sein Hash von 17888483320059182, kann in Zukunft geändert werden)

tag_name - Der Titel spricht für sich

first - Anzahl der zu beschaffenden Elemente (Ich weiß nicht warum, aber dieser Wert funktioniert nicht wie erwartet. Die tatsächliche Anzahl der zurückgegebenen Fotos ist geringfügig größer als der mit 4,5 multiplizierte Wert (ca. 110 für den Wert 25 und ca. 460 für den Wert) Wert 100))

after- ID des letzten Elements, wenn Sie Elemente von dieser ID erhalten möchten. Der Wert der end_cursorJSON-Antwort kann hier verwendet werden.

kara4k
quelle
Wie findest du das?
ekntrtmz
2

Sie können diese API verwenden , öffentliche Informationen des instagram Benutzer abzurufen:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2

Wenn Sie den Grenzwert Parameter nicht gesetzt ist , werden die Beiträge auf 12 standardmäßig begrenzt

Diese API wurde in SpringBoot mit HtmlUnit erstellt, wie Sie im Code sehen können:

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


Es ist ein Beispiel für eine Antwort:

{
  "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
quelle
Kann ich Daten von Benutzer-ID (pk) erhalten
SAURABH RATHOD
Sorry @SAURABHRATHOD Ich habe es versucht, aber ich habe keinen Weg gefunden, dies zu tun. Ich würde mich sehr freuen, wenn jemand dies lösen würde. Danke für den Kommentar.
Ruan Barroso
2

Ich brauchte diese Funktion wirklich, aber für Wordpress. Ich passe und es hat perfekt funktioniert

<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
quelle
1

Der folgende NodeJS-Code kratzt beliebte Bilder von einer Instagram-Seite. Die Funktion 'ScrapeInstagramPage' sorgt für den Post-Aging-Effekt.

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

Probieren Sie es hier aus

Beispiel: Bei gegebener URL ' https://www.instagram.com/dress_blouse_designer/ ' kann man die Funktion aufrufen

ScrapeInstagramPage ({username : "dress_blouse_designer", debug : false});
Vishnu Kanwar
quelle
Ich kann nur die ersten 12 Beiträge sehen. Wie kann ich alle bekommen?
Rahul Gawale
0

Dies funktioniert mit einem einfachen Ajax-Aufruf und iterierenden Bildpfaden.

        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
quelle
Es hat bei mir funktioniert, aber nur, wenn ich bei Instagram angemeldet bin.
Zundi
-1

Hier ist ein PHP-Skript, das die Bilder herunterlädt und eine HTML-Datei mit Links zu den Bildern erstellt. Credit 350D für PHP-Version, dies ist nur ausgearbeitet. Ich würde vorschlagen, dies ist ein Cron-Job und feuern, wie oft Sie brauchen. Verifizierte Arbeit ab Mai 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
quelle