Определение страны посетителя сайта по его IP
Не секрет, что диапазоны 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
Онлайн-сервис определения страны и города подключается к сайту следующим образом:
<script src="http://www.geoplugin.net/javascript.gp" type="text/javascript"></script>
После подключения можно вызывать следующие методы:
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:
Достоинство - кроме страны можно получить информацию о валюте и ее код (₴, €, ₽).
Недостаток - запросы по HTTPS платные, подписка стоит €12 в год.
ipinfo.io
Открытый сервис, позволяющий бесплатно делать до 1000 запросов в сутки .
Чтобы вызвать его в js используется код
В ответе вы получите:
"ip" - IP адрес пользователя "hostname" - обратный IP "city" - предположительный город, в котором находится пользователь "region" - регион (область, район) "country" - страна в виде двухбуквенного кода "loc" - координаты широты и долготы "org" - информация о провайдере
Сервис поддерживает HTTPS, можно использовать его на сайтах с поддеpжкой HTTPS. Чтобы избежать проблем с кросс-доменными запросами, которые Chrome ограничивает, можно воспользоваться поддержкой JSONP:
Практически полный клон ipinfo - сервис ipapi.co. Также ограничивает бесплатное использование 1000 запросов в сутки .
freegeoip.net
Сервис, предлагающий открытый HTTP и HTTPS API, позволяющий получить информацию в форматах CSV, XML или JSON.
Для бесплатного использования предлагается 10 000 запросов в час .
Сервис также поддеживает JSONP:
"ip" - непосредственно IP адрес "country_code" - двухбуквенный код страны "country_name" - название страны на английском языке "region_code" - код региона "region_name" - название региона "city" - город "zip_code" - почтовый код (США) "time_zone" - временная зона "latitude"- широта "longitude" - долгота "metro_code" - метро
Вместо выводов
По результатам наблюдений все приведенные сервисы (кроме MaxMind, который в испытаниях не участвовал, и вообще приведен в статье лишь для полноты картины) правильно определили страну и код страны, geoPlugin сумел правильно определить валюту. Только сервис ipinfo правильно определил область, но промахнулся с городом, а ни один другой сервис город и область не определили совсем (вернули null, 0 или пустое значение).