Наверх

Определение страны посетителя сайта по его 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:

$.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 или пустое значение).

Всего отзывов: 1

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

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

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