→ Получение страны по ip php. Определение города посетителя. PHP GeoIP — стандартный функционал стороннего производства

Получение страны по ip php. Определение города посетителя. PHP GeoIP — стандартный функционал стороннего производства

Не секрет, что диапазоны IP адресов распределены между странами мира, то есть зная IP можно достаточно точно определить, в какой стране находится пользователь. Иногда даже можно определить его город и координаты (но вот на точность этих данных полагаться уже не стоит).

Существует множество способов определить страну по IP. Это либо базы адресов, развертываемые прямо на сервере, либо онлайн-сервисы, возвращающие информацию об адресе в структурированном формате. Большинство этих сервисов, конечно, имеют ограничения, и для использования в крупных проектах требуют покупки лицензии или подписки, но попробовать их можно и бесплатно.

MaxMind

GeoIP2 сервис, практически монополист на рынке, предлагающий платные услуги по определению страны, города и других параметров.

Достоинство - самые актуальные базы и различные подходы к повышению точности определения.

Недостаток - услуга использования онлайн-сервиса платная, 0,0001 $ за запрос, причем платить нужно вперед. Однако, можно скачать бесплатную версию баз GeoLite2 Country или GeoLite2 City, разместить ее на сервере (для этого нужно иметь доступ к файловой системе), и использовать в C#, Java или php проекте (список поддерживаемых API).

Рассматривать этот сервис подробно не будем, перейдем к более простым решениям.

ip2nation.com

Это MySQL база данных с информацией о соответствии адреса стране. Скачать для размещения ее на собственном сервере можно .

Пример на php, позволяющий вывести полное название страны:

geoPlugin

Онлайн-сервис определения страны и города подключается к сайту следующим образом:

< script src= "http://www.geoplugin.net/javascript.gp" type= "text/javascript" >

После подключения можно вызывать следующие методы:

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] + "
" ) ; } } ) ;

$.getJSON("http://www.geoplugin.net/json.gp?jsoncallback=?", function (response) { for (var i in response) { document.write("response[" + i + "] = " + response[i]+ "
"); } });

Достоинство - кроме страны можно получить информацию о валюте и ее код (₴, €, ₽).

Недостаток - запросы по HTTPS платные, подписка стоит €12 в год.

ipinfo.io

Открытый сервис, позволяющий бесплатно делать до 1000 запросов в сутки .

Чтобы вызвать его в js используется код

$.getJSON ("http://ipinfo.io" , function (response) { console.log (response) ; } )

$.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.

Сервис также поддеживает JSONP:

$.getJSON ("https://freegeoip.net/json/?callback=" , function (response) { $("body" ) .text (response.country_name ) ; } } ) ;

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

В которой упоминался мой «велосипед» отличающийся высокой скоростью работы. Одним из популярных вопросов стала возможность определения города по IP.

И вот несколько месяцев спустя, проект начинавшийся, как «for fun» перерос в самостоятельный проект.
Открыт отдельный сайт посвященный проекту Sypex Geo , на котором можно скачать свежие версии API и баз данных, а также ознакомиться с документацией.

Для желающих скорее протестировать правильность определения города по IP - вот ссылка на демо-страницу . А под хабракатом, я опишу некоторые технические подробности и приведу результаты небольшого тестирования.

Формат Sypex Geo 2.1 С момента публикации последней статьи, формат Sypex Geo (сокращенно SxGeo) был оптимизирован, а также добавлена возможность включения в БД двух справочников - городов и регионов.

При создании нового формата, ставились следующие приоритеты:

  • высокая скорость
  • низкое потребление ресурсов
  • открытость (спецификации формата бинарного файла БД и API открыты)
  • универсальность (возможность создания баз данных с любыми наборами данных)
Формат позволяет хранить данные в разной кодировке. После выхода из беты, будут опубликованы скрипты для конвертирования базы данных из MySQL в бинарный файл БД.

В БД хранится следующая информация:

  • ID страны
  • Код страны ISO 3166-1 (двухсимвольный)
  • Код региона FIPS 10-4 (двухсимвольный)
  • Название региона (опционально)
  • Город
  • Широта
  • Долгота
  • Timezone (опционально)
Этот список может быть изменен и/или расширен при необходимости. Более подробную информацию о формате SxGeo 2.1 можно найти на сайте. Собственная база данных После весьма близкого знакомства с популярной системой геолокации GeoLite City от MaxMind, было принято решение о создании собственной базы данных. Проблема заключается в том, что в GeoLite City очень много неточностей, мусора, городов дубликатов, излишнего дробления диапазонов, а также проблем с городами бывшего СССР (например, вместо городов взяты названия фирм или имена ответственных из Whois).

В данный момент база основана на GeoLite City, но уже содержит полностью переработанное покрытие России, Украины и Беларуси. Постепенно будут уточняться другие страны, в первую очередь СНГ и Европа. База данных Sypex Geo City содержит названия городов и регионов на русском языке в UTF-8 (встречаются еще не переведенные названия), а также timezone.

Кроме того на сайте доступны другие базы данных преобразованные в формат SxGeo 2.1.

Использование Использование Sypex Geo API максимально упрощено.
1. Скопировать SxGeo.php и SxGeoCity.dat (или другие базы) на сервер 2. Подключить файл SxGeo.php в свой скрипт, добавив строку include("SxGeo.php"); 3. Создать объект SxGeo //$SxGeo = new SxGeo(); // Режим по умолчанию, файл бд SxGeo.dat $SxGeo = new SxGeo("SxGeoCity.dat", SXGEO_BATCH | SXGEO_MEMORY); // Самый быстрый режим 4. Определяем город (SxGeo City, GeoLite City, IpGeoBase) $SxGeo->get($ip); (возвращает информацию о городе, без названия региона и временной зоны) // $SxGeo->getCityFull($ip); (возвращает полную информацию о городе и регионе) Тестирование производительности И на десерт, небольшое сравнительное тестирование производительности. В качестве оппонентов выступают GeoLite API и Geobaza API. Все участники тестирования используют бинарную базу данных собственного формата, и используют API на PHP. Тестирование проходит под Win 7 (на Linux пропорции сохраняются), PHP 5.2.17.

Результаты после 10 прогонов для каждого API в двух режимах (обычном и с кэшированием в памяти) усреднения и округления до десятков. Для каждого прогона создается массив из 50 000 случайных IP адресов, и в цикле осуществляется поиск каждым алгоритмом.

Предложение и пожелание приветствуются. Также ищутся желающие помочь с портированием API на другие языки, и созданием модулей для Apache и nginx.

Отображать город посетителя для улучшения конверсионных показателей магазина. Готовый код вставки в любое место сайта с указанием города, региона и страны. Я перелапатил много скриптов, но именно этот оказался самым простым и результативным! Я использовал его при создании сайта www.mzm-market.ru , где скрипт выводит «доставка в______»

Втавляем в index.tpl (или на странице доставка) в любом нужном месте cледующий код:



window.onload =function(){
jQuery("#user-city").text(ymaps.geolocation.city);
jQuery("#user-region").text(ymaps.geolocation.region);
jQuery("#user-country").text(ymaps.geolocation.country);}


Вывод производится с помощью:

// страна, город, регион.
geolocation.country, geolocation.city, geolocation.region

Хочу немного дополнить данный пост (редакция от 18.02.2017).

При использовании вышеописанного скрипта во многих городах и браузерах просто ничего не отображалось и после долгих поисков я нашел наверное самый работоспособный скрипт определение страны, региона, города через яндекс API. Проверял его через своих клиентов, которые находятся практически по всей России и за её пределами и этот скрипт показал себя отлично! Вот скриншот моего клиента:

Сами понимаете что всё опредилилось чётко! Ну не буду вас мучать писаниной и приведу пример!

js Определение страны, области, города через яндекс API

Просто вставьте этот код между тегами




$(document).ready(function(){
ymaps.ready(function(){
var geolocation = ymaps.geolocation;
$("#cou").html("Ваша страна: "+geolocation.country);
$("#tow").html("Ваш город: "+geolocation.city);
$("#reg").html("Ваш регион: "+geolocation.region);
});
});

А этот код в нужное место на своей странице:

Ваша страна: ... определяется...
Ваш город: ... определяется...
Ваш регион: ... определяется...

Демонстрация

Ваша страна: ... определяется...

Ваш город: ... определяется...

Ваш регион: ... определяется...

Скрипт работает без проблем, но возможно, что для тех кто находится в маленьких селениях скорее всего город определиться неверно, а будет определён город вашего интернет провайдера.

От автора: в интернете ваше имя и фамилия ничего не значат. Здесь для определения юзера используется IP. Зная его, можно установить город и страну проживания человека, используемый браузер…. Не верите? Все это вы поймете, когда изучите в PHP определение IP.

IP и не только

Для получения сетевой информации пользователя в PHP существует глобальный массив $_SERVER. Давайте выведем его содержимое на экран:

Теперь мы знаем, что IP записывается в REMOTE_ADDR. Откуда она берется? Все эти данные клиент пересылает во время установки соединения. Эта переменная задается в настройках сервера на стороне клиента.

Некоторые для определения города по IP в PHP используют значения HTTP-заголовков, но это в корне неверно. Любой пользователь может прописать значения заголовков для своего хоста. Также следует понимать, какой IP вам нужен. Например, значение HTTP_X_FORWARDED_FOR содержит адрес удаленного клиента, его прокси или может быть вообще пустым. Короче, тут разбираться не на один вечер хватит .

Что касается браузера пользователя, то его можно попробовать определить с помощью функции get_browser (). Но для ее применения на стороне клиента в файле php.ini должен быть прописан путь к browscap.ini. Иначе получите подобное предупреждение:

Узнаем страну юзера и не только

Теперь с помощью PHP определим страну по IP. Но для начала проведем обзор всех решений в этой сфере. Большая часть подобных скриптов использует упомянутый нами элемент глобального массива $_SERVER REMOTE_ADDR. Теперь начинается самое главное.

Можно использовать уже , в которых полученный IP просто сортируется в зависимости от своего значения. Надеюсь, для вас не является секретом, что это значение присваивается клиенту (хосту) в зависимости от его геолокации: страны, города и региона проживания пользователя. На анализе этих диапазонов и построен весь функционал.

Также применяются различные сторонние сервисы наподобие ip-whois.net. С помощью скрипта вы передаете значение IP, а тот возвращает вам данные о нахождении хоста.

Кроме этого часть специализированных библиотек поставляется со своей базой данной, в таблицах которых содержатся все рассортированные (по географии) диапазоны IP. Я не буду их перечислять. Таких в Сети сейчас хватает.

Решать вам. Применение стороннего сервиса позволит снизить затраты ресурсов и нагрузку на ваш сайт. При этом использование библиотеки с базой избавит от проблем с подключением.

В следующем скрипте для определения региона по IP PHP используется библиотека TabGeo. Сейчас ее официальный ресурс не работает. Я скачал библиотеку с GitHub, но использовал только файл country.php. В нем по полученному IP определяется страна проживания пользователя. И затем (по ISO-коду) можно реализовать редиректы на различные страницы сайта:

 

 

Это интересно: