Визначення місцезнаходження користувача за допомогою JavaScript

Публікації

Отримати місцезнаходження користувача досить корисна інформація для сайту. Особливо з точки зору маркетингу і не тільки.

Часто використовується в інтернет магазинах коли необхідно показати де знаходиться найближче відділення в регіоні або можливі акції і т.п.

Також така інформація використовується для аналітики відвідування веб-сайту, з яких регіонів користувачі заходять.

Звичайно не всі користувачі хочуть ділитися своїм місцемзнаходженям, та за політикою безпеки браузера без згоди користувача отримати через navigator.geolocation заборонено.

Розглянемо всі можливі способи визначення місцезнаходження користувача за допомогою JavaScript.

Як визначити місцезнаходження у JavaScript

як визначити місто відвідувача на сайті

Альтернативні способи визначення місцезнаходження користувача

Отримати координати відвідувачів сайту без його дозволу

ТочністьВизначення відстаніПідтримка браузерівДозвіл користувачаОцінювання
geolocationвисокадо декількох метрівтак
IPсереднядо населеного пункту або районуні
timeZoneнизькадо країни або великого регіону в країніні
localeнизькадо країнині
languageнизькадо країнині

Також можна використовувати два і більше методів для більш точного визначення місцезнаходження користувача.

Geolocation

navigator.geolocation дозволяє визначити місцезнаходження користувача за допомогою локації пристрою та ОС. Дані можуть бути отримані з GPS, WIFI, інтернет мережі.

За допомогою GPS модуля точність місце знаходження може сягати до декількох метрів. У разі відсутності GPS точність місцезнаходження зменшується.

Переважна більшість браузерів за політикою безпеки вимагає щоб сайт який хоче використовувати navigator.geolocation використовував протокол HTTPS.

І якщо протокол HTTPS можна додати до сайту або сайт уже використовує його, то якщо користувач не дає дозвіл на отримання місцезнаходження - дану технологія неможливо використати.

Отримані координати від navigator.geolocation.getCurrentPosition() це широта і довгота, яку ще треба обробити щоб прив'язати до місця. Або можна відобразити за допомогою таких сервісів як Google Maps або подібних.

navigator.geolocation є найбільш точним визначенням місце знаходження користувача за допомогою JavaScript - адже для цього він і був розроблений.

    Переваги:
  • найбільш точний спосіб отримання місцезнаходження
    Недоліки:
  • потребує дозволу від користувача на отримання місцезнаходження
  • для точного визначення місце знаходження необхідно щоб пристрій мав GPS модуль що можливе лише у смартфона, планшетах і т.п.
  • не досить точно визначає місцезнаходження на ПК та ноутбук

Фіктивність місцезнаходження

Навіть якщо використовується смартфон з GPS є доволі багато програм які дозволяють вибирати фіктивне місцезнаходження та видавати за явне. Правда користувачеві необхідно дозволити на рівні настройках системи дозволити програмі давати фіктивні дані місцезнаходження.

IP

Визначення місцезнаходження за допомогою IP дозволяє визначати до населеного пункту або навіть до району міста. Дана технологія називають GeoIP.

Спосіб полягає в тому що зазвичай провайдери інтернету виділяють IP користувачам на певні регіони. Що віднести користувачів з однаковим IP до одного місця знаходження.

Тільки спосіб цей ускладнюється тим що IP видаються провайдерами динамічно, часто змінюються і регіон на який дається IP може сягати області і навіть країни.

Сам JavaScript не має технології отримання IP користувача тому для отримання IP у JavaScript можна відправити AJAX запит на сервер.

var xhr=new XMLHttpRequest(); xhr.open('get','/ajax.php?act=test_info'); xhr.responseType='json'; xhr.onload=function(){ var ip=this.response.ip; alert('Ваш IP: '+ip); }; xhr.send(null);

На сервері наприклад за допомогою PHP визначення IP реалізовується так:

if($_GET['act']=='test_info'){ echo '{"ip":"'.$_SERVER['REMOTE_ADDR'].'"}'; exit; }

Але взнавши лише IP визначити місцезнаходження не можливо. Тому необхідно мати на сервері базу даних IP і прив'язка їх до певного регіону і саме основне цю базу необхідно весь час оновлювати для точного визначення.

Тому без роботи сервера тут не обійтися. Прицьому якщо визначати на своєму сервері то Вам необхідно або самому створювати і оновлювати базу даних або використовувати стороні бази дах IP.

Якщо Ви вирішили самому вести базу даних IP з локацією тоді можна використовувати отримані дані від navigator.geolocation.

Також можна використовувати стороні сервера для визначення місцезнаходження по IP або програм (пакетів) для сервера. Вони бувають безкоштовні так і платні.

При використані сторонніх серверів достатньо за допомогою AJAX відправити запит і отримати уже готові дані місцезнаходження користувача.

Приклад використання одного з безкоштовних сервісів GeoIP:

var xhr=new XMLHttpRequest(); xhr.open('get', 'https://freegeoip.live/json/'); xhr.onload=function(){ alert(this.responseText); } xhr.send(null);

Звісно для таких гігантів як Google і т.п. по IP можна досить точно визначати місцезнаходження адже дані по регіону від користувачів сягають мільйони. Також компанії використовують Wardriving - як пошуку бездротових мереж Wi-Fi на транспорному засобі і привязкою до місцезнаходження.

    Переваги:
  • дозволяє інколи досить точно визначити місце знаходження
  • не потребує згоди користувача
    Недоліки:
  • для точного визначення потребує весь час оновлювати бази IP з локацією
  • у випадку використання сторонніх серверів для точного визначення інколи необхідно щомісяця оплачувати за використання послуги (є також безкоштовні)
  • при використані мобільного інтернеті похибка може бути досить велика
  • якщо користувач використовує VPN, проксі-сервер визначити майже неможливо

Фіктивність місцезнаходження

Користувач може використовувати VPN, проксі-сервер щоб приховати свій IP.

Навіть якщо користувач не приховує свій IP у зв'язку з динамічністю яку надають провайдери IP похибка інколи є велика.

timeZone

timeZone дозволяє отримати настройки від ОС про часову зону. Це дозволяє визначити країну користувача а у випадку коли країна має декілька часових зон і певний регіон в країні.

Для отримання часової зони у JavaScript використовується Intl.DateTimeFormat.resolvedOptions().

Здебільшого часова зона отримується з мережі що дозволяє досить точно визначити яка часова зона. У випадку коли користувач вручну вказує часову зону похибка може бути дуже велика.

function getGeolocationDateTimeTimeZone(){ try{ var nf=Intl.DateTimeFormat(); return nf.resolvedOptions().timeZone; }catch(e){ return null; } } alert(getGeolocationDateTimeTimeZone() );
    Переваги:
  • не потребує дозволу користувача
    Недоліки:
  • визначає в межах держави або великої частини цієї держави
  • інколи користувачі вказують невірну свою часову зону
  • деякі браузери не підтримують

Фіктивність місцезнаходження

Є розширення для браузерів які дозволяють змінювати значення часової зони для браузера, що дає можливість не змінювати навіть настройки ОС.

Навіть якщо не використовує розширення самі настройки у ОС не завжди вірні.

locale

Дозволяє визначати країну користувача. Належність до країни браузер отримує з ОС. Прицьому ОС може локаль визначати як самостійно за допомогою мережі або з налаштувань. Зазвичай локаль визначається/вказується при встановленні ОС і може залежить від параметрів: вказана країна і регіон, часова зона, валюта тощо.

Деякі ОС не враховують вказані параметри користувача а визначають по мережі локаль - що досить підвищує правдивість даних.

function getGeolocationDateTimeLocale(){ try{ var nf=Intl.DateTimeFormat(); local=nf.resolvedOptions().locale.toLowerCase(); for(var a in GEO_CODES){ if(GEO_CODES[a].ln.split('|').indexOf(local)>-1) return GEO_CODES[a]; } return local; }catch(e){ return null; } } var l=getGeolocationDateTimeLocale(); if(l) alert( l.name ); else alert('не вдалося визначити');
    Переваги:
  • не потребує дозволу користувача
    Недоліки:
  • визначає лише державу
  • інколи користувачі вказують невірну свою локаль
  • деякі браузери не підтримують

Фіктивність місцезнаходження

Настройки локалі ОС можуть бути вказані не вірні.

language

navigator.language дозволяє отримати настройки мови сторінки з настройок браузера. По мові можна припустити що користувач з певної країни.

Ці дані є дуже неточними адже зазвичай це мало що вказує на місце знаходження.

Деякі браузери при встановленні вказують мову в настройках відповідно від локалі системи що дає правдиву інформацію про мову користувача та його країну.

function getGeolocationLanguage(){ var ln=navigator.language.split('-'); if(ln.length>1){ if(GEO_CODES[ln[1]]) return GEO_CODES[ln[1]]; } else{ var ln=navigator.language.toLowerCase(); for(var a in GEO_CODES){ if(GEO_CODES[a].ln.split('|').indexOf(ln)>-1) return GEO_CODES[a]; } } return null; } var lange=getGeolocationLanguage(); if(lange) alert( lange.name ); else alert('не вдалося визначити');
    Переваги:
  • не потребує дозволу користувача
    Недоліки:
  • дуже велика неточність
  • приймає за визначення рекомендовану мову сторінки що має малий % до місцезнаходження

Фіктивність місцезнаходження

Користувач може вибрати у настройках браузера будь яку мову.

Деякі браузери по замовчуванню мають вказану не ту мову в яку використовую в державі, а користувач її не змінює.

Якщо вказана загальна англійська мова то не зрозуміло до якої держави її відносити.

Адмін 2020-04-02 13:20:51

Тільки зареєстровані користувачі можуть писати коментарі.