freegeoip.net est une API REST publique permettant de géolocaliser une adresse IP (ou un nom de domaine). L'API est limitée à 10000 appels par heures (ce qui semble suffisant), cependant, si vous souhaitez outrepasser cette limite, vous pouvez héberger vous-même ce service puisque freegeoip est open source. Vous trouverez les sources sur GitHub.

S'agissant d'un webservice REST, l'utilisation est très simple, il vous suffti d'appeller l'URL suivante :

	freegeoip.net/{format}/{ip_ou_nom_de_domaine}

Les formats supportés sont: JSON, CSV, et XML.

Voici un petit snippet permettant d'appeler ce service en CURL:

    //test sur une IP de google
    $api = 'http://freegeoip.net/json/173.194.67.94';
    
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $api);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
    $data = curl_exec($curl);
    curl_close($curl);

Voici la chaine JSON récupérée :

{"ip":"173.194.67.94","country_code":"US","country_name":"United States","region_code":"CA","region_name":"California","city":"Mountain View","zipcode":"94043","latitude":37.4192,"longitude":-122.0574,"metro_code":"807","areacode":"650"}

Vous n'avez plus qu'à modifier le code ci-dessus pour l'intégrer dans une fonction et voilà, le tour est joué ! En retournant "json_decode($data)" vous obtiendrez un objet avec les attributs suivants : ip, country_code, country_name, region_code, region_name, city, zipcode, latitude, longitude, metro_code, area_code.

Ce petit service va vous permettre, par exemple, de personnaliser votre site web en fonction de la localisation de vos visiteurs (langue par défaut, indicatif téléphonique, affichage d'un drapeau etc.).