Введение
В этой статье я хочу показать, как можно легко и быстро получить географическое положение по 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 "Сервер не доступен!"; }
чего-то не работает, может это из-за денвера. пишет сервер не доступен
$type = 'json/';
$data = file_get_contents('http://geoip.smart-ip.net/' .$type .$ip);
Так не проще? =)
А в чем разница с моим кодом? У меня только присутствует проверка на случай, когда сервис не доступен
Здравстуйте. Спасибо за подробное описание работы с сервисом. Не подскажете, есть ли более точные, детальные способы определения местоположения?
Я не встречал подобных сервисов
Ваш код с 15.07.14 перестал работать, пишет Сервер не доступен! не знаете по чему.
Сервис сейчас работает с перебоями, иногда бывает не доступен, но через определенное время снова работает. Надеюсь, что скоро, починят
Решил подключить — нифига не работает, а жаль(( Проверяйте работу сервиса по линку прежде чем тратить на него время http://ru.smart-ip.net/geoip-json/127.0.0.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
);
}
А вывод потом как сделать?
Разобрался сам. Вот полный рабочий код на вывод, например, города:
$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;
Вроде должно быть правильно, по крайней мере файл $xml_file выдается, а вместо города пусто
Попробуйте этот код. Выводит погоду, руководствуясь ip посетителя сайта, причем прогноз достаточно точен. Есть как скрипт, так и нативный joomla3 extension. http://masterpro.ws/jweather-by-ip-pogoda-po-ip-dlya-joomla