J'essaie de placer le support Instagram récent d'un utilisateur dans une barre latérale. J'essaie d'utiliser l'API Instagram pour récupérer le média.
http://instagram.com/developer/endpoints/users/
La documentation indique GET https://api.instagram.com/v1/users/<user-id>/media/recent/
, mais indique de passer un jeton d'accès OAuth. Un jeton d'accès représente l'autorisation d'agir au nom d'un utilisateur. Je ne veux pas que les utilisateurs se connectent à Instagram pour voir cela dans l'encadré. Ils ne devraient même pas avoir besoin d'un compte Instagram.
Par exemple, je peux aller sur http://instagram.com/thebrainscoop sans être connecté à Instagram et voir des photos. Je veux le faire via l'API.
Dans l'API Instagram, les requêtes non authentifiées par l'utilisateur transmettent un client_id
au lieu d'un access_token
. Si j'essaye ça, je reçois:
{
"meta":{
"error_type":"OAuthParameterException",
"code":400,
"error_message":"\"access_token\" URL parameter missing. This OAuth request requires an \"access_token\" URL parameter."
}
}
Alors, n'est-ce pas possible? N'y a-t-il aucun moyen d'extraire le dernier média (public) d'un utilisateur sans demander à un utilisateur de se connecter à un compte Instagram via OAuth d'abord?
C'est tard, mais ça vaut la peine si ça aide quelqu'un, car je ne l'ai pas vu dans la documentation d'Instagram.
Pour exécuter GET sur https://api.instagram.com/v1/users/<user-id>/media/recent/
(au moment de l'écriture), vous n'avez en fait pas besoin du jeton d'accès OAuth.
Vous pouvez effectuer https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]
[ID CLIENT] serait un ID client valide enregistré dans une application via la gestion des clients (sans aucun lien avec l'utilisateur). Vous pouvez obtenir un [ID utilisateur] à partir du nom d'utilisateur en effectuant une demande de recherche d'utilisateurs GET: 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>
Vous pouvez télécharger tout flux de photos d'utilisateur Instagram au format JSON à l'aide de ?__a=1
à côté de l'adresse de la page de destination comme ci-dessous . Pas besoin d'obtenir un identifiant d'utilisateur ou d'enregistrer une application, pas de jetons, pas d'oAuth.
Les variables min_id
et max_id
peuvent être utilisées pour la pagination, voici exemple
YQL
peut ne pas fonctionner ici à l'intérieur de l'iframe tronquée, vous pouvez donc toujours le vérifier manuellement dans Console YQL
MISE À JOUR AVRIL 2018: après les dernières mises à jour instagram, vous ne pouvez pas le faire côté client (javascript) car les en-têtes personnalisés pour les demandes signées ne peuvent pas être définis avec javascript à cause des restrictions CORS
Access-Control-Allow-Headers
. Il est toujours possible de le faire via php
ou toute autre méthode côté serveur avec une signature appropriée basée sur rhx_gis
, csrf_token
et des paramètres de requête. Vous pouvez en lire plus à ce sujet ici .
MISE À JOUR JANVIER 2019: YQL s'est retiré, vérifiez donc ma dernière mise à jour avec le proxy Google Image en tant que proxy CORS
pour la page Instagram! Ensuite, seul le moment négatif - la pagination n'est pas disponible avec cette méthode.
PHP
solution:
$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
Depuis que Instagram a changé la façon dont ils fournissent ces données, aucune des méthodes ci-dessus ne fonctionne actuellement. Voici le nouveau moyen d'obtenir le média de l'utilisateur:
GET https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
Où:query_id
- valeur permanente: 17888483320059182 (notez que cette information pourrait être modifiée à l'avenir).id
- identifiant de l'utilisateur. Cela peut venir avec une liste d'utilisateurs. Pour obtenir la liste des utilisateurs, vous pouvez utiliser la requête suivante: GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first
- nombre d'éléments à obtenir.after
- identifiant du dernier élément si vous souhaitez obtenir les éléments de cet identifiant.
J'ai pu obtenir le média le plus récent d'un utilisateur à l'aide de l'API suivante sans authentification (y compris la description, les likes, le nombre de commentaires).
https://www.instagram.com/Apple/?__a=1
Par exemple.
https://www.instagram.com/{username}/?__a=1
Dès la semaine dernière, Instagram désactivait /media/
urls, j'ai implémenté une solution de contournement, qui fonctionne plutôt bien pour l'instant.
Pour résoudre les problèmes de tout le monde dans ce fil, j’ai écrit ceci: https://github.com/whizzzkid/instagram-reverse-proxy
Il fournit toutes les données publiques d'instagram en utilisant les points de terminaison suivants:
Obtenir les médias de l'utilisateur:
https://igapi.ga/<username>/media
e.g.: https://igapi.ga/whizzzkid/media
Obtenir les médias de l'utilisateur avec un nombre limite:
https://igapi.ga/<username>/media?count=N // 1 < N < 20
e.g.: https://igapi.ga/whizzzkid/media?count=5
Utilisez JSONP:
https://igapi.ga/<username>/media?callback=foo
e.g.: https://igapi.ga/whizzzkid/media?callback=bar
L'API de proxy ajoute également à la réponse les URL de page suivante et de page précédente, de sorte que vous n'avez pas besoin de calculer cela à la fin.
J'espère que vous les aimez!
Merci à @ 350D d'avoir remarqué cela :)
L'API Instagram requiert une authentification de l'utilisateur via OAuth pour accéder au point de terminaison multimédia récent d'un utilisateur. Il ne semble pas y avoir d’autre moyen actuellement d’obtenir tous les médias pour un utilisateur.
Si vous cherchez un moyen de générer un jeton d'accès à utiliser sur un seul compte, vous pouvez essayer ceci -> https://coderwall.com/p/cfgneq .
J'avais besoin d'un moyen d'utiliser l'API instagram pour récupérer tous les derniers médias d'un compte particulier.
Voici une Rails solutions. C'est une sorte de porte arrière, qui est en fait la porte d'entrée.
# create a headless browser
b = Watir::Browser.new :phantomjs
uri = 'https://www.instagram.com/explore/tags/' + query
uri = 'https://www.instagram.com/' + query if type == 'user'
b.goto uri
# all data are stored on this page-level object.
o = b.execute_script( 'return window._sharedData;')
b.close
L'objet que vous récupérez varie selon qu'il s'agisse d'une recherche d'utilisateur ou d'une recherche de balises. Je reçois les données comme ceci:
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
J'obtiens ensuite une autre page de résultats en construisant une URL de la manière suivante:
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'
Grâce au schéma d'API en constante évolution (et à la conception horrible) d'Instagram, la plupart des solutions ci-dessus ne fonctionneront plus en avril 2018.
Voici le dernier chemin d'accès aux données de publication individuelles si vous interrogez directement leur API à l'aide de la méthode https://www.instagram.com/username/?__a=1
.
En supposant que vos données JSON
renvoyées soient $data
, vous pouvez parcourir chaque résultat à l'aide des exemples de chemins suivants:
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 ....
}
Les principales caractéristiques de ce changement récent étaient graphql
et Edge_owner_to_timeline_media
.
On dirait qu'ils vont supprimer cet accès à l'API pour les clients non "professionnels" en décembre 2018 , alors profitez-en au maximum.
J'espère que ça aide quelqu'un;)
Je veux juste ajouter à la réponse @ 350D, car il était difficile pour moi de comprendre.
Ma logique en code est la suivante:
Lorsque j'appelle l'API pour la première fois, j'appelle uniquement https://www.instagram.com/_vull_ /media/
. Lorsque je reçois une réponse, je vérifie la valeur booléenne de more_available
. Si c'est vrai, j'obtiens la dernière photo du tableau, j'obtiens son identifiant puis appelle à nouveau l'API Instagram, mais cette fois https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433
.
Ce qui est important à savoir ici, cet identifiant est l'identifiant de la dernière image du tableau. Ainsi, lorsque vous demanderez maxId avec le dernier identifiant de l'image dans le tableau, vous obtiendrez les 20 images suivantes, et ainsi de suite.
J'espère que cela clarifie les choses.
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;
}
Si vous contournez Oauth, vous ne saurez probablement pas de quel utilisateur instagram ils sont. Cela étant dit, il existe plusieurs façons d'obtenir des images instagram sans authentification.
L'API d'Instagram vous permet de visualiser les images les plus populaires d'un utilisateur sans s'authentifier. Utilisation du terminal suivant: voici le lien
Instagram fournit des flux RSS pour les balises à this .
Les pages utilisateur Instagram sont publiques. Vous pouvez donc utiliser PHP avec CURL pour obtenir leur page et un analyseur DOM pour rechercher dans le code HTML les balises d’image de votre choix.
Eh bien, comme /?__a=1
a cessé de fonctionner, il est préférable d’utiliser curl et d’analyser la page instagram telle qu’elle est écrite à cette réponse: Générer une API de jeton d’accès Instagram, sans avoir à se connecter?
Encore une astuce, recherchez des photos par hashtags:
GET https://www.instagram.com/graphql/query/?query_hash=3e7706b09c6184d5eafd8b032dbcf487&variables={"tag_name":"nature","first":25,"after":""}
Où:
query_hash
- valeur permanente (je crois que son hash de 17888483320059182 peut être modifié à l'avenir)
tag_name
- le titre parle de lui-même
first
- nombre d'éléments à obtenir (je ne sais pas pourquoi, mais cette valeur ne fonctionne pas comme prévu. Le nombre réel de photos renvoyées est légèrement supérieur à la valeur multipliée par 4,5 (environ 110 pour la valeur 25, et environ 460 pour la valeur 100))
after
- identifiant du dernier élément si vous souhaitez obtenir des éléments de cet identifiant. La valeur de end_cursor
de la réponse JSON peut être utilisée ici.
Vous pouvez utiliser cette API pour récupérer les informations publiques de l'utilisateur instagram:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2
Si vous ne définissez pas le paramètre limit, les publications sont limitées à 12 par défaut
Cette API a été créée dans SpringBoot avec HtmlUnit comme vous pouvez le constater dans le code:
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);
}
C'est un exemple de réponse:
{
"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
}
]
}
]
}
J'avais vraiment besoin de cette fonction mais pour Wordpress. Je suis en forme et cela a fonctionné parfaitement
<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>
Le code de nodejs ci-dessous efface des images populaires d'une page Instagram. La fonction 'ScrapeInstagramPage' prend en charge l'effet post-vieillissement.
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});
Essayez-le ici
Exemple: pour une URL donnée ' https://www.instagram.com/dress_blouse_designer/ ' on peut appeler la fonction
ScrapeInstagramPage ({username : "dress_blouse_designer", debug : false});
Cela fonctionne en utilisant un simple appel ajax et en itérant des chemins d’image.
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>"
);
});
})