Géo-localisation IP en PHP
En PHP, il est possible de géoloaliser une IP de différentes manières :
- En utilisant la base de données de géolocalisation IP de MaxMind.
MaxMind propose des bases de données payantes (très complètes), et d'autres gratuites, mais qui sont largement suffisantes pour obtenir le pays (avec une très grande fiabilité de 99%), ainsi que la région et la ville dans une moindre précision. - En utilisant une API de géolocalisation IP
Utiliser la base de données gratuite Geo IP MaxMind
MaxMind propose 2 bases de géolocalisation IP qu'on peut télécharger gratuitement sur son site : GeoLite Databases :
- GeoLite Country
Permets d'obtenir le pays correspondant à une IP - GeoLite City
Permets d'obtenir le pays, la région et la ville correspondant à une IP
GeoLite City est plus précise que GeoLite Country, donc je vous conseille de l'utiliser.
Télécharger GeoLite City
La première étape est de télécharger la base au format binary ("Download binary format for use with API code"), au format zip, sur cette page.
Ensuite, il faut extraire le zip téléchargé pour récupérer le fichier GeoLiteCity.dat qu'il contient.
Récupérer l'API PHP
MaxMind propose 3 manières d'utiliser sa base de données (le fichier GeoLiteCity.dat) :
- Extension PHP PEAR
Une extension PEAR est écrite en PHP, l'avantage est qu'on a pas besoin de modifier la configuration du serveur pour l'utiliser, idéal quand on utilise un hébergement mutualisé par exemple.
Le seul inconvénient est que les performances sont moins bonnes qu'une extension PECL.
- Extension PHP PECL
Les extensions PECL sont écrites en langage C et sont donc compilées et chargées dans l'exécutable php via le fichier php.ini. Les extensions PECL sont en général plus rapides que les extensions PEAR. - Un module Apache : mod_geoip
Ce dernier mode est un peu spécial, le module Apache mod_geoip permet de géolosaliser automatiquement toutes les adresses IP des clients, on peut ensuite accèder à cette information dans PHP via la superglobale $_SERVER. On peut même utiliser cette information dans les fichiers .htaccess.
Plus de détails sur le site officiel : GeoIP PHP API.
Pour l'exemple, on va prendre le plus simple à installer : l'extension PEAR. Téléchargez l'API PHP ici : http://www.maxmind.com/download/geoip/api/php/.
Ce zip contient beaucoup de scripts PHP, mais en réalité beaucoup sont des exemples, et pour utiliser l'API on a juste besoin de ces 3 fichiers :
- geoip.inc.php
- geoipcity.inc.php
- geoipregionvars.php
Exemple de géolocalisation IP en PHP
Ensuite ça s'utilise comme n'importe quel script PHP, il suffit d'inclure l'API, d'ouvrir le fichier .dat avec la fonction geoip_open
:
<?php // Initialisation require 'geoipcity.inc.php'; $database = geoip_open('GeoLiteCity.dat',GEOIP_STANDARD); // Géolocalisation de l'adresse IP 74.41.65.128 $ip = '74.41.65.128'; $record = geoip_record_by_addr($database, $ip); print_r($record); // affiche les informations récupérées dans la base ?>
Voici un billet similaire qui vous permettera d'en savoir plus sur export excel vers google documents.
Bien sûr, vous n'avez besoin d'ouvrir la base qu'une seule fois au début de l'exécution de votre script, pas à chaque appel de geoip_record_by_addr
!
Utiliser une API en ligne (webservice)
Si vous ne voulez pas utiliser l'API MaxMind, vous pouvez utiliser un webservice de géolocalisation IP comme celle proposée par le site geolocalise-ip.com.
Vous devez d'abord vous inscrire pour obtenir vos identifiants (adresse email et mot de passe).
Ensuite, j'ai écrit une petite classe qui permet d'interroger facilement le webservice, indiquez simplement vos identifiants dans le constructeur et le tour est joué :
<?php /* * Geoip.class.php * Classe d'utilisation de l'API geolocalise-ip.com * Compatible PHP 5+ **/ class Geoip { # Credentials private $email; private $pass; # URL de l'API public $endpoint; # Constructeur public function __construct(){ $this->email = 'votre@email.com'; $this->pass = 'motDePasse'; $this->endpoint = "http://www.geolocalise-ip.com/api.php"; } # Set credential (private car confidentiel) public function setEmail($email = null){ $this->email = $email; } public function setPass($pass = null) { $this->pass = $pass; } # Query : retourne les infos de géolosalisation pour l'IP passée en paramètre public function query($ip){ # Check param if( empty($ip) ){ trigger_error("L'ip est vide.", E_USER_WARNING); return false; } # Appel de l'API $url = $this->endpoint.'?'.http_build_query(array( 'email' => $this->email, 'pass' => $this->pass, 'ip' => $ip )); $return['apiRequest'] = $url; $result = file_get_contents($url); if( $result == false || empty($result) ){ $return['erreur'] = 1; $return['erreur_msg'] = "API indisponible ($url)"; return $return; } $result = utf8_encode($result); $return['apiResponse'] = $result; # Decodage de la réponse # 1. Isolation du message d'erreur à la fin if( preg_match('#^(.*?&erreur=.*?)<(.*)$#i', $result, $matches) ){ $result = $matches[1]; $return['erreur_msg'] = '<'.trim($matches[2]); } # 2. Parse parse_str($result, $geo); # Retour $return = array_merge($return, $geo); return $return; } } ?>
Et ça s'utilise comme ça :
<?php require 'Geoip.class.php'; $geoip = new Geoip(); $record = $geoip->query('74.41.65.128'); ?>
Encore faim ? allez lire ça : château mystérieux !
Sans avoir besoin d'inscription, il y aussi l'api de géoip dispo ici : http://xj1.fr/geoip/
Les resultats sont renvoyé au choix en csv, xml ou json.