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?
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]
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 CORS
Access-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;
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.
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
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 :)
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.
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.
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'
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;)
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.
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;
}
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.
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
Instagram bietet RSS-Feeds für Tags unter this .
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.
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?
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.
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
}
]
}
]
}
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>
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});
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>"
);
});
})