вторник, 14 апреля 2015 г.

Как получить страну по IP-адресу в PHP

Иногда требуется определить на сайте с какой страны и города пришёл посетитель. Мало ли, например владельцам интернет магазинов требуется показать ту или иную информацию в зависимости от страны посетителя.
В этом случае я пользуюсь замечательным сервисом http://www.geoplugin.net/. Он быстр в работе и какие то заметные торможения при обращении к нему скрипта я особо не замечал.

Можно использовать GeoIP базы закачав на сервер и потом постоянно обновлять по крону - возразите вы. Да можно. Все можно, но об этом как то в другой статье. Сейчас же о том как решить эту задачу при помощи вышеуказанного сервиса.

Скрипт обращения к сервису http://www.geoplugin.net/. :





function getLocationInfoByIp(){

$client  = @$_SERVER['HTTP_CLIENT_IP'];

$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];

$remote  = @$_SERVER['REMOTE_ADDR'];

$result  = array('country'=>'', 'city'=>'');

if(filter_var($client, FILTER_VALIDATE_IP)){

$ip = $client;

}elseif(filter_var($forward, FILTER_VALIDATE_IP)){

$ip = $forward;

}else{

$ip = $remote;
}

$ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip));

if($ip_data && $ip_data->geoplugin_countryName != null){

$result['country'] = $ip_data->geoplugin_countryCode;

$result['city'] = $ip_data->geoplugin_city;

}
return $result;
}

Думаю данный код итак понятен для тех кто знает php.
Теперь эту функцию getLocationInfoByIp() мы можем вызывать в нашем приложении.
Так как она возвращает массив мы и будем обращаться с ней как с массивом...

Пример:

// Присваиваем массив переменной
 $getArray  = getLocationInfoByIp();

//Теперь можно вытягивать значение по ключу
echo $getArray['country'];  //  Выведет страну
echo $getArray['city'];        //  Выведет город

Все логично и просто!

Данный сервис хранит информацию в формате json. Все их значения привожу ниже:

{
  "geoplugin_request":"193.160.224.138",
  "geoplugin_status":200,
  "geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href='http:\/\/www.maxmind.com'>http:\/\/www.maxmind.com<\/a>.",
  "geoplugin_city":"Izmail",
  "geoplugin_region":"Odessa Oblast",
  "geoplugin_areaCode":"0",
  "geoplugin_dmaCode":"0",
  "geoplugin_countryCode":"UA",
  "geoplugin_countryName":"Ukraine",
  "geoplugin_continentCode":"EU",
  "geoplugin_latitude":"45.349300",
  "geoplugin_longitude":"28.840799",
  "geoplugin_regionCode":"17",
  "geoplugin_regionName":"Odessa Oblast",
  "geoplugin_currencyCode":"UAH",
  "geoplugin_currencySymbol":"&#8372;",
  "geoplugin_currencySymbol_UTF8":"\u20b4",
  "geoplugin_currencyConverter":0
}

Так еле мы в скрипте выше использовали выражения для страны - geoplugin_countryCode

и города - geoplugin_city

$result['country'] = $ip_data->geoplugin_countryCode;

$result['city'] = $ip_data->geoplugin_city;

Давайте например определим долготу и широту посетителя нашего сайта.
Для этого в скрипт добавим такие строчки:



$result['latitude'] = $ip_data->geoplugin_latitude;

$result['long'] = $ip_data->geoplugin_longitude;  

Теперь широту и долготу вытаскиваем так:


echo $getArray['latitude'];  //  Выведет широту
echo $getArray['long'];        //  Выведет долготу


Как решить задачу определения страны по IP  без сервиса поговорим как нибудь в следующей статье.
Ну все. Надеюсь чем нибудь помог. Пока!










Комментариев нет:

Отправить комментарий

Ещё статьи по теме