Géolocalisation, connaître le pays de vos utilisateurs

tbowan

5 Février 2020

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 insensée, 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.

Illustration de Pexels

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és.

C’est ainsi qu’en France, les fans de vrai football doivent tricher et utiliser des VPN pour regarder la meilleure équipe du monde (sur la RTBF).

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 position2, 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érogatives à des Registres Internet Régionaux (les RIR), dont le RIPE NCC créé en 1992 pour l’Europe.

La bonne blague, c’est que les registres régionaux, sentant qu’il serait bien pratique de se regrouper pour s’organiser, ont fondé le NRO, un nouvel organisme pour centraliser leurs activités…

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.

Illustration de Pexels

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 quotidiennement. Les voici :

Si vous êtes fans de statistiques ou avez une approche un peu plus touristique de ces histoires d’attributions d’adresses, je vous suggère l’excellente page de statistiques de Patrick Maigron. Entre autres choses, vous y trouverez l’historique d’utilisation des préfixes et des cartes géographiques pour la répartition (inégale) entre pays.

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 :

  1. Version : 2 depuis un bon moment,
  2. Nom du registre : ripencc ici pour le registre européen,
  3. 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),
  4. Nombre d’enregistrements : nombre de lignes sans compter l’en-têtes et les résumés,
  5. Date de départ : date de début de la période, 19830705 ici (pour le 5 juillet 1983), certains RIR mettent des 0.
  6. Date de fin : date de la fin de la période, 20200202 ici (pour le 2 février 2020),
  7. Décalage horaire UTC : du RIR qui a généré le fichier, +0100 ici.

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 :

  1. Nom du registre : comme précédemment,
  2. * : le caractère « étoile »,
  3. Type d’enregistrement : parmi ipv4, ipv6 et asn,
  4. * : le caractère « étoile »,
  5. Nombre d’enregistrements : nombre de lignes pour ce type (et surtout pas le nombre d’adresses),
  6. 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 :

Et Voilà… Pour connaître le pays d’une adresse IP, il suffit donc de trouver l’enregistrement correspondant à son réseau.

Les RIR ont officiellement communiqué qu’ils ne sont pas des fournisseurs de données de géolocalisation et qu’on devrait plutôt utiliser les bases fournies par de entreprises dont c’est le métier. Mais comme ici, on ne s’intéressait qu’au pays (et pas aux villes ou aux coordonnées), les données des RIRs nous suffiront amplement.

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.


  1. Sans géolocalisation, on doit déléguer à un bout de JS la tâche de localiser les horodatages.↩︎

  2. Véridique, les navigateurs ont maintenant une API pour avoir les coordonnées. Heureusement, si l‘application veut vos donnée, le navigateur vous demandera la permission (que vous devriez refuser) avant de les lui fournir.↩︎