Comment déterminer un code postal et une ville à partir d’une adresse IP?

Je suis à la recherche de conseils pour une API ouverte ou des produits de fête en 3D qui aideront à convertir une adresse IP en code postal et en ville, pour créer un contenu de site Web géo-spécifique.

Ce que j’utilise est ip2nation: http://www.ip2nation.com

C’est une firebase database MySQL entièrement gratuite de mappages IP vers pays. Ils incluent quelques exemples de scripts PHP sur leur site.

Je l’utilise sur mon blog WordPress en même temps que le plugin IP to Nation Word gratuit de Ozh

Même si vous n’utilisez pas WordPress, téléchargez le plug-in car il vous donnera un bon ensemble de code PHP pour accéder à la firebase database. Il a même un joli ensemble de petits drapeaux de pays que vous pouvez afficher à côté ou à la place du nom du pays, ce que je fais pour afficher automatiquement les drapeaux à côté des noms des commentateurs de mon blog.

En réalité, vous n’avez pas besoin d’une API pour cela. Tout ce dont vous avez besoin est la firebase database et la possibilité d’écrire le code PHP et SQL pour y accéder.

Je ne recommanderais pas ip2location pour une utilisation occasionnelle. Ils facturent beaucoup pour leurs bases de données et leurs bases de données sont très volumineuses et ont plus de détails que la plupart des gens en ont besoin.

Mais ip2nation ne va qu’au niveau du pays. Si vous avez besoin de Cities et de Zipcodes (en dépit du fait qu’ils peuvent être erronés, comme d’autres réponses / commentaires l’ont indiqué), en plus de ip2location, vous pouvez essayer GeoBytes . Ils ont des composants spécialement adaptés au contenu de site Web géo-spécifique, tel que GeoSelect: http://www.geobytes.com/GeoSelect.htm

Recherchez également “ip to zipcode” sur Google .

Le mieux (ce qui signifie facile à intégrer et gratuit) que j’ai trouvé est disponible ici . Le service est entièrement gratuit, ne nécessite aucune installation locale et ne vous oblige pas à mettre des bannières sur votre site (par opposition à IP2Location). La seule ressortingction dont ils disposent, la limite de requête, est très raisonnable: vous pouvez lancer une requête toutes les 2 secondes, et même si vous effectuez des requêtes plus fréquentes, vous obtiendrez un résultat un peu plus lent. Prendre plaisir!

J’espère que tous les utilisateurs qui veulent récupérer leur adresse depuis une adresse IP obtiendront une solution appropriée en utilisant ce petit code.

 $ip_addr = $_SERVER['REMOTE_ADDR']; $geoplugin = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip_addr) ); if ( is_numeric($geoplugin['geoplugin_latitude']) && is_numeric($geoplugin['geoplugin_longitude']) ) { $lat = $geoplugin['geoplugin_latitude']; $long = $geoplugin['geoplugin_longitude']; } 

Geocoder.ca donne beaucoup d’informations sur les adresses IP (Amérique du Nord uniquement), par exemple, http://geocoder.ca/99.229.2.190?geoit=xml (supporte également geoit = ​​json et jsonp)

   43.623262 -79.749543 MISSISSAUGA ON L5N7Z9 1837 Samuelson CIR America/Toronto 289 1  Samuelson Cir Stockbridge Crt 43.622696 -79.748706 MISSISSAUGA ON 0.179    

Ce qui suit est une version modifiée d’un extrait de code que j’ai trouvé qui utilise http://ipinfodb.com/ip_locator.php pour obtenir ses informations. Gardez à l’esprit que vous pouvez également demander une clé API avec eux et utiliser l’API directement pour obtenir les informations fournies comme vous le souhaitez. Comme vous pouvez le voir sur http://ipinfodb.com/ip_location_api.php , ils ont des exemples dans tout, de PHP à JavaScript, en passant par ASP.Net. Comme indiqué ci-dessous, il n’est pas nécessaire d’avoir une clé pour extraire la page publique et Regex via la page pour obtenir des informations spécifiques. Les clés sont gratuites.

Fragment

 function detect_location($ip=NULL, $asArray=FALSE) { if (empty($ip)) { 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']; } } elseif (!is_ssortingng($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') { $ip = '8.8.8.8'; } $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip); $i = 0; $content; $curl_info; while (empty($content) && $i < 5) { $ch = curl_init(); $curl_opt = array( CURLOPT_FOLLOWLOCATION => 1, CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $url, CURLOPT_TIMEOUT => 1, CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'], ); if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT']; curl_setopt_array($ch, $curl_opt); $content = curl_exec($ch); if (!is_null($curl_info)) $curl_info = curl_getinfo($ch); curl_close($ch); } $araResp = array(); if (preg_match('{
  • City : ([^<]*)
  • }i', $content, $regs)) $araResp['city'] = sortingm($regs[1]); if (preg_match('{
  • State/Province : ([^<]*)
  • }i', $content, $regs)) $araResp['state'] = sortingm($regs[1]); if (preg_match('{
  • Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]); if (preg_match('{
  • Zip or postal code : ([^<]*)
  • }i', $content, $regs)) $araResp['zip'] = sortingm($regs[1]); if (preg_match('{
  • Latitude : ([^<]*)
  • }i', $content, $regs)) $araResp['latitude'] = sortingm($regs[1]); if (preg_match('{
  • Longitude : ([^<]*)
  • }i', $content, $regs)) $araResp['longitude'] = sortingm($regs[1]); if (preg_match('{
  • Timezone : ([^<]*)
  • }i', $content, $regs)) $araResp['timezone'] = sortingm($regs[1]); if (preg_match('{
  • Hostname : ([^<]*)
  • }i', $content, $regs)) $araResp['hostname'] = sortingm($regs[1]); $strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN'; return $asArray ? $araResp : $strResp; }

    Utiliser

     detect_location(); // returns "CITY, STATE" based on user IP detect_location('xxx.xxx.xxx.xxx'); // returns "CITY, STATE" based on IP you provide detect_location(NULL, TRUE); // based on user IP // returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" } detect_location('xxx.xxx.xxx.xxx', TRUE); // based on IP you provide // returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" } 

    En Ruby … Ce sont les étapes

    1. Installer gem geocoder gem install geocoder
    2. Dans un script Ruby, ayez ces lignes.

      require "geocoder"

      puts Geocoder.address('76.95.251.102'); // Change l’adresse IP en conséquence.

    3. Exécuter le script pour obtenir la ville, l’état, le code postal, le pays

    output: Bellflower, CA 90706, United States