Для того щоб визначити локацію користувача, нам знадобиться його IP та база даних зі списком IP-адрес і прив’язаними до них територіальними даними. Але оскільки приклад з БД ми вже реалізовували раніше, у цій статті, то сьогодні ми трохи ускладнимо завдання і будемо взаємодіяти зі стороннім сервісом через його API, отримуючи у відповідь всю цікаву нам інформацію — часовий пояс, широту, довготу, країну та місто.
Про сервіс
Як сервіс для визначення гео-даних скористаємося ресурсом ip-api.com. Перейшовши на сторінку документації та переглянувши її, можна зрозуміти, що для отримання необхідної нам інформації, слід виконати наступний запит:
http://ip-api.com/json/{query}?lang=ru
Де:
{query} — IP-адреса, яка нас цікавить
lang — мова (використаємо «ru»)
Також ми можемо передавати додаткові параметри (поля) в полі «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>";
Як бачите, все доволі просто. У мене на програмний код пішло максимум п’ять хвилин. А може й три.
Усього найкращого!
