Я ищу совет для открытых API или продуктов сторонних разработчиков, которые помогут преобразовать IP-адрес в почтовый индекс и город, чтобы сделать гео-специфический контент веб-сайта.
Как определить почтовый индекс и город с 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
Ответ 2
Лучший (что означает легко интегрировать и бесплатно), который я нашел, доступен здесь. Услуга полностью бесплатна, не требует каких-либо локальных установок и не заставляет вас размещать баннеры на вашем сайте (в отличие от IP2Location). Единственное ограничение, которое у них есть, ограничение на запрос, очень разумно: вы можете запускать запрос каждые 2 секунды, и даже если вы делаете более частые запросы, вы получите результаты чуть медленнее. Наслаждайтесь!
Ответ 3
IP2Location
Ответ 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