Содержимое
Для того чтобы определить локацию пользователя, нам понадобится его IP и база данных со списком IP адресов и привязанных к ней территориальных данных. Но так как пример с БД мы уже реализовывали раньше, в данной статье. То сегодня мы немного усложним нашу задачу, и будет взаимодействовать со сторонним сервисом по его API, получая в ответ всю интересующую нас информацию — временную зону, широту, долготу, страну и город.
О сервисе
В качестве сервиса для определения гео-данных, воспользуемся ресурсом ip-api.com. Перейдя на страницу документации, и просмотрев ее, можно понять что для получения нужной нам информации, нам следует выполнить следующий запрос:
http://ip-api.com/json/{query}?lang=ru
Где:
{query} — интересующий нас IP адрес
lang — язык (будем использовать «ru»)
Так же, мы можем передавать дополнительные параметры (поля) в поле «fields». Тем самым, ограничивая данные ответа выбранными полями в выше указанном поле «fields».
Приступаем к работе
С сайтом для определения данных пользователя по его IP мы определились. Теперь нам нужно узнать сам IP пользователя. Как это сделать, хорошо описано в статье «Как определить IP пользователя в PHP». Далее, через CURL PHP нам нужно будет сделать запрос на сайт ip-api и в ответ получить все что нас интересует. На этом все.
Рассмотрим программную реализацию:
$ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => 'http://ip-api.com/json/'.user_ip().'?lang=ru', CURLOPT_RETURNTRANSFER => true, ]); $exec = curl_exec($ch); $getinfo_ar = curl_getinfo($ch); if(empty($getinfo_ar['http_code']) || $getinfo_ar['http_code'] != 200) { die('Не удалось определить гео-данные пользователя'); } $json_ar = json_decode($exec, true); echo "<pre dir='ltr'>$json_ar = ";print_r($json_ar); echo "</pre>"; curl_close($ch);;
Немного деталей:
$ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => 'http://ip-api.com/json/'.user_ip().'?lang=ru', CURLOPT_RETURNTRANSFER => true, ]); $exec = curl_exec($ch); $getinfo_ar = curl_getinfo($ch); /* … */ curl_close($ch);
CURL с двумя параметрами в его самой просто реализации.
В константе «CURLOPT_URL» - указываем URL на который следует выполнить запрос. В нашем URL функция user_ip() возвращает IP пользователя зашедшего на сайт (на локальном компьютере не работает).
Параметром «CURLOPT_RETURNTRANSFER», даем понять CURL что мы хотим получить результат ответа через функцию «curl_exec()».
Функция «curl_getinfo($ch)», возвращает заголовки по запросу. Это нам нужно для определения кода ответа. Если он не 200, отображаем пользователю ошибку.
if(empty($getinfo_ar['http_code']) || $getinfo_ar['http_code'] != 200) { die('Не удалось определить гео-данные пользователя'); }
А если нет, то считаем что данные есть и пропускаем ее через «json_decode» и отображаем массив:
$json_ar = json_decode($exec, true); echo "<pre dir='ltr'>$json_ar = ";print_r($json_ar); echo "</pre>";
Как видите, все довольно просто. У меня на программный код ушло минут пять от силы. А то и три.
Всего хорошего!