Не секрет, что диапазоны IP адресов распределены между странами мира, то есть зная IP можно достаточно точно определить, в какой стране находится пользователь. Иногда даже можно определить его город и координаты (но вот на точность этих данных полагаться уже не стоит).
Существует множество способов определить страну по IP. Это либо базы адресов, развертываемые прямо на сервере, либо онлайн-сервисы, возвращающие информацию об адресе в структурированном формате. Большинство этих сервисов, конечно, имеют ограничения, и для использования в крупных проектах требуют покупки лицензии или подписки, но попробовать их можно и бесплатно.
MaxMind
GeoIP2 сервис, практически монополист на рынке, предлагающий платные услуги по определению страны, города и других параметров.
Достоинство — самые актуальные базы и различные подходы к повышению точности определения.
Недостаток — услуга использования онлайн-сервиса платная, 0,0001 $ за запрос, причем платить нужно вперед. Однако, можно скачать бесплатную версию баз GeoLite2 Country или GeoLite2 City, разместить ее на сервере (для этого нужно иметь доступ к файловой системе), и использовать в C#, Java или php проекте (список поддерживаемых API).
Рассматривать этот сервис подробно не будем, перейдем к более простым решениям.
ip2nation.com
Это MySQL база данных с информацией о соответствии адреса стране. Скачать для размещения ее на собственном сервере можно здесь.
Пример на php, позволяющий вывести полное название страны:
<?php
$server = ''; // MySQL hostname
$username = ''; // MySQL username
$password = ''; // MySQL password
$dbname = ''; // MySQL db name
$db = mysql_connect($server, $username, $password) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());
$sql = 'SELECT
c.country
FROM
ip2nationCountries c,
ip2nation i
WHERE
i.ip < INET_ATON("'.$_SERVER['REMOTE_ADDR'].'")
AND
c.code = i.country
ORDER BY
i.ip DESC
LIMIT 0,1';
list($countryName) = mysql_fetch_row(mysql_query($sql));
echo $countryName; // Вывести полное название страны
?>
geoPlugin
Онлайн-сервис определения страны и города подключается к сайту следующим образом:
После подключения можно вызывать следующие методы:
geoplugin_request() — IP
geoplugin_status() — статус (200б 4040 и т. д.)
geoplugin_credit() — благодарности сервису MaxMind, упомянутому чуть выше.
geoplugin_city() — город
geoplugin_region() — область или регион
geoplugin_areaCode() — код зоны
geoplugin_dmaCode() — американский код из трех цифр, определяющий набор поддерживаемых телеканалов
geoplugin_regionCode() — код региона
geoplugin_regionName() — название региона
geoplugin_countryCode() — двухбуквенный код страны
geoplugin_countryName() — название страны на английском языке
geoplugin_continentCode() — код континента (например EU — Европа)
geoplugin_latitude() — широта
geoplugin_longitude() — долгота
geoplugin_currencyCode() — трехбуквенный код валюты страны
geoplugin_currencySymbol() — символ валюты страны
Также можно не подключать библиотеку, а использовать JSONP:
$.getJSON("http://www.geoplugin.net/json.gp?jsoncallback=?", function (response) {
for (var i in response) {
document.write('response[' + i + '] = ' + response[i]+ '<br/>');
}
});
Достоинство — кроме страны можно получить информацию о валюте и ее код (₴, €, ₽).
Недостаток — запросы по HTTPS платные, подписка стоит €12 в год.
ipinfo.io
Открытый сервис, позволяющий бесплатно делать до 1000 запросов в сутки.
Чтобы вызвать его в js используется код
$.getJSON('http://ipinfo.io', function(response){
console.log(response);
})
В ответе вы получите:
«ip» — IP адрес пользователя
«hostname» — обратный IP
«city» — предположительный город, в котором находится пользователь
«region» — регион (область, район)
«country» — страна в виде двухбуквенного кода
«loc» — координаты широты и долготы
«org» — информация о провайдере
Сервис поддерживает HTTPS, можно использовать его на сайтах с поддеpжкой HTTPS. Чтобы избежать проблем с кросс-доменными запросами, которые Chrome ограничивает, можно воспользоваться поддержкой JSONP
$.get("https://ipinfo.io?callback=?", function(response) {
$('body').text(response.ip+ ' from ' +response.country); // вывести IP и страну посетителя.
}, "jsonp")
Практически полный клон ipinfo — сервис ipapi.co. Также ограничивает бесплатное использование 1000 запросов в сутки.
freegeoip.net
Сервис, предлагающий открытый HTTP и HTTPS API, позволяющий получить информацию в форматах CSV, XML или JSON.
Для бесплатного использования предлагается 10 000 запросов в час.
Сервис также поддеживает JSONP:
$.getJSON("https://freegeoip.net/json/?callback=", function (response) {
$('body').text(response.country_name);
}
Возвращаемые параметры:
«ip» — непосредственно IP адрес
«country_code» — двухбуквенный код страны
«country_name» — название страны на английском языке
«region_code» — код региона
«region_name» — название региона
«city» — город
«zip_code» — почтовый код (США)
«time_zone» — временная зона
«latitude»- широта
«longitude» — долгота
«metro_code» — метро
Вместо выводов
По результатам наблюдений все приведенные сервисы (кроме MaxMind, который в испытаниях не участвовал, и вообще приведен в статье лишь для полноты картины) правильно определили страну и код страны, geoPlugin сумел правильно определить валюту. Только сервис ipinfo правильно определил область, но промахнулся с городом, а ни один другой сервис город и область не определили совсем (вернули null, 0 или пустое значение).
На сегодняшний день при таком массовом использовании VPN мне кажеться опредилить местоположение только по IP будет затруднительно.
Дякую, дуже корисна програма, давно шукав відповідь на це питання.
Спасибо за пост!
Жаль, только что они не позволяют получить русские имена страны, области, города.