
Una herramienta OSINT de Instagram para recolectar todas las ubicaciones georreferenciadas disponibles en un perfil de Instagram con el fin de trazarlas en un mapa y volcarlas en un JSON.
TL;DR : ascineema, video del proyecto
Una herramienta para extraer ubicaciones georreferenciadas de perfiles de Instagram. Salida en JSON y mapa interactivo.
sudo apt install chromium-chromedriver && chmod a+x /usr/bin/chromedriver
git clone https://github.com/bernsteining/instaloctrack
cd instaloctrack
pip3 install .
O usar Docker:
sudo docker build -t instaloctrack -f Dockerfile .
instaloctrack -h
usage: instaloctrack [-h] [-t TARGET_ACCOUNT] [-l LOGIN] [-p PASSWORD] [-v]
Instagram location data gathering tool. Usage: python3 instaloctrack.py -t <target_account>
optional arguments:
-h, --help show this help message and exit
-t TARGET_ACCOUNT, --target TARGET_ACCOUNT
Instagram profile to investigate
-l LOGIN, --login LOGIN
Instagram profile to connect to, in order to access
the instagram posts of the target account
-p PASSWORD, --password PASSWORD
Password of the Instagram profile to connect to
-v, --visual Spawns Chromium GUI, otherwise Chromium is headless
p. ej.
instaloctrack -t <target_account>
Si el perfil objetivo es privado y tienes una cuenta que sigue al perfil objetivo, puedes extraer los datos con una sesión conectada:
instaloctrack -t <target_account> -l <your_account> -p <your_password>
o con Docker:
sudo docker run -v /tmp/output:/tmp/output instaloctrack -t <target_account> -o /tmp/output
Primero, obtenemos todos los enlaces de las fotos de la cuenta desplazándonos por todo el perfil de Instagram, gracias al webdriver de Selenium.
Luego, recuperamos de forma asíncrona (asyncio) cada enlace de foto, comprobamos si contiene una ubicación en la descripción de la foto y, si la hay, recuperamos los datos de la ubicación y la marca de tiempo.
Debido a que Instagram no proporciona coordenadas GPS y solo se nos dan nombres de lugares, tenemos que geocodificarlos (es decir, obtener las coordenadas GPS a partir del nombre del lugar).
Para esto, utilicé la increíble API de Nominatim, que utiliza OpenStreetMap. Para nuestro uso no se requiere clave API, y respetamos la Política de uso de Nominatim solicitando coordenadas GPS una vez por segundo.
Finalmente, una vez que tenemos todas las coordenadas GPS, generamos un HTML (gracias a la plantilla jinja2) con Javascript incrustado que dibuja un mapa de OpenStreetMap (gracias a la librería Leaflet) con todas nuestras ubicaciones marcadas. Una vez más, no se requiere clave API para este paso.
Además, los datos recopilados por el script (nombres de ubicaciones, marcas de tiempo, coordenadas GPS, errores) se vuelcan a un archivo JSON para poder ser reutilizados.
Como ejemplo, aquí está la salida en el perfil de Instagram del expresidente francés, @fhollande:

El mapa de calor:

Información disponible al hacer clic en un marcador:

Estadísticas sobre los datos de ubicación:

El volcado de datos JSON (solo una parte para mostrar el formato de una ubicación determinada):
{
"link": "https://www.instagram.com/p/-Q_9EvR9eu",
"place": {
"id": "290297",
"name": "Musée du quai Branly - Jacques Chirac",
"slug": "musee-du-quai-branly-jacques-chirac",
"street_address": " 37 quai Branly",
" zip_code": " 75007",
" city_name": " Paris",
" region_name": " ",
" country_code": " FR"
},
"timestamp": "2015-11-19",
"gps": {
"lat": "48.8566969",
"lon": "2.3514616"
}
}