Ответ 1
Многие люди (включая мою компанию), похоже, используют MaxMind GeoIP.
У них есть бесплатная версия GeoLite, которая не так точна, как платная версия, но если вы просто после чего-то простого, он может быть достаточно хорошим.
Кто-нибудь знает простой способ получить страну для данного IP-адреса? Предпочтительно в формате ISO_3166-1?
Многие люди (включая мою компанию), похоже, используют MaxMind GeoIP.
У них есть бесплатная версия GeoLite, которая не так точна, как платная версия, но если вы просто после чего-то простого, он может быть достаточно хорошим.
Существует два подхода: использование интернет-сервиса и использование какого-либо локального списка (возможно, завернутого в библиотеку). То, что вы хотите, будет зависеть от того, что вы строите.
Для служб:
Для списков:
Вы можете перевернуть свои собственные, загрузив списки из RIR:
ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
Формат документирован в этом README
Здесь хороший бесплатный сервис с открытым API: http://www.hostip.info/use.html
ipinfodb предоставляет бесплатную базу данных и API для IP для страны и наоборот. Они используют бесплатные данные от MaxMind. Данные обновляются каждый месяц, и это отличная бесплатная альтернатива с достойной точностью.
Я не знаю, насколько точным является сайт hostip.info. Я просто открыл этот сайт, и он сообщил, что моя страна - Канада. Я нахожусь в США и интернет-провайдере, который работает в моем офисе только из США. Это позволяет вам исправить это, но если вы используете эту службу для отслеживания веб-сайтов по странам, вы не сможете узнать, правильны ли данные. Конечно, я всего лишь одна точка данных. Я загрузил базу данных GeoLite Country, которая является только CSV файлом, и мой IP-адрес был правильно идентифицирован как US.
Другим преимуществом линейки продуктов MaxMind (платной или бесплатной) является то, что у вас есть данные, вы не подвергаетесь удару производительности при вызове веб-службы в другую систему.
Наиболее точным является Digital Elements NetAcuity... не бесплатно, но вы получаете то, что платите большую часть времени.... Digital Element
google's clientlocation возвращает (мой пример)
latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;
Вы можете использовать решение, предоставленное для этого вопроса.
Но он возвращает 2-значный код страны.
Попробуйте этот php-код
<?php $ip = $_SERVER['REMOTE_ADDR'];
$json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
$json = json_decode($json,true);
$timezone = $json[localTimeZone];?>
Для этого вы можете использовать мой сервис http://ipinfo.io. API возвращает целую кучу разных сведений об IP-адресе:
$ curl ipinfo.io/8.8.8.8
{
"ip": "8.8.8.8",
"hostname": "google-public-dns-a.google.com",
"loc": "37.385999999999996,-122.0838",
"org": "AS15169 Google Inc.",
"city": "Mountain View",
"region": "CA",
"country": "US",
"phone": 650
}
Если вы только после кода страны вам просто нужно добавить/страну в URL-адрес:
$ curl ipinfo.io/8.8.8.8/country
US
Вот общая функция PHP, которую вы могли бы использовать:
function ip_details($ip) {
$json = file_get_contents("http://ipinfo.io/{$ip}");
$details = json_decode($json);
return $details;
}
$details = ip_details("8.8.8.8");
echo $details->city; // => Mountain View
echo $details->country; // => US
echo $details->org; // => AS15169 Google Inc.
echo $details->hostname; // => google-public-dns-a.google.com
Я использовал IP 8.8.8.8 в этих примерах, но если вы хотите, чтобы данные для IP-адреса пользователя передавались только в $_SERVER['REMOTE_ADDR']
. Более подробную информацию можно найти на http://ipinfo.io/developers
используйте функцию ipToCountry ($ ip) из http://www.mmtutorialvault.com/php-ip-to-country-function/
вы можете использовать API веб-сервиса, который выполняет следующие действия:
see example of service: http://ip-api.com and usage: http://whatmyip.info