it-swarm.com.de

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

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 Benutzer sich bei Instagram anmelden, um dies zu sehen Sie sollten nicht einmal einen Instagram-Account benötigen.

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

In der Instagram-API übergeben nicht authentifizierte Anforderungen ein client_id anstelle 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."
  }
}

Also ist das nicht möglich? Gibt es keine Möglichkeit, die neuesten (öffentlichen) Medien eines Benutzers abzurufen, ohne einen Benutzer aufzufordern, sich mit OAuth zuerst bei einem Instagram-Konto anzumelden?

163
Peeja

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

Um GET für https://api.instagram.com/v1/users/<user-id>/media/recent/ Auszuführen (zum gegenwärtigen Zeitpunkt), benötigen Sie kein OAuth Zugriffstoken.

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

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

122
Ersan J Sano
var name = "smena8m";
$.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) {
          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>

Sie können jeden Instagram-Nutzerfoto-Feed im JSON-Format mit ?__a=1 Neben der Zielseitenadresse herunterladen so . Keine Notwendigkeit, eine Benutzer-ID zu erhalten oder eine App zu registrieren, keine Token, keine oAuth.

Die Variablen min_id Und max_id Können zur Paginierung verwendet werden. Hier ist Beispiel

YQL funktioniert hier möglicherweise nicht innerhalb von snipped iframe, daher können Sie es immer manuell in YQL Console überprüfen

APRIL 2018 UPDATE: Nach den letzten Aktualisierungen von Instagram können Sie dies nicht auf Client-Seite (Javascript) tun, da benutzerdefinierte Header für signierte Anfragen aufgrund von Einschränkungen von CORSAccess-Control-Allow-Headers Nicht mit Javascript festgelegt werden können. Es ist weiterhin möglich, dies über php oder eine andere serverseitige Methode mit einer korrekten Signatur basierend auf rhx_gis, csrf_token Und Anforderungsparametern durchzuführen. Sie können mehr darüber lesen hier .

JANUAR 2019 UPDATE: YQL ist in den Ruhestand getreten. Überprüfen Sie mein letztes Update mit Google Image Proxy als CORS Proxy für Instagram-Seite! Dann nur negatives Moment - Paginierung bei dieser Methode nicht möglich.

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;
320
350D

11.11.2017
Da Instagram die Art und Weise geändert hat, in der diese Daten bereitgestellt werden, funktioniert keine der oben genannten Methoden mehr. Hier ist die neue Möglichkeit, die Medien des Benutzers abzurufen:
BEKOMMEN https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
Wo:
query_id - Permanenter Wert: 17888483320059182 (Beachten Sie, dass dies in Zukunft möglicherweise 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 beschaffenden Gegenstände.
after - ID des letzten Elements, wenn Sie Elemente von dieser ID abrufen möchten.

33
Footniko

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
26
Michael

Seit letzter Woche habe ich auf Instagram die /media/ - URLs deaktiviert und eine Problemumgehung implementiert, die im Moment recht 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:

Benutzermedien abrufen:

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

Benutzermedien mit Limitanzahl abrufen:

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 und vorherigen Seite an die Antwort an, sodass Sie diese an Ihrem Ende nicht berechnen müssen.

Hoffe es gefällt euch!

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

16
whizzzkid

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

14
Bill Rollins

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.

9
Craig Heneveld

Hier ist eine Rails Lösungen. Es ist eine Art Hintertür, die eigentlich die Vordertü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 erhalte die Daten wie folgt:

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 konstruiere:

  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'
9

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 mit der Methode https://www.instagram.com/username/?__a=1 Abfragen.

Angenommen, Ihre zurückgegebenen JSON -Daten sind $data Sie können 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 letzten Änderung waren graphql und Edge_owner_to_timeline_media.

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

Hoffe es hilft jemandem;)

8
spice

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

Meine Logik im Code ist folgende:

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

Wichtig, dass Sie hier wissen, dass diese ID die ID des letzten Bilds im Array ist. 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.

5
Vulovic Vukasin

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;
}
4
Leo

Wenn Sie Oauth) umgehen, würden Sie wahrscheinlich nicht wissen, um welchen instagram-Benutzer es sich handelt. Allerdings gibt es einige Möglichkeiten, instagram-Images ohne Authentifizierung zu erhalten.

  1. Mit der API von Instagram können Sie die beliebtesten Bilder eines Benutzers anzeigen, ohne sich authentifizieren zu müssen. Verwenden Sie den folgenden Endpunkt: Hier ist der Link

  2. Instagram bietet RSS-Feeds für Tags unter this .

  3. Instagram-Benutzerseiten sind öffentlich, daher kannst du PHP mit CURL, um ihre Seite zu erhalten, und einen DOM-Parser, um das HTML nach den gewünschten Bild-Tags zu durchsuchen.

4
Dorian Damon

Nun, als /?__a=1 funktioniert jetzt nicht mehr, es ist besser, die instagram-Seite wie in dieser Antwort beschrieben zu locken und zu analysieren: Zugriffs-Token-Instagram-API generieren, ohne sich anmelden zu müssen?

3
altinturk

Noch ein Trick: Fotos mit Hashtags suchen:

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 Elemente, die abgerufen werden sollen (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 (ungefähr 110 für den Wert 25) und ungefähr 460 für den Wert 100))

after - ID des letzten Elements, wenn Sie Elemente von dieser ID abrufen möchten. Wert von end_cursor von der JSON-Antwort kann hier verwendet werden.

3
kara4k

Mit dieser API können Sie öffentliche Informationen des instagram-Benutzers abrufen:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2

Wenn Sie den Grenzwertparameter nicht festlegen, sind die Beiträge standardmäßig auf 12 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 Reaktion:

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

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>
2
Karra

Mit dem folgenden NodeJS-Code werden beliebte Bilder von einer Instagram-Seite entfernt. Die Funktion 'ScrapeInstagramPage' kümmert sich um den Nachalterungseffekt.

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 aus hier

Beispiel: Für eine gegebene URL ' https://www.instagram.com/dress_blouse_designer/ ' kann man function aufrufen

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

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