Bueno pues resulta que un dia quise guardar todas mis fotos (y videos) que tenía subidas a Instagram en el PC, y vi que mas allá de aplicaciones para el movil en las que introduces tu contraseña de Insta no habia nada que me pudiese ayudar.
Lo cierto es que tu puedes acceder a cualquier foto de un perfil publico en el navegador, asi que pense... ¿Y porque no hago una aplicacion JavaScript que acceda a un perfil publico y descargue a maxima resolucion todas las fotos y videos?
¡Y eso hice! Podeis descargar mi aplicacion HTML copiando el texto de abajo y pegandolo en un nuevo archivo HTML.
¿Y por que no lo pongo como widget en el blog? Lo cierto es que al conectarme a un host remoto como es www.instagram.com me surge un gran impedimento... Y es que JavaScript no permite mandar peticiones web a host distintos a donde se encuentra el script. Por eso para que funcione solo hay dos alternativas: Que el script este presente en instagram.com (lo veo muy poco probable) o abrir el HTML guardado en nuestro equipo (Y esto ultimo no funciona en todos los navegadores, aunque al menos en Internet Explorer funciona).
Tenía pensado hacer una extension de Chrome para poder ejecutar el script desde el host de instagram.com y que asi funcionase en Chrome, pero sabiendo el exito que va a tener... Aun siendo una tarea muy simple ni me molesto en hacerlo XD
Resumen del funcionamiento:
-Obtiene los enlaces a todas nuestras fotos y videos obteniendo los metadatos (fecha de subida, tipo)
-Descarga una por una las fotos y videos, dandoles por nombre la fecha de subida
-Gracias a JSZip empaquetamos todas las fotos en un único .zip sin compresión.
Pero bueno, si teneis alguna duda sobre su uso o funcionamiento no dudeis en comentar.
<html>
<body>
<div>
<b>Descargar todas mis fotos y videos de Instagram</b><br><br>
Usuario:
<input type="text" id="texto" text="Introduce usuario" size="16" />
<input type="submit" value="Descargar" onclick="ejecutar()"/>
</div>
<br>
<div id="instagram"></div>
<script src="https://stuk.github.io/jszip/dist/jszip.js"></script>
<script src="https://stuk.github.io/jszip/vendor/FileSaver.js"></script>
<script>
var isIE8 = window.XDomainRequest ? true : false;
var invocation = createCrossDomainRequest();
function createCrossDomainRequest(url, handler) {
var request;
if (isIE8) {
request = new window.XDomainRequest();
}
else {
request = new XMLHttpRequest();
}
return request;
}
function callOtherDomain(url,funcion) {
if (invocation) {
if(isIE8) {
invocation.onload = outputResult;
invocation.open("GET", url, true);
invocation.overrideMimeType("text/plain; charset=x-user-defined");
invocation.send();
}
else {
invocation.open('GET', url, true);
invocation.overrideMimeType("text/plain; charset=x-user-defined");
responseType = "arraybuffer";
invocation.onreadystatechange = handler;
invocation.send();
}
}
else {
var text = "No Invocation TookPlace At All";
var textNode = document.createTextNode(text);
var textDiv = document.getElementById("textDiv");
textDiv.appendChild(textNode);
}
}
function handler(evtXHR) {
if (invocation.readyState == 4)
{
if (invocation.status == 200) {
funcion(invocation.response);
}
else {
alert("No se puede encontrar el usuario o no se ha podido conectar remotamente a www.instagram.com recuerde usar Internet Explorer");
}
}
}
</script>
<script>
var funcion;
var nombres=new Array();
var archivos=new Array();
var tipo=new Array();
var i,progreso=0;
var zip = new JSZip();
function dos(num)
{
if (num<10) return "0".concat(num);
else return num;
}
function ejecutar(){
var user=document.getElementById("texto").value;
funcion= function(a) {
var con = JSON.parse(a);
document.getElementById("instagram").innerHTML = "Buscando contenido: "+nombres.length+" fotos/videos encontrados...";
for (i=0;i<con.items.length;i++) {
tipo.push(con.items[i].type);
nombres.push(con.items[i].created_time);
if (con.items[i].type == "image"){
archivos.push(con.items[i].images.standard_resolution.url);
}
else
archivos.push(con.items[i].videos.standard_resolution.url);
}
if(con.more_available)
{
callOtherDomain("https://www.instagram.com/juanmv94/media/?max_id="+con.items[con.items.length-1].id);
}
else {
i=0;
funcion= function(a) {
var it;
var archivo= new Array();
var d = new Date(parseInt(nombres[i])*1000);
var nombre=d.getFullYear()+"-"+dos((d.getMonth()+1))+"-"+dos(d.getDate())+" "+dos(d.getHours())+"."+dos(d.getMinutes())+"."+dos(d.getSeconds());
if (tipo[i]=="image") nombre=nombre.concat(".jpg");
else nombre=nombre.concat(".mp4");
for (it=0;it<a.length;it++) archivo.push(a.charCodeAt(it));
zip.file(nombre, archivo);
i++;
document.getElementById("instagram").innerHTML = "Descargando fotos y videos: "+i+"/"+nombres.length;
if (i==nombres.length)
{
zip.generateAsync({type:"blob"})
.then(function(content) {
// see FileSaver.js
saveAs(content, user+".zip");
});
}
else callOtherDomain(archivos[i]);
}
callOtherDomain(archivos[0]);
}
}
callOtherDomain("https://www.instagram.com/"+user+"/media/");
}
</script>
</body>
</html>