jueves, 18 de agosto de 2016

(OBSOLETO) Como encontrar un pokemon que aparece en el radar de Pokemon GO

Como sabreis, hace un tiempo quitaron la funcionalidad de los pasos de la popular aplicación Pokemon GO. Asi que imaginaos que pasaría si os encontrais un pokemon legendario en el radar. ¿Como encontrarlo? ¡Es pura matematica!
Pues bien, es tan sencillo como tener en cuenta que el radar muestra los pokemon en un radio de 200 metros. Cuando excedemos este radio el pokemon desaparece. Y mirad por donde... He  creado una aplicación web que os encontrará a esos pokemon ;)
Podeis acceder en http://juanmv94.tumblr.com/pokemon acordaos de marcar como favorito el enlace en el navegador de vuestro movil.


Los pasos a seguir son:

1.Caminar hasta que el pokemon deje de aparecer en el radar.
2.Introducir nuestra ubicación y dar media vuelta para que vuelva a aparecer.
3.Cuando vuelva a desaparecer, volver a introducir nuestra ubicación.
4.¡El pokemon aparecerá en el radar! (Muestra dos posibles ubicaciones) Ahora solo hay que ir a por él.

lunes, 15 de agosto de 2016

(OBSOLETO) Como ver y descargar todas las fotos de Tuenti en el 2016: Tuenti explorer 1.0

Por fin esta terminada la herramienta que tanto esperabais!
Ya es posible ver y descargar todas nuestras fotos de Tuenti y las de nuestros amigos a 2016 que estamos.
A pesar de que ya no es posible acceder a estas fotos desde la aplicacion movil o desde el navegador, la API (Cosas que nunca entendereis) si permite acceder a estas!!
Por ello he creado una aplicación web que permite verlas.



INSTRUCCIONES:

1. Copiar el siguiente codigo fuente en un fichero nuevo HTML (basicamente es copiarlo todo, pegarlo en el bloc de notas y guardarlo con extension *.htm)

Código fuente eliminado

2. Abrir el fichero con Internet Explorer y pulsar F12 para acceder al modo desarrollador
3. En la pestaña emulación cambiar el User-Agent por el que aparece en la esquina (Mirar imagen). Hecho esto pulsamos en cualquier otra opcion para que IE valide los cambios y ya podemos minimizar si queremos el modo desarrollador ¡Importante no cerrarlo mientras usemos la aplicacion!
4. Introducimos nuestro email y contraseña de Tuenti y pulsamos "obtener sesion"
5. Si todo ha ido correcto, nos saldran unas letras en el recuadro de sesion, si es asi, le damos a acceder.
6. Esperamos a que cargue la lista de amigos. Es importante no tocar nada hasta que termine... ¡YA LO TENEMOS!

Ahora podemos navegar en todas las fotos  de nuestros amigos y ver todas sus fotos etiquetadas, subidas,...
Tenemos una casilla para decidir entre organizar o no las fotos por fechas, y un boton que nos permite al pulsarlo descargar todas las fotos del album que estemos viendo!

En fin, cualquier duda sobre su funcionamiento o sugerencia aqui.
Ya se que la aplicación de por si es fea, pero es lo que pasa cuando quieres hacer una aplicacion muy compleja en 2 dias XD

jueves, 11 de agosto de 2016

(OBSOLETO) Como descargar todas mis fotos de Instagram desde el navegador

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>