Как определить почтовый индекс и город с IP-адреса?

Я ищу совет для открытых API или продуктов сторонних разработчиков, которые помогут преобразовать IP-адрес в почтовый индекс и город, чтобы сделать гео-специфический контент веб-сайта.

Ответ 1

Я использую ip2nation: http://www.ip2nation.com

Это полностью бесплатная база данных MySQL по IP для сопоставлений стран. Они включают в себя несколько примеров PHP-скриптов на своем сайте.

Я использую его в своем блоге WordPress вместе с Ozh бесплатно IP для Nation WordPress Plugin

Даже если вы не используете WordPress, загрузите плагин, так как он даст вам хороший набор PHP-кода для доступа к базе данных. У него даже есть хороший набор крошечных флагов страны, которые вы можете отобразить рядом или вместо имени страны, что я делаю, чтобы автоматически показывать флажки следующим именам моих комментариев в блоге.

Действительно, для этого вам не нужен API. Все, что вам нужно, это база данных и возможность писать код PHP и SQL для доступа к ней.

Я бы не рекомендовал ip2location для повседневного использования. Они много платят за свои базы данных, а их базы данных очень большие и имеют более подробную информацию, чем большинство людей.

Но ip2nation переходит только на уровень страны. Если вам нужны города и почтовые индексы (несмотря на то, что они могут ошибаться, как заявили другие ответы/комментарии), то помимо ip2location вы можете попробовать GeoBytes. У них есть компоненты, специально предназначенные для гео-специфического содержимого веб-сайта, такие как GeoSelect: http://www.geobytes.com/GeoSelect.htm

Также найти "ip to zipcode" в Google.

Ответ 2

Лучший (что означает легко интегрировать и бесплатно), который я нашел, доступен здесь. Услуга полностью бесплатна, не требует каких-либо локальных установок и не заставляет вас размещать баннеры на вашем сайте (в отличие от IP2Location). Единственное ограничение, которое у них есть, ограничение на запрос, очень разумно: вы можете запускать запрос каждые 2 секунды, и даже если вы делаете более частые запросы, вы получите результаты чуть медленнее. Наслаждайтесь!

Ответ 4

Я надеюсь, что все пользователи, которые хотят получить местоположение от IP-адреса, получат правильное решение с использованием этого небольшого кода.

$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'];
}

Ответ 5

Geocoder.ca дает много информации для IP-адресов (только в Северной Америке) например, http://geocoder.ca/99.229.2.190?geoit=xml (также поддерживает geoit = ​​json и 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>

Ответ 6

Ниже приведена модифицированная версия найденного фрагмента, который использует http://ipinfodb.com/ip_locator.php для получения информации. Имейте в виду, вы также можете подать заявку на ключ API с ними и использовать API напрямую, чтобы получить предоставленную информацию по своему усмотрению. Как вы можете видеть http://ipinfodb.com/ip_location_api.php, у них есть примеры во всем: от PHP до JavaScript, до ASP.Net. Как отмечено ниже, ниже не требуется ключ, поскольку он вытаскивает свою общедоступную страницу и Regex через страницу, чтобы получить указанную информацию. Ключ бесплатный.

Отрывок

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;
}

Использовать

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" }

Ответ 7

В Ruby... Это шаги

  • Установить геокодер gem gem install geocoder
  • В рубине script введите следующие строки.

    require "geocoder"

    puts Geocoder.address('76.95.251.102');//Соответственно изменим IP-адрес.

  • Запустите script, чтобы получить город, штат, почтовый индекс, страну

output: Bellflower, CA 90706, United States