Digital Dynamics
L'informatique innovante et abordable

Dernière mise à jour : ven. 08 févr. 2019, 11:18

Utilisation de GeoIP2, le successeur de GeoIP pour la géolocalisation des adresses IP

Dans un tutoriel précédent, nous abordions l'utilisation de GeoIP et de la mise à jour automatique de la base de données dans le but de géolocaliser des adresses IP.

Or depuis janvier 2019, MaxMind, l'éditeur de la base de donnée, a abandonné GeoIP au profit de GeoIP2 qui permet notamment de géolocaliser des adresses IPv6 en plus des adresses IPv4.

 

Téléchargement et mise à jour de la base de données

Les informations de la base de données (GeoLite2-City) sont mises à jour le premier mardi de chaque mois. Nous allons donc créer un fichier #bash que nous exécuterons chaque mois.

Créer un répertoire pour notre projet (ici "/home/username/geoip2") et y placer le fichier suivant que nous appellerons "geoip2.sh".

#!/bin/bash
geoip_dir='/home/username/geoip2';
dat_file_url='https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz';
# Se rend dans le dossier renseigné par la variable "geoip_dir"
cd $geoip_dir;
# Télécharge l'archive de la base zippée
/usr/bin/wget $dat_file_url;
# Sauvegarde la base actuelle et la renomme en ".bak" 
mv -f GeoLite2-City.mmdb GeoLite2-City.mmdb.bak
# Décompresse l'archive nouvellement téléchargée
tar xvzf GeoLite2-City.tar.gz
# Déplace la base depuis le nouveau répertoire "GeoLite2-City_XXXXX" vers la racine du projet (geoip2)
mv ./GeoLite2-City*/GeoLite2-City.mmdb ./GeoLite2-City.mmdb
# Grand nettoyage: répertoire décompressé et archive
rm -rf ./GeoLite2-City*/
rm -f GeoLite2-City.tar.gz

 

Une fois le fichier ".sh" enregistré, se rendre dans la console, naviguer jusqu'à la racine du projet (ici "/home/username/geoip2") et taper la commande suivante pour rendre le fichier exécutable.

chmod +x geoip2.sh

Exécution automatique de la mise à jour

Le fichier "geoip2.sh" s'occupant de toutes les manipulations nécessaires, il faut maintenant l'exécuter chaque mois. Comme la mise à jour a lieu le premier mardi de chaque mois, mais ne connaissant ni l'heure ni le fuseau horaire, je conseille d'effectuer la mise à jour le premier mercredi de chaque mois (à 8h05 AM pour être précis) et de sauvegarder le résultat des opérations dans un fichier log (ici "/var/log/GeoIP2.log"). Pour ce faire, voici les instructions que nous allons exécuter dans la console pour créer la tâche CRON:

# Ouvrir crontab dans la console:
crontab -e
# Dans crontab taper la commande suivante:
5 8 * * 3 [ `date +\%d` -le 7 ] && /home/username/geoip2.sh >> /var/log/GeoIP2.log 2>&1
# Ctrl + 'x' pour quitter crontab et 'O' ou 'Y' pour sauvegarder et installer l'instruction

oo

Installation de la nouvelle API GeoIP2

Avec la nouvelle version de la base de données, l'utilisation de la nouvelle version de l'API, GeoIP2, est obligatoire. 

Dans ce tutoriel, nous alons nous concentrer sur PHP avec lequel une installation simplifiée par Composer est disponible.

Cette page liste les autres formats disponibles (Ruby, .NET, Java, Node.js...) pour ceux que cela intéresserait...

Dans la console:

# Se placer dans le répertoire racine du projet
cd geoip2

#Télécharger Composer et l'exécuter dans votre nouveau répertoire (ici geoip2)
curl -sS https://getcomposer.org/installer | php
# vous devriez trouver un fichier "composer.phar" dans votre répertoire

# Installation des dépendances
php composer.phar require geoip2/geoip2:~2.0
# Vous devriez maintenant trouver les fichiers "composer.json" et "composer.lock" ainsi que le répertoire "vendor"

 

Voici à quoi devrait ressembler votre répertoire "/home/username/geoip2"

Liste des fichiers répertoire GeoIP2

Exemple d'utilisation et code PHP

Les parties configuration et installation étant terminées, place à la partie fun: le développement !

<?php
require_once __DIR__ .'/vendor/autoload.php';
use GeoIp2DatabaseReader;

// Crée une instance du reader que nous pourrons utiliser
$reader = new Reader(__DIR__ .'/GeoLite2-City.mmdb');

// Remplacer "city" par la méthode de votre base de données (ex: "country").
$record = $reader->city($_SERVER['REMOTE_ADDR']);
?>

$record->country->isoCode =><?=$record->country->isoCode?> <br />

$record->country->name =><?=$record->country->name?> <br />

$record->country->names['zh-CN'] =><?=$record->country->names['zh-CN']?> <br />

$record->mostSpecificSubdivision->name =><?=$record->mostSpecificSubdivision->name?> <br />

$record->mostSpecificSubdivision->isoCode =><?=$record->mostSpecificSubdivision->isoCode?> <br />

$record->city->name =><?=$record->city->name?> <br />

$record->postal->code =><?=$record->postal->code?> <br />

$record->location->latitude =><?=$record->location->latitude?> <br />

$record->location->longitude =><?=$record->location->longitude?> <br />

 

Si tout c'est bien déroulé, vous devriez obtenir un résultat tel que celui-ci:

Résultat du test GeoIP2

 

Personnalisation de la langue (localization en anglais)

Les résultats obtenus, nom des villes et des pays notamment, sont fournis en anglais par défaut. Une personnalisation de la langue est possible et très simple.

Il suffit de préciser la langue en question avec son code (fr, en, de, nl...) lors de l'instanciation de la classe.

<?php
require_once __DIR__ .'/vendor/autoload.php';
use GeoIp2DatabaseReader;

// Crée une instance du reader qui va générer les noms en français avec un fallback en anglais
$reader = new Reader(__DIR__ .'/GeoLite2-City.mmdb',array('fr','en'));


// Crée une instance du reader qui va générer les noms en espagnol avec un fallback en portugais
$reader = new Reader(__DIR__ .'/GeoLite2-City.mmdb',array('es','pt'));

 

 

Notez que la base GeoLite2-City vous donne des résultats "d'une précision relative" mais suffisants pour avoir une  idée de l'emplacement de l'adresse (+/- 10Km environ). Pour une géolocalisation exacte, il convient d'utiliser les bases payantes de MaxMind...

 

L'informatique facile et expliquée