Localiser adresse IP

Localiser adresse IP avec IPInfo

Il est parfois intéressant de pouvoir localiser adresse IP afin de localiser la provenance d’un internaute ou utilisateur par exemple.

Localiser adresse IP avec PHP

Il n’existe pas de possibilité de géolocaliser de manière précise une adresse IP via PHP. Pour cela nous sommes obligés de passer par des services externes qui sont accessibles via une API.

Il en existe plusieurs proposant ce type de service :

  • MaxMind
  • IPData.co
  • Ip-api.com
  • Freegeoip.io
  • etc….

Nous allons ici utiliser ipinfo.io qui est très simple à utiliser et qui est accessible gratuitement jusqu’à 1000 requêtes par jour ce qui permet de tester le produit et d’éventuellement passer sur un plan payant si vos besoins sont plus importants.

S’identifier sur IpInfo et récupérer sa clé API

Dans un premier temps, créez-vous un compte sur ipinfo et rendez-vous sur votre compte pour récupérer votre clé API.

Récupérer clé API IpInfo - localiser adresse ip
Récupérer clé API IpInfo

Récupérer adresse IP utilisateur

Avec PHP, habituellement on utilise l’élément REMOTE_ADDR de la variable $_SERVER :

$ip = $_SERVER['REMOTE_ADDR'];

Mais cette variable peut contenir l’adresse IP du proxy de votre utilisateur ce qui ne correspond pas exactement à ce que l’on veut comme information, pour récupérer l’adresse IP de votre utilisateur vous pouvez utiliser ce bout de code :

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

À noter que si votre domaine est configuré sur un CDN de type Cloudflare, vous pourrez récupérer l’adresse IP de vos visiteurs de cette manière :

$_SERVER[« HTTP_CF_CONNECTING_IP »];

Ainsi vous pourrez adapter le code vu au dessus de cette façon :

if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
    $ip = $_SERVER["HTTP_CF_CONNECTING_IP"];
} elseif (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} els$_SERVER["HTTP_CF_CONNECTING_IP"];e {
    $ip = $_SERVER['REMOTE_ADDR'];
}

Utiliser l’API IPInfo

Maintenant que nous avons récupéré l’adresse IP de notre visiteur, nous voulons savoir d’où il vient.

Pour cela nous allons devoir exécuter une requête à l’API d’IPInfo.

Formatage d’une requête

Une requête à l’API IPInfo doit disposer de ce formatage :
https://ipinfo.io/[ADRESSE_IP]/json?token=[CLE_API]

Exemple : https://ipinfo.io/8.8.8.8/json?token=VOTRECLEAPI

Réponse de l’API

L’API va nous retourner une réponse de cette forme :

{
  "ip": "8.8.8.8",
  "hostname": "google-public-dns-a.google.com",
  "city": "Mountain View",
  "region": "California",
  "country": "US",
  "loc": "37.3860,-122.0840",
  "postal": "94035",
  "phone": "650",
  "org": "AS15169 Google LLC"
}

Avec une adresse IP, on peut donc récupérer ces informations :

  • Le nom d’hôte de l’IP
  • La ville de localisation
  • La région
  • Le Pays
  • Les coordonnées GPS
  • Le Code Postal
  • L’indicatif téléphonique
  • Le nom de l’organisation titulaire de l’adresse IP

Vous pouvez avoir des informations supplémentaires, pour cela je vous invite à consulter la documentation.

Exemple simple d’utilisation de l’API avec PHP

Voici un bout de code très simple vous permettant d’afficher les détails d’une adresse IP récupérés grâce à l’API IPInfo :

<?php 

$ip = '8.8.8.8';
$apiKey = 'VOTRECLEAPI';

$apiQuery = 'https://ipinfo.io/%s/json?token=%s';

$apiResult = file_get_contents(sprintf($apiQuery, $ip, $apiKey));
$jsonResult = json_decode($apiResult);

// Affichage
?>
<h1>Détails Adresse IP <?= $ip ?></h1>
<ul>
    <li><strong>Nom d'hôte : </strong> <?= $jsonResult->hostname ?></li>
    <li><strong>Ville : </strong> <?= $jsonResult->city ?></li>
    <li><strong>Région : </strong> <?= $jsonResult->region ?></li>
    <li><strong>Pays : </strong> <?= $jsonResult->country ?></li>
    <li>
        <strong>Coordonnées GPS : </strong> 
        <ul>
            <li><strong>Latitude : </strong> <?= explode(',', $jsonResult->loc)[0] ?></li>
            <li><strong>Longitude : </strong> <?= explode(',', $jsonResult->loc)[1] ?></li>
        </ul>
    </li>
</ul>

À vous de jouer 😉