Tips en Trucs 2017

IP-adres geolocatie met Python

Om de locatie van een apparaat nauwkeurig te bepalen moet deze een GPS bevatten. Indien dit niet het geval is, kan je terugvallen op de Geolocatie van het IP-adres. Python heeft daar de pygeoip bibliotheek voor. Naast deze bibliotheek moet je in het bezit zijn van een database die de IP-adressen aan locaties kan koppelen.

De python bibliotheek installeer je met de volgende opdracht:

dany@laptop:~> sudo pip install pygeoip
root's password:
Collecting pygeoip
  Downloading pygeoip-0.3.2-py2.py3-none-any.whl
Installing collected packages: pygeoip
Successfully installed pygeoip-0.3.2
You are using pip version 7.1.2, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

De database komt van MaxMind. Elke eerste dinsdag van de maand verschijnt een nieuwe versie van de database. De database downloadt je als volgt:

dany@laptop:~> wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
--2017-02-10 16:06:46--  http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
Herleiden van geolite.maxmind.com (geolite.maxmind.com)... 104.16.38.47, 104.16.37.47, 2400:cb00:2048:1::6810:252f, ...
Verbinding maken met geolite.maxmind.com (geolite.maxmind.com)|104.16.38.47|:80... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 11820467 (11M) [application/octet-stream]
Wordt opgeslagen als: ‘GeoLiteCity.dat.gz’

100%[===========================================================================================>] 11.820.467  1,43MB/s   in 8,0s   

2017-02-10 16:06:54 (1,41 MB/s) - '‘GeoLiteCity.dat.gz’' opgeslagen [11820467/11820467]

Pak de gedownloade database uit met de opdracht:

dany@laptop:~> gzip -d GeoLiteCity.dat.gz

Het externe IP-adres van uw internetverbinding kan je met de volgende opdracht achterhalen en opslaan in een variabele:

dany@laptop:~> wanip=`dig +short myip.opendns.com @resolver1.opendns.com`
dany@laptop:~> echo $wanip
81.242.205.163

Met het python 3 script geolocation.py kan je een IP-adres in de database opzoeken en de bijhorende locatiegegevens weergeven. Het op te zoeken IP-adres wordt daarbij als argument met het python script meegegeven. Het geolocation.py script:

#!/usr/bin/python3.4

import sys
import pygeoip
 
# Plaats het als argument meegegeven IP-adres in de variabele ip
ip = sys.argv[1]
# Zoek de locatie die bij het IP-adres hoort op in de database
GeoIPDatabase = '/home/dany/GeoLiteCity.dat'
ipData = pygeoip.GeoIP(GeoIPDatabase)
record = ipData.record_by_name(ip)
# Geef de in de database gevonden locatiegegevens weer op het scherm
print("The geolocation for IP Address %s is:" % ip)
print("Accurate Location: %s, %s, %s" % (record['city'], record['region_code'], record['country_name']))
print("General Location: %s" % (record['metro_code']))

Start en test het script als volgt met het IP-adres van google.com:

dany@laptop:~> python3.4 geolocation.py 172.217.17.78
The geolocation for IP Address 172.217.17.78 is:
Accurate Location: Mountain View, CA, United States
General Location: San Francisco, CA

Vanzelfsprekend kan je het python script starten vanuit een bash script, bijvoorbeeld om de locatie het IP-adres van uw computer op te zoeken:

#!/bin/bash

wanip=`dig +short myip.opendns.com @resolver1.opendns.com`
python3.4 geolocation.py $wanip

Dit wordt het resultaat bij het uitvoeren van van bovenstaande bash script:

dany@laptop:~> bash geolocation.sh
The geolocation for IP Address 81.242.205.163 is:
Accurate Location: None, None, Belgium
General Location: None

Je merkt hier meteen dat de nauwkeurigheid niet erg groot is. Je kunt de locatie van een IP-adres ook uit een webpagina op het internet halen, bijvoorbeeld bij IP Location.

IP Location