Géolocalisation, connaître le pays de vos utilisateurs
Divulgâchage : Développeur ou utilisateur d'application, vous avez forcément été confronté au problème de géolocalisation. Avant de rentrer dans des précisions milimétriques, on va aujourd'hui voir comment obtenir le Pays à l'aide des bases de données publiques.
Lorsqu’on développe une application (web ou mobile), on a rapidement besoin de savoir de quel pays viennent nos utilisateurs.
Parfois, c’est pour rendre la navigation plus ergonomique. Même si le navigateur vous envoie la langue de préférence de son utilisateur, il ne vous envoie pas sa localisation. Avec en particulier son fuseau horaire, ce qui peut gêner pour afficher des horaires1.
D’autres fois, c’est pour respecter des contraintes légales. Comme la retransmission vidéo d’événements sportifs pour lesquelles les chaînes de télévisions achètent des droits de diffusions sur des territoires bien délimités2.
Pour être complet, c’est aussi une source d’information pour proposer aux visiteurs des suggestions adaptées ; plus proches de chez eux (ou de leurs préoccupations locales). Que ce soit des actualités, des résultats de recherches ou encore des produits et services spécifiques. La publicité ciblée n’est alors plus très loin.
Mis à part si vos visiteurs vous envoient leur position3, vous en êtes rendu à deviner la (géo)localisation d’après leur adresse IP. Pour ça, vous pouvez obtenir des bases de données faisant ce lien, dont le montant varie en fonction de la précision (géographique et temporelle).
Des entreprises mettent à disposition des bases de géolocalisation mais pour n’obtenir le pays, il serait dommage de payer car, comme on va le voir aujourd’hui, ces informations sont publiques et librement accessible.
Répartition des adresses
Pour tout un tas de raisons techniques, les machines utilisent, pour communiquer sur Internet, des adresses sous la forme d’une suite de bits, des 0 et des 1, de longueur fixe. IPv4 utilise 32 bits qu’on écrit avec 4 nombres (correspondants à des octets). IPv6 en utilise 128 qu’on écrits en hexadécimal.
Pour faciliter le routage des paquets à travers le réseau, ces adresses sont coupées en deux. Le préfixe désigne le réseau et est commun à toutes les machines qui en font partie. Le suffixe désigne la machine, au sein de son réseau. Un réseau pouvant bien sûr être divisé en sous-réseaux (la partie de l’adresse attribuée au réseau augmente, au détriment de celle identifiant la machine) mais c’est une autre histoire.
Pour éviter que ça devienne le bordel, un organisme s’est chargé de superviser globalement l’attribution des adresses IP, l’IANA. Par diplomatie, car on est en 1990 et ça n’aurait pas plut que le réseau mondial soit géré uniquement par les États Unis d’Amériques, l’IANA a délégué ses prérogatives4 à des Registres Internet Régionaux (les RIR), dont le RIPE NCC créé en 1992 pour l’Europe.
Lorsqu’un opérateur de réseau (on parle de Système Autonome) a besoin que des machines soient accessibles, il en fait la demande au registre dont son pays dépend qui lui fournis alors un préfixe réseau libre (s’il en reste).
Obtenir les données
Heureusement pour nous, Internet a été créé par des universitaires idéalistes. Les données concernant son fonctionnement, même si elles ne sont pas faciles à trouver, sont quand même librement accessible au public.
Il en va donc de même avec les attributions des préfixes effectués par les Registres au bénéfice des Opérateurs. On les appelles « RIRs delegation files », ils sont diffusés par les registres et sont mis à jours quotidiennement5. Les voici :
- ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest
- ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-extended-latest
- ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
- ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest
- ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest
Le contenu de ces bases est fourni sous format CSV (où le séparateur est le caractère |). Les détails sont communs et fournis par chaque RIR (i.e. celui du RIPE-NCC car la version de l’APNIC – premier résultat google ;– a une erreur 😉).
En-tête & résumés
La première ligne du fichier sert d’en-tête. Elle permet de déterminer le format et le contenu du fichier. Exemple avec le RIPE-NCC :
2|ripencc|1580684399|210814|19830705|20200202|+0100
Les champs ont la signification suivante :
- Version :
2depuis un bon moment, - Nom du registre :
ripenccici pour le registre européen, - Numéro de série : il doit s’incrémenter à chaque mise à jours, ici c’est un timestamp (
1580684399) mais ça peut aussi être une date (i.e. c’est le choix de l’AFRINIC), - Nombre d’enregistrements : nombre de lignes sans compter l’en-têtes et les résumés,
- Date de départ : date de début de la période,
19830705ici (pour le 5 juillet 1983), certains RIR mettent des 0. - Date de fin : date de la fin de la période,
20200202ici (pour le 2 février 2020), - Décalage horaire UTC : du RIR qui a généré le fichier,
+0100ici.
Suivent ensuite trois lignes de résumés dont le but est de fournir le nombre d’enregistrement pour de chaque type (réseaux IPv4, réseaux IPv6 et intervalles de numéros d’opérateurs). Exemple avec les réseaux IPv4 du RIPE-NCC :
ripencc|*|ipv4|*|81452|summary
Les champs ont la signification suivante :
- Nom du registre : comme précédemment,
*: le caractère « étoile »,- Type d’enregistrement : parmi
ipv4,ipv6etasn, *: le caractère « étoile »,- Nombre d’enregistrements : nombre de lignes pour ce type (et surtout pas le nombre d’adresses),
summary: le mot « summary », avec les étoiles, ils permettent de différentier les lignes de résumé des autres.
Enregistrements
Toutes les autres lignes concernent ces fameux enregistrements. Exemple avec le premier réseau IPv4 alloué en Europe :
ripencc|FR|ipv4|2.0.0.0|1048576|20100712|allocated|ec66869d-4669-423f-8a24-0cb99c3e1491
Les champs sont les suivants :
- Nom du registre : vous commencez a avoir l’habitude,
- Code du pays : sur deux caractères (suivant la norme ISO-3166), ici
FR, - Type d’enregistrement : des fois que la donnée soit pas claire, ici c’est donc
ipv4, - Début d’intervalle : première adresse du réseau ou premier numéro du système autonome, ici c’est le réseau
2.0.0.0, - Taille : pour les réseaux IPv4 et les numéros d’opérateurs, c’est le nombre de ressources (ici,
1048576adresses dans ce réseau), pour les réseaux IPv6, c’est la longueur du préfixe, - Date d’enregistrement : date à laquelle cette ressource a été allouée ou assignée (ici le 12 juillet 2010),
- Statu : alloué (
allocatedici) ou assignée, - ID opaque : identifiant unique qui identifie le propriétaire de la ressource (
ec66869d-4669-423f-8a24-0cb99c3e1491ici pour Orange, ça peut changer d’une version du fichier à l’autre)
Et Voilà… Pour connaître le pays d’une adresse IP, il suffit donc de trouver l’enregistrement correspondant à son réseau6.
Et après
En attendant la suite avec d’autres articles pour obtenir une géolocalisation plus précise (ville ou coordonnées), voici un article sur la complexité algorithmique…
- Complexité algorithmique
-
4 Juin 2018 - tbowan. Quelques explications sur la complexité des algorithmes. Différente mais non moins importante lorsqu'il s'agit d'avoir des applications efficaces.