Il est parfois utile de pouvoir localiser géographiquement une adresse IP. Cela peu par exemple être utile pour localiser un visiteur ou pour localiser des serveurs. Cet article présente deux tutoriaux PHP qui exploite une base de donnée pour associer une adresse IP à son pays.

Intérêt de localiser une adresse IP

Il y a plusieurs raisons qui motivent l'utilisation de la localisation de l'adresse IP. La liste ci-jointe n'est pas exhaustive mais inclue des exemples d'utilisations très probables:

  • Localiser le visiteur d'un site web. Avec cette information il est possible de personnaliser le contenu pour cet internaute (utiliser l'unité monétaire de son pays, suggérer une version du site dans la langue officielle de son pays ...).
  • Cibler l'audience d'une annonce en ligne.
  • Détection automatique d'un champ de formulaire (exemple: choix du pays pré-remplis).
  • Connaitre l'emplacement géographique du serveur d'un site web (exemple: peut être utile pour le référencement).
  • Filtrer les visiteurs selon leur localité.
  • Réduire le spam / Réduire les fraudes bancaires.

Base de données

Pour associer une adresse IP à un pays, il faut se baser sur une base de données qui répertorie des plages d'adresses IP à un pays. La base de données de IP-to-Country (anciennement ip-to-country.com) est relativement précise, complète et mise à jour régulièrement.

Pour réaliser les tutoriaux présents dans la suite de cet article, il est indispensable de télécharger la base de données suivante et de la mettre en place sur son espace d'hébergement.

(Base de données SQL de 5,23Mo)

Pays d'origine d'un visiteur

L'utilisation la plus populaire de cette base de données consiste à localiser le pays d'origine d'un visiteur. Le code PHP suivant fonctionne avec PHP 5.

<?php
/*
Message de copyright obligatoire:
"This 'work' uses the IP-to-Country Database
 provided by WebHosting.Info (http://www.webhosting.info),
 available from http://ip-to-country.webhosting.info."
*/
// Connexion à la base de donnée (à adapter)
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// Fonction permettant de convertir l'adresse IP en un format numérique
function ipAdressNumber($dotted){
 $dotted = preg_split( "/[.]+/", $dotted);
 $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
 // IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
 return $ip;
}

$ip = $_SERVER['REMOTE_ADDR']; // Adresse IP du visiteur
echo 'Adresse IP: '.$ip.'<br />';
$ip = ipAdressNumber($ip); // Utilisation de la fonction pour convertir l'adresse IP

// Sélection des données dans la base de données. Si l'IP est comprise entre IP_FROM et IP_TO
$result = mysqli_query($link, "SELECT * FROM ip_to_country WHERE $ip BETWEEN IP_FROM AND IP_TO ") or die (mysqli_error($link));
$data = mysqli_fetch_array($result);
echo 'Pays: <strong>'.$data['COUNTRY_NAME'].'</strong>'; // Affichage du pays du visiteur

mysqli_close($link);
?>

Localisation d'un serveur

Pour une application ou pour le référencement, il peut se révéler utile de savoir dans quel pays se situe le serveur d'un site web. En connaissant le nom de domaine d'un site, le code suivant retourne l'adresse IP du serveur. Cette adresse IP peut alors permettre de localiser le serveur grâce à la base de données.

<?php
/*
Message de copyright obligatoire:
"This 'work' uses the IP-to-Country Database
 provided by WebHosting.Info (http://www.webhosting.info),
 available from http://ip-to-country.webhosting.info."
*/
// Connexion à la base de donnée (à adapter)
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// Fonction permettant de convertir l'adresse IP en un format numérique
function ipAdressNumber($dotted){
 $dotted = preg_split( "/[.]+/", $dotted);
 $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
 // IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
 return $ip;
}

$ip = gethostbyname('www.infowebmaster.fr'); // Adresse IP du serveur du site www.infowebmaster.fr
echo 'Adresse IP: '.$ip.'<br />';
$ip = ipAdressNumber($ip); // Utilisation de la fonction pour convertir l'adresse IP

// Sélection des données dans la base de données. Si l'IP est comprise entre IP_FROM et IP_TO
$result = mysqli_query($link, "SELECT * FROM ip_to_country WHERE $ip BETWEEN IP_FROM AND IP_TO ") or die (mysqli_error($link));
$data = mysqli_fetch_array($result);
echo 'Pays: <strong>'.$data['COUNTRY_NAME'].'</strong>'; // Affichage du pays du serveur

mysqli_close($link);
?>

Il est possible de constater que ce code diffère très peu du code précédent qui consistait à déterminer le pays d'origine d'un visiteur.

Continuation

Cette base de données est très intéressante mais possède l'inconvénient d'être exclusivement en anglais. De plus, les pays sont écrits en majuscules, ce qui n'est pas très esthétiques et facile à lire. Il est possible d'améliorer ce travail en créant une base de données permettant de traduire le nom des pays.

Mise à jour 21 février 2010: Pour traduire le nom des pays en français, j'ai créé une base de données de traduction de IP-to-Country. Cela est idéal pour afficher convenablement le nom des pays aux visiteurs.

Commentaires

Je rajouterai qu'il faut laisser le visiteur choisir si le contenu doit être personnalisé en fonction de l'IP ou pas.

Je prends deux exemples :
1.je vie en Angeterre, mon IP est donc anglaise, mais je souhaite lire le site, payer et livrer en France donc je souhaite pouvoir facilement accéder au contenu francais.
Ebay.fr avait une "modal box" pendant une période me demandant si je voulais vraiment le site FR, mais celle-ci semble avoir disparue.

2.Les robots des moteurs de recherche on en général une IP US. Personnaliser le contenu automatiquement risque donc d'entrainer un référencement sur un marché secondaire à cause de l'IP du "visiteur".

Léo, Propulsr - 21 février 2010 à 13h28

@Léo, Propulsr: C'est tout à fait pertinent. Pour ma part, j'aimais bien la boite de dialogue que Youtube affichait. En gros, lorsque j'ouvrais Youtube en français depuis l'Angleterre, une boite de dialogue me demandais si je souhaitais vraiment la version française. En un clic, je pouvais aller sur la version Anglaise. Surement la même chose que la "modal box" que tu semble décrire.

Tony - 21 février 2010 à 16h21

Oui c'est tout à fait ça, ebay proposait une boite de dialogue CSS avec deux choix/liens : soit aller sur le site FR, soit le UK.

Léo, Propulsr - 21 février 2010 à 16h34

je voudrais bien que vous m'aidiez à déterminer le pays d'origine d'une adresse électronique. je suis pas programmeur et je ne maîtrise pas les codes. mais je voudrais bien que vous m'aidiez. merci

TOUKPO - 7 mars 2010 à 08h42

@TOUKPO: Le script présent permet de localiser une adresse IP et non une adresse électronique. Il n'y a pas de solution miracle à ma connaissance pour localiser une adresse électronique. A moins de contacter le prestataire qui fournit l'adresse électronique. Cordialement.

Tony - 7 mars 2010 à 11h50

Il y peut être moyen de trouver si le nom de domaine n'est pas une adresse gratuite (du type hotmail ou gmail). Il suffit d'utiliser un Whois (mon préféré étant domaintools) pour voir le pays d'hébergement du domaine et les infos relatives à l'enregistrement (si pas cachées).

Léo, Propulsr - 7 mars 2010 à 12h11

@Leo: Oui, c'est pas une mauvaise idée.
@TOUKPO: Dans quel contexte souhaitais-tu obtenir un tel renseignement?

Tony - 7 mars 2010 à 19h33

Trackbacks

[...] Cet article propose une traduction française de la base de données IP-to-Country, permettant de relier une adresse IP à un pays. Cet article est la suite logique du précédent article publié sur ce blog, intitulé "Connaître le pays d’une adresse IP". [...]

Ping by Traduction base de données IP/Pays - 21 février 2010 à 20h43

Désolé, les commentaires sont fermés pour le moment.