Géo-localisation IP en PHP

Août 2012

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 !

1 commentaire :
commentaire n°3425 par xav
xav mercredi 14 décembre 2016, 13:13
Bonjour,
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.
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré