Не секрет, что диапазоны 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 или пустое значение).

3 комментарий для “Определение страны посетителя сайта по его IP”
  1. На сегодняшний день при таком массовом использовании VPN мне кажеться опредилить местоположение только по IP будет затруднительно.

  2. Спасибо за пост!
    Жаль, только что они не позволяют получить русские имена страны, области, города.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *