Geo::IP von Boris Zentner ermöglicht die regionale Zuordnung von IP-Adressen oder Hostnamen.
Geo::IP bietet eine kleine, aber häufig ausreichende, Auswahl an Geoinformationen der Geolocation Datenbank vom MaxMind. Wer mehr möchte, muss auf die kommerzielle Version upgraden.
Nachfolgend ein Beispiel zur Ermittlung des Herkunftslandes und ein Beispiel zur Ermittlung detaillierter Ortsinformationen.
Beispiel Länderinfo (Herkunftsland)
Geo::IP liefert Länderinformationen gemäß ISO 3166 zurück. Für weitere Details verweise ich auf den Beitrag Locale::Country - ISO 3166 - Norm für Kodierung von geographischen Einheiten.
#!/usr/bin/perl
use strict;
use warnings;
use Geo::IP;
my $ip = '81.169.145.71';
my $host = 'perl-howto.de';
# Download: http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
# Nutzt GeoIP.dat in /usr/local/share/GeoIP/
my $gi = Geo::IP->new(GEOIP_STANDARD) or die $!;
# Datenbankinfos ausgeben
my $db_info = $gi->database_info() or die $!;
print "Datenbankinfo: $db_info\n";
# Methoden bei bekannter IP
my $country = $gi->country_code_by_addr( $ip ) or die $!;
my $country3 = $gi->country_code3_by_addr( $ip ) or die $!;
my $countryname = $gi->country_name_by_addr( $ip ) or die $!;
print "\n";
print "Info fuer $ip\n";
print "Country: $country\n";
print "Country3: $country3\n";
print "Country Name: $countryname\n";
# Methoden bei bekanntem Host
$country = $gi->country_code_by_name( $host ) or die $!;
$country3 = $gi->country_code3_by_name( $host ) or die $!;
$countryname = $gi->country_name_by_name( $host ) or die $!;
print "\n";
print "Info fuer $host\n";
print "Country: $country\n";
print "Country3: $country3\n";
print "Country Name: $countryname\n";
Das Programm erzeugt folgende Ausgabe
Datenbankinfo: GEO-106FREE 20090201 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved
Info fuer 81.169.145.71
Country: DE
Country3: DEU
Country Name: Germany
Info fuer perl-howto.de
Country: DE
Country3: DEU
Country Name: Germany
Beispiel Ortsinfo
Hierzu wird zusätzlich die Datenbank GeoLiteCity.dat benötigt (Download).
#!/usr/bin/perl
use strict;
use warnings;
use Geo::IP;
my $ip = '81.169.145.71'; # perl-howto.de
my $host = 'google.de';
# Download --> http://geolite.maxmind.com/download/geoip/database/
my $gi =
Geo::IP->open( "/usr/local/share/GeoIP/GeoLiteCity.dat", GEOIP_STANDARD )
or die $!;
my $db_info = $gi->database_info();
print "Datenbankinfo: $db_info\n";
my $record = $gi->record_by_addr($ip) or die $!;
display( $ip, $record );
$record = $gi->record_by_name($host) or die $!;
display( $host, $record );
###########################################################
sub display {
my $info = shift @_;
my $record = shift @_;
print "Info fuer $info\n";
print "Country Code: ", $record->country_code, "\n";
print "Country Code3: ", $record->country_code3, "\n";
print "Country Name: ", $record->country_name, "\n";
print "Region: ", $record->region, "\n";
print "Region (Name): ", $record->region_name, "\n";
print "City: ", $record->city, "\n";
print "PLZ: ", $record->postal_code, "\n";
print "Latitude: ", $record->latitude, "\n";
print "Longitude: ", $record->longitude, "\n";
print "TimeZone: ", $record->time_zone, "\n";
print "Area Code: ", $record->area_code, "\n";
print "Continent Code: ", $record->continent_code, "\n";
print "Continent Name: ",
continentcode2continent( $record->continent_code ), "\n";
print "Metro Code: ", $record->metro_code, "\n";
print "\n";
}
###########################################################
sub continentcode2continent {
my $code = shift @_;
#Possible continent codes are AF, AS, EU, NA, OC, SA
#for Africa, Asia, Europe, North America, Oceania and South America.
my %continent = (
'AF' => 'Africa',
'AS' => 'Asia',
'EU' => 'Europe',
'NA' => 'North America',
'OC' => 'Oceania',
'SA' => 'South America',
);
if ( exists $continent{$code} ) {
return $continent{$code};
}
else {
warn "Unknown Continent for <$code>\n";
return;
}
}
###########################################################
Das Programm erzeugt folgende Ausgabe
Datenbankinfo: GEO-533LITE 20090201 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved
Info fuer 81.169.145.71
Country Code: DE
Country Code3: DEU
Country Name: Germany
Region: 16
Region (Name): Berlin
City: Berlin
PLZ:
Latitude: 52.5167
Longitude: 13.4000
TimeZone: Europe/Berlin
Area Code: 0
Continent Code: EU
Continent Name: Europe
Metro Code: 0
Info fuer google.de
Country Code: US
Country Code3: USA
Country Name: United States
Region: CA
Region (Name): California
City: Mountain View
PLZ: 94043
Latitude: 37.4192
Longitude: -122.0574
TimeZone: America/Chicago
Area Code: 650
Continent Code: NA
Continent Name: North America
Metro Code: 807
Hier lässt sich erkennen, das die Städte-Datenbank für Nordamerika besser gefüllt ist als für Europa.
Ubuntu Installationstipps
Zunächst sollten die Bibliotheken für Geo::IP installiert werden:
sudo apt-get install libgeoip1 libgeoip-dev
Die Datenbank GeoIP.dat befindet sich nun in /usr/share/GeoIP/.
Geo::IP erwartet die Datenbanken aber in /usr/local/share/GeoIP/.
Also installiere ich die Datenbank und die monatlich kostenlos zum Download zur Verfügung gestellten Updates nach /usr/local/share/GeoIP/, da Geo::IP die Datenbanken dort erwartet.
Siehe auch: