sábado, 2 de diciembre de 2017

Frikada del día: SOCKS5->HTTP, navega por la deep web desde IOS/Edge/IE

¿Quien no ha querido nunca navegar por la deep web desde su navegador favorito Internet Explorer?
Tanto IOS, como Edge, como el obsoleto Internet Explorer tienen un problema con los proxys en común, y es que no traen soporte para el protocolo SOCKS5 que es el tipo de proxy que utiliza tor.

Ahora es posible hacerlo gracias a un programa en Java creado por mi, que en unas 160 lineas de código, se conecta a un proxy SOCKS5 (como puede ser tor) y devuelve un proxy HTTP al que nos podemos conectar desde los navegadores de Microsoft o nuestros dispositivos de Apple.

Problema con IOS: Por alguna razon en las ultimas versiones de IOS, cuando intentas acceder a un sitio .onion, en Safari, te muestra un mensaje de que no tienes conexión a internet y el navegador ni se molesta en conectarse a traves del proxy. Se puede navegar anonimamente por el resto de paginas en cualquier caso.
Este problema no ocurre en cambio con mi antiguo Iphone 4 con IOS7.

Actualización:
Tras perder el código fuente original en Java, el cual aun tenía algunos fallos por resolver, he re-escrito el programa en C++ (Más eficiente) con mi librería Jsocket. Podeis encontrar el código fuente y ejecutable para Windows en https://github.com/juanmv94/SOCKS2HTTP.

miércoles, 4 de octubre de 2017

Presentacion de diapositivas (PowerPoint) en 3D desde el navegador

Como de costumbre, vuelvo a sorprenderos con una nueva app. En este caso se trata de una aplicación web (funciona a través del navegador) en la que podréis mostrar vuestras presentaciones de diapositivas PowerPoint en un entorno 3D totalmente personalizable. Ademas, de diapositivas PowerPoint, también se pueden añadir otros elementos como fotos, vídeos, aplicaciones, paginas web,...



De momento no voy a hacer pública la app por ausencia total de interés por parte del publico. Podéis contarme vuestra opinión en los comentarios, y como sería vuestro entorno 3D favorito.

sábado, 30 de septiembre de 2017

Manejando la Raspberry Pi desde un ebook (tinta electronica)

Tenemos una Raspberry Pi conectada por LAN a un router Wifi con un teclado inalambrico y un pendrive conectados al USB (y un altavoz conectado a la salida 3,5mm).
Gracias a shellinabox (https://github.com/shellinabox/shellinabox) podemos crear una terminal accesible desde el navegador integrado del ebook.

Para poder redirigir la entrada del teclado USB a la tty de shellinabox uso un programa de creación propia.

He aquí el resultado. Os muestro la ejecución del reproductor multimedia omxplayer a través de esta interfaz.


viernes, 1 de septiembre de 2017

Un videojuego 3D con tecnologia WebGL: Flappy Adventure 2

Descarga aplicación android aquí.
Windows, IOS, Mac y Linux acceded a versión online aquí.




Solo una semana es lo que he tardado en hacer el juego que tantos deseabais poder jugar. Flappy adventure 2 no solo es el primer videojuego 3D 100% hellinero, sino que es uno de los muy pocos implementados en tecnologia web (La mayoria de los juegos Indie 3D se crean en Unity) Esto significa que podeis jugarlo practicamente en cualquier sitio: PC, Mac, Iphone, Ipad, Android, Linux,...


Ademas dentro de la aplicación web tambien podeis jugar a la ya conocida Aventura de Flappy en su versión 2D la cual he mejorado en su versión 1.2, o jugar a la ya anticuada version GB o al Retro Stack Tower 2017 mediante su emulador de gameboy incluido.

Problemas relativos al lag:
-La velocidad de avance se ve reducida impidiendo pasar el primer nivel. Solucion: multiplicar velocidad x delta en control.js pasando delta como parametro a la funcion update.
-Al caer se puede atravesar el suelo si el lag es muy grande. Solución: RaycasterDown= Math.max(la distancia que flappy baja en el siguiente frame , 10).

Mejoras para touchscreen:

-La sensibilidad de los controles depende de la resolucion de la pantalla. Solución: usar ScreenHeight como referencia.
-Camara podría estar quieta al desplazar el dedo a una posicion (2º cuadrado). Solucion: actualizar posicion touchstart a la actual en cada update. (En Galaxy S8 funciona bien, vaya misterio)

Otros:

-Mirar si se puede arreglar spawn inicial.

Si experimentais problemas y teneis especial interes en una version 1.0.1 hacedmelo saber.


Actualización 1 aniversario de Flappy Adventure 2
Para celebrar el 1 aniversario de Flappy Adventure 2, aparte de solucionar la mayoría de los problemas apuntados anteriormente, he implementado la versión VR (Virtual Reality) del juego. Esta versión era mi principal intención cuando decidí hacer FA2, y que lamentablemente tuve que descartar por varios motivos:

  • No tenia gafas VR. Hace un año eran caras, la mayoría eran de cartón, y habría supuesto que mi juego no llegase a ningún publico.
  • Era novato usando WebGL y Three.js y solo me faltaba complicarme aun más la vida con FA2 (El cual quería tener hecho en menos de una semana)
  • No tenía de idea de como poder controlar a Flappy sin poder tocar la pantalla tactil.
Tras abrir el código por primera vez desde 1 año del lanzamiento, me quedé sorprendido de que no tuviera mas fallos. Era la primera vez que usaba Three.js y que desarrollaba un juego en 3D (Ademas con prisas). Arreglé los fallos que pude, e implementé la versión VR sin preocuparme demasiado en dejar el código bonito.

¿Como solucioné el problema del controlador?
Para controlar a Flappy finalmente se me ocurrió poder utilizar un dispositivo móvil auxiliar como controlador y que mediante Websockets se comunicaran con un servidor Java (también creado por mi).

Dudo mucho que nadie quiera probar Flappy Adventure 2 VR así que os adjunto el vídeo y vais sobraos.

sábado, 8 de julio de 2017

Mod-Emulación

No hace falta que busqueis la palabra en Google, lo mas probable es que no salga nada.
Se trata de un nuevo concepto que un día se me ocurrió y que consiste en lo siguiente:
¿Por que no modificar el código fuente de un emulador para que actúe de forma especial en ciertas rutinas de un videojuego? El objetivo de esto será mejorar la jugabilidad y apariencia anteriormente limitada por el hardware de la consola.



Podemos mostrar cuadros de dialogo, mostrar graficos mejorados, sonidos mejorados, interfaz touchscreen... Todo esto sin modificar el ROM del juego.
En el siguiente video podeis ver un ejemplo de mod-emulación que hice para el juego de "Pokemon Gold".

Aunque de momento casi todo es conceptual, pueden existir infinidad de tipos de mod-emulación:

-Mod-emulación grafica: Altera los graficos sin afectar a la jugabilidad.
-Mod-emulación sonido: Altera el sonido o música del juego sin afectar a la jugabilidad.
-Mod-emulación interfaz: Permite utilizar interfaces como touchscreens.
-Mod-emulación avanzada: Afecta a la jugabilidad (Ej: video).


Tambien se pueden diferenciar por la forma en la que se ejecutan los mods:

-CPU: Por ejemplo en una determinada llamada a procedimiento del ROM (Ej: video).
-RAM: Por ejemplo cuando la VRAM o un cierto byte de la RAM tenga un valor. (mas fáciles de implementar).

Como siempre me gustaría que comentaseis para dar vuestra opinión al respecto. ¿Creeis que la mod-emulación es una buena idea o estropea el concepto de retro-gaming?

domingo, 2 de julio de 2017

Frikada del verano: Tower Stack en Gameboy Color??


DESCARGA ROM -> AQUÍ

Terminan los examenes, comienza el verano y como viene siendo tradición me apetece hacer un nuevo juego retro para gameboy.
Esta vez, uno de los juegos de moda (seguido de flappy bird, 2048...) se llama Stack Tower, en el que vas haciendo caer de forma alineada plataformas en 3D que se van haciendo cada vez mas pequeñas.

¿¡Pero como voy a hacer un juego 3D en una consola cuyas capacidades graficas eran... Bueno...
Y es que la Gameboy y la Gameboy color son consolas con graficos basados en tiles con un único background sin escalado ni rotación, y que de forma resumida estan limitadas a un 2D bastante basico.
La cuestión es que como soy friki ingeniero informatico me pongo a diseñar un "motor grafico" para Gameboy que permita crear tiles de forma dinamica via software con los bloques 3D renderizados mediante unas rutinas software. Algo nunca visto. Estoy loco, sí.
Y sí... ¡funcionó! no me digais que no me ha quedado bonico.

No lo hice para Gameboy Original por dos motivos:
  • Aunque funciona, la potencia de la CPU en la Gameboy original se queda escasa.
  • En blanco y negro el juego queda bastante feo.
Como os habreis fijado, el contador de puntos tiene antialiasing, lo cual tampoco se habia visto hasta ahora en Gameboy.
Y este es el resultado :') ayy que lloro... Ahora solo me falta ponerle una imagen de portada bien fea.


Los bloques se imprimen por dos lados:

  • El bloque en movimiento, se dibuja en los sprites. Como sabreis (o no) hay un límite de 10 sprites por scanline, son solo 40 y pueden tener un tamaño de 8x8px o 8x16px. Para dibujar los bloques lo mas grandes posibles, alineo todos los sprites en modo 8x16 px en un único "objeto" de 10x4 sprites. ¡Apuro los límites tecnicos al maximo!
  • Los bloques ya colocados se dibujan en el background. Mi "motor grafico" se encarga de dibujar unos encima de otros y de actualizar el tilemap de forma dinamica.

sábado, 6 de mayo de 2017

J-Music: la aplicación de música para Android (Soporte finalizado)

¡Descarga APK haciendo clic aquí!

Ya esta disponible para Android la app que tantos me habíais pedido, y que tanto retraso ha tenido su lanzamiento: J-Music

Esta aplicación permite:
-Escuchar canciones de Youtube descargando solo el audio. ¡Ideal para ahorrar datos moviles!
-Descargar las canciones en formato MP3
-Explorar las canciones buscando ya sea el cantante o nombre de la canción

La aplicación esta desarrollada con PhoneGap, por lo que el codigo fuente se encuentra dentro del propio APK para los curiosos. Ademas, ¡no tiene publicidad!

La aplicación, a pesar de que los conversores Youtube-MP3 son legales de momento (siempre que sea únicamente para uso personal) no estaría aprobada para la Play Store (ya que es de Google) por lo que descargar el APK desde aquí es la única manera de instalarla. Recordad que podeis comentar aqui si tenéis alguna duda.

En caso de producirse un mínimo problema legal por parte de la aplicación, esta sera retirada de inmediato del blog.

Es posible que la aplicación no sea totalmente compatible en versiones antiguas de Android aunque siempre deje instalarla.


lunes, 1 de mayo de 2017

DInput key switcher. Personaliza el teclado en tus videojuegos.

Descarga el proyecto haciendo click aquí.
¿Quien no ha jugado nunca al Rayman 2 y no ha deseado poder cambiar los controles? Algunos videojuegos (sobre todo los que tienen ya tiempo) no permitían re-mapear las teclas de ningún modo, y no siempre era sencillo hackearlos para cambiar los controles. El videojuego anteriormente mencionado NUNCA vio una forma de cambiar los controles de teclado.

Esto se acabo... Gracias a mi como de costumbre.
Con mi nueva aplicación podréis generar un fichero DINPUT.DLL "hackeado" que al copiarse al directorio donde tenéis instalado vuestro juego cambiará vuestros controles de teclado a los que vosotros queráis.

De momento solo tiene versión de 64 bits, aunque si alguno por casualidad estuviese interesado en una versión de 32 bits, decidmelo, y me plantearía portarla a 32 bits.

Edición: Codigo fuente disponible a peticion de "Rayman Pirate Community"

Algunos juegos donde funciona dinput.dll:

-Rayman 2
-DosBox
-.....

Algunos juegos donde funciona dinput8.dll:

-Rayman 3
-Crazy Taxi
-.....

¡Sugerid mas juegos!

jueves, 20 de abril de 2017

(OBSOLETO) Vulnerabilidad de phishing en Chrome y Firefox

Demostración aquí.

¡Hola a todos!
Aunque tengo esto un poco abandonado por motivos académicos, quería escribiros un post sobre una vulnerabilidad presente en Google Chrome y Firefox (entre otros navegadores), y que hasta que se solucione, puede ser un gran problema a la hora de seguir cualquier enlace desde el PC. Estos enlaces por lo general se mostrarán como seguros a pesar de ser paginas totalmente diferentes.


Se trata de ataques phishing basadas en direcciones Unicode, y es que los navegadores implementan esta funcionalidad Unicode para que puedan haber direcciones web con caracteres chinos, por ejemplo.

El problema es que mediante estos caracteres podemos suplantar sitios web. Aunque se ha puesto de moda el ejemplo de apple.com (aquí) lo cierto es que tambien se pueden aplicar a paginas tipo Tumblr o Blogspot donde nuestro nombre pueda ir al principio de la URL, llegando a reemplazar incluso a "www" (Como en mi ejemplo de arriba)

Os animo a los usuarios de PC a que hagais click en el enlace que hay puesto al principio y me digais si podeis diferenciar la pagina de Tumblr real de la falsa.

sábado, 25 de febrero de 2017

Crear fotos con emojis

Seguro que mas de uno ya conocía alguna pagina web para convertir imagenes a caracteres ASCII.

Esto tuvo cierta popularidad hace tiempo.

Ahora en la epoca del Whatsapp donde lo que esta de moda son los emojis me pregunté... ¿Existe alguna pagina para convertir una imagen a emojis? Como vi que no, decidi crear una yo mismo.  La comparto con vosotros:
Enlace Versión nueva (2019)
Enlace versión antigua

Si teneis algun comentario o duda sobre su funcionamiento comentad abajo.

Si os gustan las chorradas con emojis, probad también Lovewords.


sábado, 18 de febrero de 2017

Descargar canciones de Youtube con la maxima calidad posible (audio nativo sin recodificar)

Como sabéis existen gran cantidad de paginas web que permiten descargar las canciones de los vídeos de Youtube en formato MP3.
Partiendo de que la calidad de audio de Youtube es bastante baja de por si, al recodificarlo a MP3 se pierde aun mas calidad*, por lo que no hace falta ser un audiofilo para darse cuenta incluso con unos auriculares básicos.
Muchas veces el MP3 llega a ocupar bastante y la velocidad de descarga en estos sitios suele ser baja.

¿Cual es la alternativa? Descargar el audio en formato nativo. Esto se puede hacer mediante youtube-dl.

Para los usuarios de Windows os adjunto un archivo *.zip que podeis extraer en una carpeta con los binarios y unos pequeños scripts *.bat que os simplificará el proceso:
Descarga aquí.

Solo hay que abrir los *.bat y pegar la URL del vídeo (ej: https://www.youtube.com/watch?v=uh6TKlo_BFM) o el ID del vídeo (uh6TKlo_BFM). ¡Veréis que la descarga va rapidísima!

Los vídeos de Youtube se pueden descargargar en distintos formatos de audio nativo cada uno: AAC, OGG Vorbis, y en la maxima calidad OPUS**

-Para reproducir en moviles android podeis usar OGG
-Para reproducir con Windows Media, y Itunes/IOS usad AAC
-Si vuestra intención es reproducirlo con VLC en el ordenador, usad el script de maxima calidad

Si han pasado meses desde que escribí este post, y veis que ya no funciona actualizad a la ultima version de youtube-dl con actualizar.bat.

No todos los videos tienen disponibles todos los formatos. Si por ejemplo un video no esta disponible en OGG probad la descarga en AAC.

* Os recomiendo mi post sobre como detectar MP3 recodificado
** Os recomiendo mi post comparativa de distintos formatos de audio

domingo, 8 de enero de 2017

Experimentos con la Raspberry Pi

¡¡Feliz año nuevo followers!!
En esta ocasión como no se me ocurre nada que publicar, os pongo dos experimentos recientes que hice recientemente con mi Raspberry Pi a ver si os inspiran.

El primero se trata de un ejemplo de Domotica muy simple, en el que creamos un portal web con PHP desde el cual podemos hacer cosas como abrir la puerta del garaje desde un ordenador o un telefono movil ¿Quien necesita llevar el mando encima?



El segundo se trata de la modificación del código fuente de un videojuego para que actue con los GPIO, pudiendo hacer cosas como añadir un segundo display, aunque se podría hacer que activasen motores, encendiesen bombillas, y mas cosas dependiendo de lo que ocurre en el videojuego. ¿Se os ocurren ideas? Bajad el volumen cuando pongais el video :')


sábado, 7 de enero de 2017

Bots: resolviendo los re-capchas: human-tunnel by Juanmv94

Antes cuando los captchas eran simples textos deformados con lineas pintadas por encima no era demasiado complicado mediante OCR obtener una determinada tasa de acierto resolviendo los catchas en los bots.

Ahora con la tecnología re-captcha de Google, implementada en muchísimos sitios esta tarea es casi imposible, ya que las técnicas de visión artificial aunque han avanzado mucho estos últimos años, siguen siendo insuficientes para la complejidad que este tipo de capchas presentan.

Nos podríamos calentar la cabeza haciendo unos algoritmos de visión artificial super avanzados... O podríamos resolver este problema de una forma sencilla, eficiente, y que nadie se esperaba. Como dijo Bill Gates: “Siempre escojeré a un vago para hacer un trabajo difícil… porque, encontrará una manera sencilla de hacerlo”


Pues bien: tenemos un servicio (pagina) web con usuarios que pueden registrarse, loguearse, interactuar,... Y aparte tenemos nuestro bot encargado de hacer alguna función repetitiva (buscar en Google, registrar cuentas, publicar comentarios,...) que puede estar o no relacionada con nuestra web.

Cuando a nuestro bot le aparezca un captcha, solo tendremos que enviar ese captcha a la primera persona de nuestra web que vaya a hacer algo, ya sea registrarse, loguearse, o cualquier otra actividad (esta decisión dependerá de la cantidad de actividad de nuestra web en proporcion con la del bot). ¡Esa persona lo resolverá por nosotros! Aparte le daremos mayor seguridad a nuestra web de una forma gratuita.

La forma de hacerlo sería algo así: 
-Nuestro servidor establece una conexion HTTPS con re-capcha y le mostramos al usuario ese mismo re-capcha desde nuestra web, (normalmente tambien desde HTTPS) creando una conexion parecida a un proxy en la que nuestro servidor hace un man-in-the-middle.
-Cuando el usuario resuelva correctamente el captcha (A veces puede darse el caso de que lo fallase) nuestro servidor que intercepta la comunicación lo sabrá, permitiendole acceso al usuario, y continuando la ejecución del bot.

De momento es solo un concepto, que no debería ser muy dificil de implementar.
Comentad cualquier duda que tengáis, comentario, o agradecimiento.

martes, 13 de diciembre de 2016

Problema de informatica para pensar (pero sin pasarse): El fichero "llave"

En esta ocasión os quería traer otro problema en este caso mucho mas sencillo que el anterior.

Venga chicos, ¡a por el premio! ;) Espero vuestras respuestas en los comentarios

En la empresa "Soluciones informaticas de Tedelche SA" Tienen en mente un proyecto importantisimo, contenido en 2 PDFs totalmente distintos de 20mb cada uno.

No obtante ocurre que algunos empleados solo tienen el PDF 1, y otros solo tienen el PDF 2 y necesitan tener los dos. El director decide mandarles a todos el PDF que no tienen en un correo que será el mismo para todos. En este correo, que tiene un limite de 21mb el director adjunta un fichero "llave" de 20mb y un EXE de muy pocas Kilobytes.

-Los empleados que tienen el PDF 1 abren el EXE introduciendo el fichero "llave" y el PDF 1 y... ¡les aparece el PDF 2!

-Los empleados que tienen el PDF 2 abren el EXE introduciendo el fichero "llave" y el PDF 2 y... ¡les aparece el PDF 1!

Los empleados, que no entienden mucho de informatica/matematicas/ciencia creen que es magia, ¿Que hace el pequeño EXE en realidad?

martes, 29 de noviembre de 2016

Web 3D - El futuro de las paginas web moviles

Todos nos hemos fijado que muchas paginas web tienen su propia adaptación para dispositivos moviles en las que el texto sale mas grande, los botones son mas vistosos...

La cuestión es que algo que permite HTML5 y que apenas se utiliza actualmente es el uso de los acelerometros que detectan la inclinación del dispositivo. Esto permitiría hacer paginas web con efectos como los que traen muchos fondos de pantalla "dinamicos" que nos vienen con el movil y que cambian conforme a la inclinación.

En el caso de las paginas web permitirían hacer que los elementos varíen levemente de posición al mover el dispositivo dando una sensación 3D.
En el mes de Octubre realicé una demo en la que mi pagina web te daba distintas "frases diarias" en un cuadrado que variaba de posición al inclinar el dispositivo, a lo que llamé Web 3D.

Teneis el enlace aquí.
Teneis otra demo para enviar en San Valentin aquí.

Ademas os comento que hacer una pagina web que de frases diarias que cambien cada vez que accedes a la pagina es un ejemplo sencillísimo de cosas que se pueden hacer en Javascript sin necesidad de apenas experiencia y que si alguno tiene alguna idea parecida y no sabe como empezar a hacerlo me puede preguntar.

Otras cosas que permite HTML5 y que apenas se usan en web son:
- Detectar nivel de batería del dispositivo
- Localización GPS en tiempo real

En realidad, cualquier pagina web puede perfectamente hacer estadisticas sobre la inclinación de nuestro dispositivo y de nuestro nivel de batería. En el caso de la localización GPS nos saldrá un aviso de si queremos autorizar la web a usar la ubicación, al que podremos decir que no.

¿Que pensais de todo esto? comentad ;)

sábado, 5 de noviembre de 2016

Problema de matematicas: El chip del Bonillo

Bueno chic@s, esta vez quería cambiar el tema en el que se centra mi blog y proponeros un problema de matemáticas que yo inventé recientemente que os pondrá a prueba, y que seguramente ninguno de vosotros resolverá :') Así que... ejejem...

En la nación/república independiente del Bonillo (Albacete) han decidido implementar por primera vez su propio DNI Electrónico, que permitirá mediante unos pines metálicos obtener un ID único para cada DNI.
El problema es que en el Bonillo no tienen ni idea de electrónica, como era de esperar, así que deciden implementarlo conectando los pines entre si directamente, y creando así distintas combinaciones.
Como veis en la imagen, con 3 pines se pueden obtener 5 combinaciones distintas, y con 4 pines 15 combinaciones.

A partir de 8 pines ya es posible tener al menos una combinación por habitante del Bonillo, pero... ¿Cuantas combinaciones son? O mejor dicho... ¿Como se calculan? (Sin fuerza bruta ehhh)

Si no os sale (lo mas probable) teneis la solución en PDF aquí.
Ademas podeis calcular las distintas soluciones del problema desde vuestro navegador gracias a mi implementación en Javascript aquí:

Introduzca numero de pines: 






FAQ:
P: ¿Quien inventó el problema?
R: Yo.

P: ¿Funcionaría en la vida real?
R: Tecnicamente sí, pero para ello sería necesario altos niveles de aburrimiento.



P: ¡Guapo!
R: Grasia.

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>

jueves, 23 de junio de 2016

CPU-Grabbers: La proxima amenaza en Internet. Codificar MP3 y enviarlo de vuelta en background con javascript

Descarga prototipo aquí.
Virus, ventanas emergentes,... Hay muchos elementos en la web que nos dificultan la navegación. Pero ¿Que es lo siguiente que aparecerá?

Tecnologias como asm.js que permiten ejecutar javascript a velocidad casi nativa, o a compiladores como Emscripten que permiten compilar javascript a partir de codigo C o C++, javascript se esta convirtiendo en el lenguaje de programación multiplataforma del futuro.

Y aqui es cuando yo planteo un concepto... ¿Y si utilizamos la potencia de javascript en nuestra pagina web para que los usuarios que accedan nos realicen tareas computacionales complejas mientras visualizan con normalidad la pagina y conforme los calculan nos lo vayan enviando de forma transparente?

Esta idea que planteo nos evitaría el costo que tendría por ejemplo el uso de super-computadores, a la vez que al usuario le aumenta el uso de CPU y por lo tanto el consumo de energía de su dispositivo.

¿Os imaginais a paginas web con millones de usuarios como Google, Twitter,... Poniendo en practica esta idea para desencriptar claves AES por fuerza bruta en muy poco tiempo?

Mi prototipo:
Aunque descifrar claves sea probablemente uno de las mayores utilidades de mi concepto de CPU-Grabber, en mi prototipo vamos a un caso mucho mas basico: Codificar de PCM a MP3.
Para ello utilizo la librería liblame.js obtenida desde github. Esta no esta optimizada para javascript, pero para un simple prototipo nos sobra.
En el prototipo teneis adjunto el servidor http "miniweb" junto a la libreria libLame.js y el resto de archivos del prototipo, incluyendo un "index.html"

Accediendo al contenido de este servidor web desde por ejemplo, un ordenador o un Iphone sin jailbreak, el dispositivo descarga audios WAV aleatorios de la carpeta "wav" que no se haya codificado aun (Comprobandolo previamente), lo codificará en MP3, y una vez hecho esto, enviará el MP3 resultante al servidor con un POST el cual nos colocara en la carpeta "mp3". Una vez hecho esto, volveremos a coger otro audio aleatorio que no se haya codificado aun, así hasta que cerremos el navegador, o no queden archivos sin codificar en nuestro servidor.

El motivo por el que se selecciona un audio aleatorio, es porque perfectamente podemos tener varios dispositivos conectados a nuestra web a la vez, cada uno codificando audios distintos simultaneamente.

Notas del prototipo:

-Hay dos modos accesibles desde index.html. El modo debug que muestra en todo momento lo que hace el javascript, y el modo poison que muestra una pagina web (politica de privacidad de ask.fm) infectada con poison.js y por lo tanto ¡codificando para nosotros MP3 sin que el usuario se entere!

-En las capturas muestro el tiempo que tardan distintos dispositivos en codificar audios (Distintos a los audios adjuntos) en el modo debug

-Acordaos que podeis insertar vuestros propios archivos "wav". Debeis establecer en index.html o poison.js (depende la demo que esteis usando) el numero de pista mas pequeño y el mas grande de vuestros archivos wav.