Работа с Гео-IP API в php. Определение города по ip

Введение

Работа с Гео-IP API в php. Определение города по ipВ этой статье я хочу показать, как можно легко и быстро получить географическое положение по IP-адресу, как можно определить город пользователя. Есть несколько путей решения и каждый из них по своему хорош. Первый способ — это скачать(или собрать самому :) ) базу данных ip-адресов с соответствующими им названиями городов, и при необходимости делать запрос к БД для получения названия города. И второй способ — это воспользоваться сервисом, который предоставляет API.

Главным плюсом первого способа является независимость от сторонних сервисов, а также всегда имеется возможность редактировать базу данных. На этом плюсы заканчиваются и начинаются минусы: БД несомненно будет большого размера и постоянное к ней обращение серьезно увеличит нагрузку сайта или приложения. Еще одним серьезным минусом может стать актуальность базы данных — придется постоянно следить за обновлением данных.
Второй способ определения города по ip имеет также ряд плюсов и минусов. Самым весомым минусом такого способа является сам факт взаимодействия со сторонним сервисом: у нас не будет ни какой возможности повлиять на работоспособность сервиса, а также невозможно редактировать данные. Еще одним минусом может стать ряд ограничений, наложенных сервисом, предоставляющим услуги. Это может быть и ограничение по количеству запросов в определенный промежуток времени, и по количеству одновременных запросов, и не исключено, что сервис может оказаться платным. Но не смотря на все минусы в использовании стороннего сервиса, этот вариант мне нравится больше, поскольку значительно снижается нагрузка на сервер, данные всегда актуальные, данные постоянно оптимизируются и редактируются — сервисы, предоставляющие услуги, всегда стремятся заинтересовать потребителя, поэтому постоянно развиваются.
С выбором способа все понятно, теперь стоит определиться с сервисом. Потратив несколько часов на поиск мне удалось найти несколько хороших, судя по комментариям и отзывам, сервисов. Перечислять и описывать каждый я не буду, просто скажу. что остановился на этом — ru.smart-ip.net/geoip-api

Работа с Гео-IP API. Код

Документация в выбранном сервисе очень подробная, да и работа с API простая до безумия, поэтому что-либо описывать тут нет смысла, просто приведу пример кода с комментариями:

// кодировка страницы
header('Content-Type: text/html;charset=UTF-8');
 
$ip = '83.149.47.116'; // IP, который будем проверять
$typeData = 'json'; // в каком виде мы получим данные. json или xml
 
// формируем URL для запроса
$url = "http://ru.smart-ip.net/geoip-$typeData/$ip";
// делаем запрос к API
$data = @file_get_contents($url);
// если получили данные
if($data){
    // декодируем полученные данные
    $dataDecode = json_decode($data);
	
    // выводим данные
	echo "Страна: " . $dataDecode->countryName . "<br/>"; 
	echo "Код страны: " . $dataDecode->countryCode . "<br/>";   
	echo "Город: " . $dataDecode->city . "<br/>";    
	echo "Область: " . $dataDecode->region . "<br/>";
	echo "Широта: " . $dataDecode->latitude . "<br/>";
	echo "Долгота: " . $dataDecode->longitude . "<br/>";
	echo "Часовой пояс: " . $dataDecode->timezone . "<br/>";

}else{
    echo "Сервер не доступен!";
}
Рассказать друзьям:


Работа с Гео-IP API в php. Определение города по ip: 13 комментариев

    1. А в чем разница с моим кодом? У меня только присутствует проверка на случай, когда сервис не доступен

  1. Здравстуйте. Спасибо за подробное описание работы с сервисом. Не подскажете, есть ли более точные, детальные способы определения местоположения?

  2. Ваш код с 15.07.14 перестал работать, пишет Сервер не доступен! не знаете по чему.

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

    1. Да, действительно, сервис перестал работать, несколько моих сайтов перестали работать. Как альтернатива можно воспользоваться сервисом http://ipgeobase.ru
      Примерно так:

      $url = 'http://ipgeobase.ru:7020/geo?ip='.$ip_address;
      $xml = new DOMDocument();
      if ($xml->load($url)){
      $result = array();
      $root = $xml->documentElement;
      $result = array(
      'country' => $root->getElementsByTagName('country')->item(0)->nodeValue,
      'region' => $root->getElementsByTagName('region')->item(0)->nodeValue,
      'city' => $root->getElementsByTagName('city')->item(0)->nodeValue,
      'district' => $root->getElementsByTagName('district')->item(0)->nodeValue
      );
      }

      1. Разобрался сам. Вот полный рабочий код на вывод, например, города:

        $xml_file = ‘http://ipgeobase.ru:7020/geo?ip=’.$ip_online;
        $xml_object = new DOMDocument();
        $xml_object->load($xml_file);
        $elem_city = $xml_object->getElementsByTagName(‘city’);
        $result_city = $elem_city->item(0)->nodeValue;

        //это строка нужна дял смены кодировки, если у вас файл не utf-8
        $result_city = mb_convert_encoding($result_city, ‘cp1251’, ‘utf-8’);

        echo $result_city;

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

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

*