web-dev-qa-db-fra.com

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

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

48
Irena

Ce que j'utilise, c'est ip2nation: http://www.ip2nation.com

Il s'agit d'une base de données MySQL totalement gratuite sur les mappages IP/pays. Ils incluent quelques exemples de scripts PHP sur leur site.

Je l'utilise sur mon blog WordPress avec Ozh's free Plugin WordPress pour Nation to Nation

Même si vous n'utilisez pas WordPress, téléchargez le plugin car il vous donnera un bon jeu de code PHP pour accéder à la base de données. Il a même un bel ensemble de minuscules 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é du nom des commentateurs de mon blog.

Vraiment, vous n'avez pas besoin d'une API pour cela. Tout ce dont vous avez besoin est d’une base de données et d’une capacité à écrire le code PHP et le code SQL pour y accéder.

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

Mais ip2nation ne concerne que les pays. Si vous avez besoin de villes et de codes postaux (même s'ils peuvent se tromper, comme indiqué dans d'autres réponses/commentaires), alors en plus de ip2location, vous pouvez essayer GeoBytes . Ils ont des composants spécialement adaptés au contenu de sites Web géographiques, tels que GeoSelect: http://www.geobytes.com/GeoSelect.htm

Aussi recherchez "ip to zipcode" sur Google

11
lkessler

Le meilleur moyen (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 à placer des bannières sur votre site (contrairement à IP2Location). La seule restriction 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, les résultats seront un peu plus lents. Prendre plaisir!

10
8
BobbyShaftoe

J'espère que tous les utilisateurs souhaitant localiser un emplacement à partir d'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'];
}
2
Kapil

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 aussi geoit = ​​json et jsonp)

<result>
<geodata>
  <latt>43.623262</latt>
  <longt>-79.749543</longt>
  <city>MISSISSAUGA</city>
  <prov>ON</prov>
  <postal>L5N7Z9</postal>
  <stnumber>1837</stnumber>
  <staddress>Samuelson CIR</staddress>
  <TimeZone>America/Toronto</TimeZone>
  <AreaCode>289</AreaCode>
  <confidence>1</confidence>
  <intersection>
    <street1>Samuelson Cir</street1>
    <street2>Stockbridge Crt</street2>
    <lattx>43.622696</lattx>
    <longtx>-79.748706</longtx>
    <city>MISSISSAUGA</city>
    <prov>ON</prov>
    <distance>0.179</distance>
  </intersection>
 </geodata>
 </result>
1
Ervin Ruci

Voici une version modifiée d’un extrait que j’ai trouvé et qui utilise http://ipinfodb.com/ip_locator.php pour obtenir ses informations. N'oubliez pas que vous pouvez également demander une clé d'API avec elles et utiliser directement l'API pour obtenir les informations fournies à votre guise. Comme vous pouvez le voir http://ipinfodb.com/ip_location_api.php , ils ont des exemples dans tous les domaines, de PHP à JavaScript et à ASP.Net. Comme indiqué ci-dessous, aucune clé n'est requise car elle affiche leur page publique et celle de Regex à travers la page pour obtenir des informations spécifiées. 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_string($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('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
    if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
    if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
    if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['Zip'] = trim($regs[1]);
    if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
    if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
    if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
    if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($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" }
0
SpYk3HH

En Ruby ... Ce sont les étapes

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

    require "geocoder"

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

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

output: Bellflower, CA 90706, United States

0
Srikanth Lankapalli