instagram - truco - hashtag
¿Cómo puedo obtener los medios de un usuario de Instagram sin autenticarme como usuario? (17)
Intento poner los medios recientes de Instagram de un usuario en una barra lateral. Intento usar la API de Instagram para buscar los medios.
http://instagram.com/developer/endpoints/users/
La documentación dice que OBTENGA https://api.instagram.com/v1/users/<user-id>/media/recent/
, pero dice que debe pasar un token de acceso OAuth. Un token de acceso representa la autorización para actuar en nombre de un usuario. No deseo que los usuarios inicien sesión en Instagram para ver esto en la barra lateral. Ni siquiera deberían necesitar tener una cuenta de Instagram.
Por ejemplo, puedo ir a http://instagram.com/thebrainscoop sin haber iniciado sesión en Instagram y ver fotos. Quiero hacer eso a través de la API.
En la API de Instagram, las solicitudes no autenticadas por el usuario pasan un client_id
lugar de un access_token
. Si intento eso, sin embargo, obtengo:
{
"meta":{
"error_type":"OAuthParameterException",
"code":400,
"error_message":"/"access_token/" URL parameter missing. This OAuth request requires an /"access_token/" URL parameter."
}
}
Entonces, ¿esto no es posible? ¿No hay forma de buscar los últimos medios (públicos) de un usuario sin pedirle a un usuario que primero inicie sesión en una cuenta de Instagram a través de OAuth?
Aquí hay una solución de rieles. Es una especie de puerta trasera, que en realidad es la puerta de entrada.
# 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
El objeto que obtienes varía dependiendo de si es una búsqueda de usuario o una búsqueda de etiqueta. Obtengo los datos de esta manera:
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
Luego obtengo otra página de resultados construyendo una url de la siguiente manera:
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''
Bueno, como /?__a=1
dejó de funcionar por ahora, es mejor usar curl y analizar la página de instagram tal como está escrita en esta respuesta: ¿ Generar acceso token API de Instagram, sin tener que iniciar sesión?
El código del nodoj siguiente raspa las imágenes populares de una página de Instagram. La función ''ScrapeInstagramPage'' se encarga del efecto post envejecimiento.
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});
Pruébalo here
Ejemplo: para una URL dada '' https://www.instagram.com/dress_blouse_designer/ '' se puede llamar a una función
ScrapeInstagramPage ({username : "dress_blouse_designer", debug : false});
Esto es tarde, pero vale la pena si ayuda a alguien ya que no lo vi en la documentación de Instagram.
Para realizar GET en https://api.instagram.com/v1/users/<user-id>/media/recent/
(en este momento de redacción), en realidad no necesita el token de acceso de OAuth.
Puede realizar https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]
[CLIENT ID] sería un ID de cliente válido registrado en la aplicación a través de clientes de administración (no relacionado con el usuario en absoluto). Puede obtener [USER ID] del nombre de usuario al realizar la solicitud de búsqueda de usuarios GET: https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]
Esto funciona usando una simple llamada ajax e iterando rutas de imagen.
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>"
);
});
})
Gracias al siempre cambiante (y horripilantemente diseñado) esquema de API de Instagram, la mayoría de los anteriores ya no funcionarán a partir de abril de 2018.
Esta es la última ruta para acceder a datos de publicaciones individuales si consulta su API directamente utilizando el https://www.instagram.com/username/?__a=1
método.
Suponiendo que sus datos JSON
devueltos sean $data
, puede recorrer cada resultado usando los siguientes ejemplos de ruta:
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 ....
}
Las principales cosas en este cambio reciente fueron graphql
y edge_owner_to_timeline_media
.
Parece que van a estar matando este acceso API para clientes que no son de negocios en DEC 2018, así que aproveche al máximo mientras pueda.
Espero que ayude a alguien;)
La API de Instagram requiere autenticación de usuario a través de OAuth para acceder al punto final multimedia más reciente para un usuario. No parece haber otra forma ahora de obtener todos los medios para un usuario.
Pude obtener los medios más recientes de un usuario utilizando la siguiente API sin autenticación (incluida la descripción, Me gusta, recuento de comentarios).
https://www.instagram.com/apple/?__a=1
P.ej
https://www.instagram.com/{username}/?__a=1
Si está buscando una manera de generar un token de acceso para usar en una sola cuenta, puede intentar esto -> https://coderwall.com/p/cfgneq .
Necesitaba una forma de usar la API de Instagram para obtener todos los medios más recientes para una cuenta en particular.
Si omite Oauth, probablemente no sabrá qué usuario de instagram es. Dicho esto, hay algunas maneras de obtener imágenes de Instagram sin autenticación.
La API de Instagram le permite ver las imágenes más populares de un usuario sin autenticarse. Usando el siguiente punto final: Aquí está el enlace
Instagram proporciona rss feeds para etiquetas en this .
Las páginas de usuario de Instagram son públicas, por lo que puede usar PHP con CURL para obtener su página y un analizador DOM para buscar las etiquetas de imagen que desee en html.
Solo quiero agregar a @ 350D respuesta, ya que fue difícil para mí entender.
Mi lógica en el código es la siguiente:
Al llamar a la API por primera vez, solo llamo a https://www.instagram.com/_vull_ /media/
. Cuando recibo respuesta, compruebo el valor booleano de more_available
. Si es cierto, obtengo la última foto de la matriz, obtengo su ID y luego llamo a API de Instagram nuevamente, pero esta vez https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433
.
Algo importante que debe saber aquí, este Id es el ID de la última imagen de la matriz. Por lo tanto, cuando solicite maxId con la última identificación de la imagen en la matriz, obtendrá las siguientes 20 imágenes, y así sucesivamente.
Espero que esto aclare las cosas.
Un truco más, buscar fotos por hashtags:
GET https://www.instagram.com/graphql/query/?query_hash=3e7706b09c6184d5eafd8b032dbcf487&variables={"tag_name":"nature","first":25,"after":""}
Dónde:
query_hash
- valor permanente (creo que su hash de 17888483320059182, se puede cambiar en el futuro)
tag_name
: el título habla por sí mismo
first
: cantidad de elementos para obtener (no sé por qué, pero este valor no funciona como se esperaba.) El número real de fotos devueltas es ligeramente mayor que el valor multiplicado por 4.5 (alrededor de 110 para el valor 25 y aproximadamente 460 para el valor 100))
ID after
del último elemento si desea obtener elementos de ese ID. El valor de end_cursor
de la respuesta JSON se puede usar aquí.
$(document).ready(function(){
var username = "hadidapp";
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);
}
});
});
});
muestra de trabajo
11.11.2017
Dado que Instagram cambió la forma en que brindan estos datos, ninguno de los métodos anteriores funciona hoy en día. Esta es la nueva forma de obtener los medios del usuario:
OBTENGA https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
Dónde:
query_id
- valor permanente: 17888483320059182 (tenga en cuenta que podría cambiarse en el futuro).
id
- id del usuario. Puede venir con una lista de usuarios. Para obtener la lista de usuarios, puede usar la siguiente solicitud: GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first
: cantidad de elementos para obtener.
ID after
del último elemento si desea obtener elementos de ese ID.
A partir de la semana pasada, Instagram disabled /media/
urls, implementé una solución, que funciona bastante bien por ahora.
Para resolver los problemas de todos en este hilo, escribí esto: https://github.com/whizzzkid/instagram-reverse-proxy
Proporciona todos los datos públicos de Instagram utilizando los siguientes puntos finales:
Obtener los medios del usuario:
https://igapi.ga/<username>/media
e.g.: https://igapi.ga/whizzzkid/media
Obtenga los medios del usuario con límite de conteo:
https://igapi.ga/<username>/media?count=N // 1 < N < 20
e.g.: https://igapi.ga/whizzzkid/media?count=5
Use JSONP:
https://igapi.ga/<username>/media?callback=foo
e.g.: https://igapi.ga/whizzzkid/media?callback=bar
La API proxy también agrega las URL de la página siguiente y de la página anterior a la respuesta, por lo que no es necesario que la calcule al final.
Espero que les guste!
Gracias a @ 350D por detectar esto :)
Actualizar
Este método ya no funciona
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;
}
var name = "smena8m",
items;
$.getJSON("https://query.yahooapis.com/v1/public/yql", {
q: "select * from json where url=''https://www.instagram.com/" + name + "/?__a=1''",
format: "json",
_: name
}, function(data) {
console.log(data);
if (data.query.results) {
items = data.query.results.json.user.media.nodes;
$.each(items, function(n, item) {
$(''body'').append(
$(''<a/>'', {
href: ''https://www.instagram.com/p/''+item.code,
target: ''_blank''
}).css({
backgroundImage: ''url('' + item.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>
Puede descargar cualquier feed de fotos de usuario de Instagram en formato JSON usando ?__a=1
junto a la dirección de la página de destino como esta . No es necesario obtener el ID de usuario ni registrar una aplicación, ni tokens, ni oAuth.
min_id
variables min_id
y max_id
se pueden usar para la paginación, aquí está el example
YQL
posible que YQL
no funcione aquí dentro del iframe recortado, por lo que siempre puede verificarlo manualmente en YQL Console