- 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

Ton blog à convertis les && en &
Sinon le remplissage fonctionne
Debut du remplissage samedi 8 novembre 2008, 10:03:08 (UTC+0100)
—–nb d entrees pour les blocks : 3014820 GeoLiteCity-Blocks.csv
Fin du remplissage samedi 8 novembre 2008, 10:05:29 (UTC+0100)
Mince, il les convertis dans les commentaire. Je parlait des & a m p ;
Voilà j’ai corrigé ce petit bug
merci de l’info, j’avais pas fait attention ^^
Sinon ca marche impec. Je l’ai un peu modifier a ma sauce.
Merci encore
Спасибо за пост! Добавил блог в RSS-ридер, теперь читать буду регулярно..
Tu a une faute à « Préserntation »
Ah j’oubliait. Penser a supprimer les 2 premières lignes des fichiers GeoLiteCity-Blocks.csv et GeoLiteCity-Location.csv
Nice post u have here
Added to my RSS reader
Благодарствую, полезная вещь.
Le script donné qui permet de remplir la base de données est un script PHP?
Bonjour Cyril, merci pour ce script qui a l’air fort intéressant !
Mais je ne vois pas ce qu’on doit faire du script pour remplir la base de données.
Ce n’est pas du php mais une commande unix c’est ça ?
Où doit on la copier ?
Dans un fichier sur le serveur puis donner l’adresse à CronJobs ?
Ou copier directement les commandes dans CronJobs ?
Dans les deux cas j’ai des erreurs de la part de CronJobs, j’imagine que ce n’est pas comme ça qu’on procède, si ?
Качественные генераторы – G1, FG, TCC, SDMO, Gesan