- Présentation
Salut à tous, on m’a demandé plusieurs fois comment j’ai réussi « l’exploit » de trouver la ville d’une personne qui visite votre site internet. Ça se passe en plusieurs étapes.
Déjà un pré-requis est d’avoir un serveur dédié pour optimiser les choses…
Il y a un site très intéressant qui regroupe toutes les IP et à quelle ville cela correspond. Donc une fois la correspondance trouvée il suffit de récupérer l’IP du visiteur et le tour est joué… Enfin presque.
- Préparation de la base de données
Dans un premier temps il faut récupérer le fichier et l’entrer dans sa base de données. Créer les tables avec la requête suivante :
-
–
-
– Structure de la table `City_Block`
-
–
-
-
CREATE TABLE `City_Block` (
-
`startIpNum` bigint(10) NOT NULL,
-
`endIpNum` bigint(10) NOT NULL,
-
`locId` bigint(10) NOT NULL
-
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
– ——————————————————–
-
-
–
-
– Structure de la table `City_Location`
-
–
-
-
CREATE TABLE `City_Location` (
-
`locId` bigint(10) NOT NULL,
-
`country` varchar(2) NOT NULL,
-
`region` varchar(2) NOT NULL,
-
`city` varchar(50) NOT NULL,
-
`postalCode` varchar(5) NOT NULL,
-
`latitude` varchar(7) NOT NULL,
-
`longitude` varchar(7) NOT NULL,
-
`metroCode` varchar(5) NOT NULL,
-
`areaCode` varchar(5) NOT NULL,
-
PRIMARY KEY (`locId`)
-
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Pour intégrer le fichier dans sa base de données écrire le script suivant.
-
LOG=/log/geoip.log
-
echo "" >>; $LOG
-
echo "Debut du remplissage `date`">>$LOG
-
DATE=`date +%Y%m`
-
adresse=http://www.maxmind.com/download/geoip/database/GeoLiteCity_CSV/
-
cd /tmp
-
wget http://www.maxmind.com/download/geoip/database/GeoLiteCity_CSV/
-
fic=`cat index.html | grep zip | cut -d\" -f6 | tail -1`
-
rm index.html
-
wget $adresse/$fic
-
unzip $fic
-
rm $fic
-
cd GeoLiteCity*
-
pwd
-
sed -e s/\"//g GeoLiteCity-Blocks.csv > GeoLiteCity-Blocks.tmp && mv -f GeoLiteCity-Blocks.tmp GeoLiteCity-Blocks.csv
-
sed -e s/\"//g GeoLiteCity-Location.csv > GeoLiteCity-Location.tmp && mv -f GeoLiteCity-Location.tmp GeoLiteCity-Location.csv
-
mysql -uUSER -pPASSWD < < EOF
-
use geoip
-
TRUNCATE TABLE City_Block;
-
TRUNCATE TABLE City_Location;
-
LOAD DATA LOCAL INFILE ‘GeoLiteCity-Blocks.csv’
-
INTO TABLE City_Block
-
FIELDS TERMINATED BY ‘,’
-
LINES TERMINATED BY ‘\n‘;
-
-
LOAD DATA LOCAL INFILE ‘GeoLiteCity-Location.csv’
-
INTO TABLE City_Location
-
FIELDS TERMINATED BY ‘,’
-
LINES TERMINATED BY ‘\n‘;
-
exit
-
EOF
-
echo "—–Nombres d‘entrees pour les blocks : `wc -l GeoLiteCity-Blocks.csv`">>$LOG
-
echo "Fin du remplissage `date`">>$LOG
-
echo "–nb d entrees pour les vilels : `wc -l GeoLiteCity-Location.csv`">> $LOG
-
cd /tmp
-
rm -rf GeoLiteCity*
-
echo "Fin du traitement `date`"
-
Le fichier est mis à jour une fois par mois. Vous pouvez donc intégrer le script dans votre crontab. Personnellement j’ai essayé de le faire le 2 du mois mais il y a eu comme un bug, du coup je le fais le 5 du mois et ca marche très bien
- Intégration dans une page internet
C’est bien joli d’avoir une belle base de données, mais encore faut-il pouvoir l’utiliser. Le principe de fonctionnement de la base est qu’une ip qui s’ecrit normalement en 10.2.5.9 s’écrit en un seul chiffre. Comment est-ce possible ? Tout simplement en utilisant une base 256… Et oui de 0 à 255 ca fait bien 256 chiffres; Je vous passe la conversion mais c’est le même principe que les conversions hexa, binaire… Ensuite comme les donnes fonctionne par plage il suffit de trouver à quelle plage appartient notre IP et le tour est joué.
Voici donc le code qu’il faut inclure dans votre page web :
-
< ?php
-
//*********************************************************
-
// Retourne l’adresse IP du visiteur
-
//*********************************************************
-
function get_Ip() {
-
$ip = $_SERVER[‘HTTP_X_FORWARDED_FOR’];
-
}
-
$ip = $_SERVER[‘HTTP_CLIENT_IP’];
-
}
-
else {
-
$ip = $_SERVER[‘REMOTE_ADDR’];
-
}
-
return $ip;
-
}
-
-
-
//*********************************************************
-
// fonction qui ransforme l’IP en nombre
-
//*********************************************************
-
function IPAddress2IPNumber($dotted)
-
{
-
$ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
-
return $ip;
-
}
-
-
//***************************************
-
//Fonction pour avoir la ville
-
//**************************************
-
function IpEnVille($uneIp)
-
{
-
-
-
// transforme l’ip en nombre
-
$uneIp=IPAddress2IPNumber($uneIp);
-
-
$sql_locId ="SELECT City_Block.locId FROM City_Block WHERE ‘".$uneIp."’ BETWEEN startIpNum AND endIpNum ";
-
$retour=$data[locId];
-
$locId=$retour;
-
-
$sql_city = "SELECT City_Location.city FROM City_Location WHERE locId = ‘".$locId ."’;";
-
$city=$data_city[city];
-
-
return $city;
-
}
Ensuite il suffit d’appeler la fonction de cette facon
-
IpEnVille(Get_Ip());
Voilà, si vous avez des questions n'hésitez pas... Mais en suivant step by step ca devrait aller tout seul

