miércoles, 14 de febrero de 2018

Scripts de geolocalización en Python

Buenas a todos, hoy os voy a hablar de como podemos montarnos unos script de geolocalización haciendo uso de los datos de los usuarios que almacena Google en sus BBDD, si si, habéis leido bien, vamos a usar los datos de geolocalización que todos y cada uno de nosotros le damos a Google cada vez que llevamos nuestros teléfonos móviles en el bolsillo.

Introducción

Seguramente hayas utilizado Google Maps en alguna ocasión y te habrás dado cuenta que este funciona incluso sin tener activo el GPS, ¿cómo es posible que sepan nuestra posición sin GPS? pues muy sencillo, existen otras posibilidades para localizar a una persona sin hacer uso del GPS, estas son las torres de telefonía a las cuales se van conectando nuestros dispositivos o los puntos de acceso que tenemos a nuestro alrededor, los cuales es capaz de alcanzar nuestro teléfono.

No se si habéis leido alguna vez la Política de Privacidad de Google Location Services, seguramente que si. Os lo pongo para que sepáis que información cedemos a google por usar estos servicios:

"Si permite que un sitio Web obtenga su ubicación a través de este servicio, nosotros recogeremos la información en función de las características de su dispositivo: la información sobre los routers inalámbricos cerca de usted, el ID del móvil de las torres de telefonía más próximas, y la intensidad de tu wifi o la señal de celular. Esta información se utiliza para devolver una ubicación estimada al navegador que la solicita. Además en cada solicitud recopilamos también la dirección IP, el User-Agent y el ID único de su cliente. Esta información se utiliza para diferenciar las solicitudes, no para identificarlo."



Este "ID único de cliente" es un token que tienen cada uno de nuestros navegadores a la hora de instalarlos y que nos identifica como usuarios o como Google dice, "para diferenciar las solicitudes" (y esto hay que creérselo)

Pues bien, toda esta información que recopila Google la podemos consultar de manera gratuita para nuestra aplicaciones, tiene una serie de límites en cuanto a número de peticiones que os pongo a continuación:


Requisitos

Para poder hacer peticiones a goolge y usar estos datos que nos facilita Google sólo necesitamos una API de Google Maps, que podremos crear desde nuestra cuenta de desarrollador de Google.


Lo primero será crearnos un proyecto y nos asignarán una API Key que podemos gestionar desde la consola para poder caparla y así determinar desde qué dominio se puede utilizar, que direción IP, aplicación, etc.

Pues ya sólo queda hacer uso de la API Key y empezar a hacer consultas a Google a ver que nos responde.

Creando Script de Gelocalización en Python

Para crear los script de geolocalización simplemente vamos a ver el tipo de petición necesaria que hay que hacerle a google para que te devuelva los datos.  La petición necesaria será de tipo POST y la dirección sería la siguiente:
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
Donde debemos de incluir la API_KEY que previamente habíamos creado.

Para llevar a cabo la petición por medio de la API debemos rellenar el cuerpo de la solicitud con algunos de los siguientes datos:

  • Información de la IP del usuario.
  • Información de la torre de telefonía a la cual está conectado tu dispositivo, si es un móvil.
  • Información de al menos dos puntos de acceso cercanos.
De tal forma que si nosotros hacemos una petición con nuestra API_KEY y facilitamos cualquiera de los datos comentados, se nos localizará en función e la información que tiene Google. Muy importante saber que el formato de los datos que hay que enviar se hace en JSON o "jeison" como diría mi amigo @kinomakino. Podéis encontrar toda la información al respecto en la siguiente dirección:


Nosotros hemos hecho uso de python para crear los script, pero podemos utilizar el lenguaje que queramos mientras hagamos la petición de tipo POST, aportemos una API_KEY válida y los datos requeridos en formato JSON.

Script geoIp.py

Este script es el más simple, pues nos devuelve la posición en función de la IP que tengamos, a continuación os muestro el código:

Código geoIP.py

Simplemente creamos la variable de datos en formato JSON para enviar en la petición POST y recibimos los parámetros de latitud, longitud y precisión en metros. Vemos el resultado:
Ejecución geoIP.py

Si vemos el resultado, nos da unos parámetros de latitud y longitud con una precisión de 1,1km de precisión. Si buscamos esas coordenadas en en el mapa de Google, vemos que el lugar donde nos encontramos (IES Fidiana) está dentro del radio de 1,1km de las coordenadas. 

Ubicación de las coordenadas

Script geoCID.py

Este script hace uso de la información de una torre de telefonía a la cual puede estar conectado tu teléfono. Para obtener esta información simplemente tenéis que instalaros cualquier App que os facilite esa información, como por ejemplo la que veis a continuación, os dejo el enlace de la App. 

App Información de Señal

La información de la torre de telefonía de la imagen anterior corresponde a una captura que hice en el pasado Sophos Day 2017,  celebrado en el Palco de Honor del Santiago Bernabéu. Una vez que tenemos la información de la torre de telefonía (CID, LAC/TAC, MCC y MNC), ya sólo tendremos que añadirla al siguiente script:

Código geoCID.py

Ya tenemos todos los datos en formato JSON para enviar en la petición POST y recibir las coordenadas y la precisión. Vemos el resultado:

Ejecución geoCID.py

Si vemos el resultado, nos da unos parámetros de latitud y longitud con una precisión de 0,8km de precisión. Si buscamos esas coordenadas en en el mapa de Google, vemos que el lugar donde nos encontrábamos efectivamente era el Santiago Bernabéu. 

Ubicación de las coordenadas

Script geoMAC.py

El último script hace uso de la información de al menos dos puntos de acceso que tengamos cerca. Para obtener esta información simplemente lanzáis un escaneo con cualquier App, os dejo el enlace de la App que yo he usado y que vemos a continuación. 

App Signal Finder 

En la imagen anterior tenemos la lista de puntos de acceso más cercanos a mi dispositivo y ordenados por la intensidad de señal, como podéis leer se trata del mismo lugar que comentamos anteriormente. Una vez que tenemos la información de dos de ellos, la añadimos al siguiente script:

Código geoMAC.py

Ya tenemos todos los datos en formato JSON para enviar en la petición POST y recibir las coordenadas y la precisión. Vemos el resultado:

Ejecución geoMAC.py

Si vemos el resultado, nos da unos parámetros de latitud y longitud con una precisión de 30 metros, bastante precisa. Si buscamos esas coordenadas en en el mapa de Google, al igual que anteriormente vemos que el lugar donde nos encontrábamos efectivamente era el Santiago Bernabéu. 

Ubicación de las coordenadas

A partir de aquí ya podéis dar rienda suelta a vuestra imaginación y hacer uso de los script para lo  que queráis y no sólo en este lenguaje, sino en cualquier otro, simplemente haciendo uso de una petición POST, con nuestra API_KEY y nuestros datos en formato JSON.

Además, Os dejo también un ejemplo de código hecho en HTML5 que nos facilita Google Maps para que veáis la exactitud que puede conseguir un sistema Web si le damos acceso a permitir ubicación. Podéis encontrar todos los scripts en mi cuenta de github

Espero que os haya resultado interesante!!
Happy Geolocation !!

@edusatoe

"El conocimiento es el único bien que crece cuanto más se comparte"

7 comentarios:

  1. wow interesante scrpt de programacion para Rastrear un celular es bueno sirve para muchas aplicaciones

    ResponderEliminar
  2. excelente aporte. También probaré los scripts. !!!

    ResponderEliminar
  3. excelente scrip para rastrear celular lo voy a poner en practica, muchas gracias!

    ResponderEliminar
  4. Hola. La API de Google Maps por lo que veo en los enlaces que aparecen en este artículo es de pago

    ResponderEliminar
    Respuestas
    1. La API es gratuita si no te pasas de 2500 solicitudes al día y máximo de 50 por segundo

      Eliminar
    2. Cuál es la razón de solicitar la información de la tarjeta

      Eliminar
  5. muy interesante lo voy a poner en practica

    ResponderEliminar