Запрос геолокации в браузере

Обновлено: 04.07.2024

Всем, кто когда-либо занимался написанием систем авторизации/регистрации пользователей, наверняка приходилось задаваться вопросом: «А как узнать о пользователе больше информации?». Для чего это нужно? В большинстве случаев, для идентификации именно этого пользователя. Иногда — для предоставления каких-либо дополнительных возможностей и информации, в зависимости от различных социальных параметров, или, быть может, местополжения пользователя или региона проживания. Иногда, например, для проведения какого-либо скоринга. В этой статье речь пойдёт об определении географического положения пользователя.

Эффективные методы определения

Можно придумать массу методов получения георгафического положения пользователя интернета. И все эти методы будут обладать своим набором плюсов и минусов, будут более или менее эффективны, в зависимости от применения. Сейчас я опишу только те методы, которыми на данный момент пользуется проект, в котором я учавствую, т.е. те, которые я непосредственно использую. За время существования проекта по ним уже собралось достаточно статистики, из которой можно сделать некоторые выводы.

1. Данные из соц. сетей

На сегодняшний день крайне популярным стало использовать для авторизации (или в качестве дополнительной информации) аккаунты всевозможных социальных сетей и блогов, что позволяет использовать данные из них. Авторизовав пользователя таким образом, можно получить достаточно много информации о нём. Правда вот о достоверности её говорить не приходится, ведь многие указывают в соц. сетях не «действительное», а «желаемое», либо вообще первое, что пришло в голову. Отсеять подобные вещи обычно и есть основная задача для разработчика. Для этого необходимо получить информацию обо всех друзьях пользователя и сверить общие данные. Можно, например, найти наиболее часто встречаемое место проживания у коллег/однокурсников/одноклассников/друзей пользователя (в синей соц. сети, например, это делать очень удобно), и, на основе этих данных, выяснить настоящий регион, область, город и даже район города, где живёт/работает/учится пользователь.
Также, в некоторых соц. сетях, доступно получение непосредственных координат пользователя, если он онлайн. Точность этих данных, в некоторых случаях, оставляет желать лучшего, но, как минимум, район города, где находится пользователь, определить можно достаточно достоверно.

  • Относительно высокая точность, при использовании моделей скоринга на основе данных друзей
  • У большинства пользователей есть аккаунты в соц. сетях
  • Можно проверить полученные данные на достоверность, используя данные друзей
  • Сложность реализации, т.к. необходимо изучать API нескольких соц. сетей, составлять и реализовывать модели для анализа полученных данных
  • Необходимость в наличии действующего аккаунта в соц. сети у пользователя (я считаю, что, несмотря на распространённость, требовать подобные данные от пользователя, всё же, нельзя)
  • Низкая скорость работы, если учитывать анализ с использованием данных друзей

Реализацию, к сожалению, предоставить не могу ибо «секрет фирмы».

2. Данные GeoIP

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

Дело в том, что на данный момент большинство существоваших ранее провайдеров регионального уровня было раскуплено и поглощено операторами федерального уровня. И чем же это плохо? А вот чем. Представьте себе ситуацию — в городе «Н» существовало 5 мелких провайдеров. Каждый работал в своём районе города, и соответственно, имел свой пул IPv4 адресов. И даже динамически выданный «белый» IP можно было примерно привязать к определённому району города. Теперь приходит провайдер федерального уровня и покупает все 5 мелких провайдеров с их пулами адресов. Затем он приводит их сеть к некоему общему виду всех сетей этого федерального провайдера. Что мы имеем в итоге? У этого федерального провайдера есть огромное количество клиентов и огромное количество пулов IP, используемых, в зависимости от потребностей, в том или ином регионе. Тоесть теперь адрес, принадлежавший ранее пулу мелкого местного провайдера, может быть выдан клиенту из совершенно другого города, просто потому, что этот пул адресов теперь используется для всех клиентов этого провайдера. А вот сообщать кому и из какой области выдан этот IP никто, естественно, не будет. Тем более, что завтра он может быть выдан ещё кому-то.

Также, никто не помешает пользователю использовать, например, прокси или VPN для выхода в интернет от имени другого IP. В этом случае GeoIP становится абсолютно бесполезным, ибо получит информацию именно об этом прокси или VPN-сервере. То же самое происходит, если провайдер предоставляет своим клиентам доступ в интернет через NAT (а в свете проблем с количством свободных IPv4 адресов это встречается всё чаще и чаще), правда в этом случае, обычно, хотябы можно получить район, область или город.

Такчто полагаться полностью на данные GeoIP всё-таки можно не всегда, хотя этот способ очень удобен — ведь мы получаем информацию практически мгновенно. Для этого, обычно, используется заранее скачанная локальная база данных.

  • Легко использовать, есть множество реализаций на различных языках
  • Высокая точность (за некоторым исключением, см. выше)
  • Быстрота работы (практически мгновенное получение результата — ведь это всего 1 запрос к базе)
  • Необходимость поддерживать базу IP в актуальном состоянии
  • Отсутствие возможности проверить достоверность полученных данных (только запросами к нескольким базам)
  • Достаточно большой процент ошибочных данных для РФ на данный момент (см. выше)

Описывать «как это сделать» смыла особого не вижу, ибо в сети, и, в т.ч. на хабре, полно подробных описаний. Для получения данных GeoIP существует множество бесплатных библиотек и инструментов. Например, для PHP можно использовать расширение geoip.

3. Использование JavaScript Geolocation API

Достаточно полезный и эффективный метод, но только для мобильных устройств. В случае же со стационарным компьютером — полезен не более чем GeoIP. Дело в том, что в случае мобильного устройства (современный смартфон, планшет и т.д.) будут использоваться все доступные для этого устройства и разрешённые пользователем средства определения местоположения, включая позиционирование по GPS, Wi-Fi и данным от вышек сотовой связи. А вот в случае с домашним ПК, у которого, в большинстве случаев, нет ни мобильной сети (в случае наличия GSM/3G модема данные от него не используются), ни GPS, мы сможем узнать только данные GeoIP, которые нам радостно и сообщит JS. А по поводу их точности я уже писал выше. Хотя, пренебрегать данным способом я бы не стал — ведь всё большее количество людей используют планшеты и телефоны для выхода в интернет.

В итоге данный способ имеет достаточно узкий спектр применения — мобильные устройства. Или если достаточно примерных данных по GeoIP.

  • Легко реализовать, множество документации и примеров в интернете
  • Точный, т.к. может использоваться как позиционирование по сотовым вышкам, Wi-Fi, GPS
  • Быстрый, т.к. для определения положения используется ПО со стороны клиента
  • На домашних ПК поддерживается не во всех браузерах
  • Требует разрешений пользователя
  • Фактически, применим только к мобильным устройствам
  • Относительно легко подделать данные

Примеры реализации можно посмотреть здесь или здесь.

4. Определение через услуги типа «локатор» от мобильных операторов

Пример рабочей реализации приводить не буду по тем же соображениям, что и в первом случае, но вкратце опишу как это делается чуть ниже.

  • Высокая достоверность данных, почти 100%
  • Высокая точность, вне зависимости от испоьзуемого устройства и способа выхода в интернет
  • Автоматически подтверждает номер мобильного телефона
  • Сложность в реализации и поддержке
  • Низкая скорость, т.к. требуется время на отправку/приём смс и ответ от пользователя
  • Не бесплатен (тарифы у операторов на эту услугу весьма «прожорливые»)
  • Необходимо согласие пользователя
Как сделать
  1. Старый моб. телефон с кабелем, либо 3G/GSM модем, по одному на каждого оператора
  2. Сим карты этих операторов
  3. Некий ПК, желательно с *nix на борту (можно и Windows с cygwin), который будет выполнять функцию эдакого «гео-шлюза»
  4. Немного терпения и времени
  5. smstools3
1) В зависимости от ОС , инструкции могут отличаться, но общий смысл неизменен — необходимо скачать и установить из репозитория ПО пакет SMSTools

На Gentoo это выглядит так:

Если вам нужна статистика отправленных/полученных смс, то:

либо (если у вас все USE-флаги в одном файле):


Затем ставим из портажа сам smstools:

На FreeBSD так:


Для статистики в опциях просто выбрать «STATS»

Можно собрать и из исходников, если для вашей системы нет готового пакета:

2) Подключаем модем(ы) и проверяем появились ли устройства последовательного порта в /dev


Может появиться несколько портов. Обычно нас интересует ttyUSB0, если модем 1. Если больше — то подключаем по очереди. И вот перый из появившихся портов наш.


Смысл тот же — первый из нескольких появившихся — наш.

3) Настраиваем SMSTools

smsd.conf может находится как в /etc/ так и в /usr/local/etc/ в зависимости от вашего дистрибутива. Приводим его к подобному виду:

4) Создаём файлик trsms.sh (обработчик событий)
5) Запускаем демон smsd и добавляем его в автозагрузку

С помощью сведений о местоположении сайты показывают актуальную для вас информацию: погоду, дорожные пробки, карту города, заведения поблизости. Местоположение определяется по ближайшим точкам беспроводного доступа и по IP-адресу устройства. Данные о местоположении обезличены: передаются только географические координаты. Они не позволяют вас идентифицировать.

Разрешить или запретить сайту определять местоположение

Когда сайт запросит информацию о том, где вы находитесь, в верхней части страницы вы увидите предупреждение.

Разрешить , чтобы сайт или его компонент (например, карта) узнал, где вы находитесь. В Умной строке появится значок . Блокировать , чтобы сайт не узнал, где вы. В Умной строке появится значок .

Нажмите  или , чтобы изменить решение.

Просмотреть сайты, которым разрешено определять местоположение

Прокрутите страницу вниз и нажмите Расширенные настройки сайтов . В блоке Доступ к местоположению нажмите ссылку Настройки сайтов.

На вкладке Разрешен отображается список сайтов, которым разрешено следить за вашим местоположением. Чтобы удалить сайт из списка, наведите на него указатель мыши и нажмите появившуюся ссылку Удалить . После этого сайт не будет определять ваше местоположение.

Запретить определять местоположение

Прокрутите страницу вниз и нажмите Расширенные настройки сайтов . В блоке Доступ к местоположению включите опцию Запрещен . Прокрутите страницу вниз и нажмите Настройки персональных данных . Снимите отметку с опции Разрешить сервисам Яндекса использовать геолокацию . Примечание. Чтобы изменения вступили в силу, нужно очистить кеш.

Установить город вручную

Примечание. Ручной выбор города хранится в файлах cookie. Настройки региона будут действовать на вашем устройстве, пока вы не измените их или не удалите cookie.

Если сохранить город не удалось — проверьте, разрешено ли в браузере сохранять cookie.

Местоположение в режиме Инкогнито

По умолчанию в режиме Инкогнито местоположение определяется автоматически, даже если вы ранее вручную указали город. Это объясняется тем, что в режиме Инкогнито не сохраняются файлы cookie, а сделанный вручную выбор города хранится в них.

Местоположение определяется некорректно

Возможно, у вас установлено расширение, изменяющее настройки прокси. Попробуйте отключить его.

Откройте   → Дополнения и отключите все расширения. Если местоположение определилось правильно, методом перебора найдите расширение, которое меняет прокси. Перезагрузите страницу и убедитесь, что проблема решена.

Возможно, ваш IP-адрес принадлежит сети с несколькими регионами. Настройте местоположение вручную:

В появившемся списке подсказок выберите город или населенный пункт. Примечание. Ручная настройка местоположения хранится в файлах cookie. Если выбранный вручную город меняется на другой, значит, ваш браузер удаляет cookie. Убедитесь, что хранение cookie разрешено в настройках браузера.

Если проблема не решена, сообщите о ней в службу поддержки через форму обратной связи:

Пришлите ссылку на страницу, где вы видите неправильно указанный город. Укажите город, который определяется в настройках после нажатия кнопки Найти меня , а также ваше реальное местоположение. ","lang":>,"extra_meta":[>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>],"title":"Данные о местоположении - Яндекс.Браузер. Справка","canonical":"https://browser.yandex.ru/help/personal-data-protection/location-information.html","productName":"Яндекс.Браузер","extra_js":[[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>]],"extra_css":[[],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>]],"csp":<"script-src":[]>,"lang":"ru">>>'>

С помощью сведений о местоположении сайты показывают актуальную для вас информацию: погоду, дорожные пробки, карту города, заведения поблизости. Местоположение определяется по ближайшим точкам беспроводного доступа и по IP-адресу устройства. Данные о местоположении обезличены: передаются только географические координаты. Они не позволяют вас идентифицировать.

Разрешить или запретить сайту определять местоположение

Когда сайт запросит информацию о том, где вы находитесь, в верхней части страницы вы увидите предупреждение.



Разрешить , чтобы сайт или его компонент (например, карта) узнал, где вы находитесь. В Умной строке появится значок .


Блокировать , чтобы сайт не узнал, где вы. В Умной строке появится значок .

Нажмите или , чтобы изменить решение.

Просмотреть сайты, которым разрешено определять местоположение


Нажмите → Настройки → Сайты . Прокрутите страницу вниз и нажмите Расширенные настройки сайтов . В блоке Доступ к местоположению нажмите ссылку Настройки сайтов.

На вкладке Разрешен отображается список сайтов, которым разрешено следить за вашим местоположением. Чтобы удалить сайт из списка, наведите на него указатель мыши и нажмите появившуюся ссылку Удалить . После этого сайт не будет определять ваше местоположение.

С помощью сведений о местоположении сайты показывают актуальную для вас информацию: погоду, дорожные пробки, карту города, заведения поблизости. Местоположение определяется по ближайшим точкам беспроводного доступа и по IP-адресу устройства. Данные о местоположении обезличены: передаются только географические координаты. Они не позволяют вас идентифицировать.

Разрешить или запретить сайту определять местоположение

Когда сайт запросит информацию о том, где вы находитесь, в верхней части страницы вы увидите предупреждение.

Разрешить , чтобы сайт или его компонент (например, карта) узнал, где вы находитесь. В Умной строке появится значок&nbsp;. Блокировать , чтобы сайт не узнал, где вы. В Умной строке появится значок&nbsp;.

Нажмите&nbsp; или&nbsp;, чтобы изменить решение.

Просмотреть сайты, которым разрешено определять местоположение

Прокрутите страницу вниз и нажмите Расширенные настройки сайтов . В блоке Доступ к местоположению нажмите ссылку Настройки сайтов.

На вкладке Разрешен отображается список сайтов, которым разрешено следить за вашим местоположением. Чтобы удалить сайт из списка, наведите на него указатель мыши и нажмите появившуюся ссылку Удалить . После этого сайт не будет определять ваше местоположение.

Запретить определять местоположение

Прокрутите страницу вниз и нажмите Расширенные настройки сайтов . В блоке Доступ к местоположению включите опцию Запрещен . Прокрутите страницу вниз и нажмите Настройки персональных данных . Снимите отметку с опции Разрешить сервисам Яндекса использовать геолокацию . Примечание. Чтобы изменения вступили в силу, нужно очистить кеш.

Установить город вручную

Примечание. Ручной выбор города хранится в файлах cookie. Настройки региона будут действовать на вашем устройстве, пока вы не измените их или не удалите cookie.

Если сохранить город не удалось&nbsp;—&nbsp;проверьте, разрешено ли в браузере сохранять cookie.

Местоположение в режиме Инкогнито

По умолчанию в режиме Инкогнито местоположение определяется автоматически, даже если вы ранее вручную указали город. Это объясняется тем, что в режиме Инкогнито не сохраняются файлы cookie, а сделанный вручную выбор города хранится в них.

Местоположение определяется некорректно

Возможно, у вас установлено расширение, изменяющее настройки прокси. Попробуйте отключить его.

Откройте&nbsp; &nbsp;→ Дополнения и отключите все расширения. Если местоположение определилось правильно, методом перебора найдите расширение, которое меняет прокси. Перезагрузите страницу и убедитесь, что проблема решена.

Возможно, ваш IP-адрес принадлежит сети с несколькими регионами. Настройте местоположение вручную:

В появившемся списке подсказок выберите город или населенный пункт. Примечание. Ручная настройка местоположения хранится в файлах cookie. Если выбранный вручную город меняется на другой, значит, ваш браузер удаляет cookie. Убедитесь, что хранение cookie разрешено в настройках браузера.

Если проблема не решена, сообщите о ней в службу поддержки через форму обратной связи:

Пришлите ссылку на страницу, где вы видите неправильно указанный город. Укажите город, который определяется в настройках после нажатия кнопки Найти меня , а также ваше реальное местоположение. ","lang":>,"extra_meta":[>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>],"title":"Данные о местоположении - Яндекс.Браузер для ДИТ. Справка","productName":"Яндекс.Браузер для ДИТ","extra_js":[[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>]],"extra_css":[[],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>]],"csp":<"script-src":[]>,"lang":"ru">>>'>

С помощью сведений о местоположении сайты показывают актуальную для вас информацию: погоду, дорожные пробки, карту города, заведения поблизости. Местоположение определяется по ближайшим точкам беспроводного доступа и по IP-адресу устройства. Данные о местоположении обезличены: передаются только географические координаты. Они не позволяют вас идентифицировать.

Разрешить или запретить сайту определять местоположение

Когда сайт запросит информацию о том, где вы находитесь, в верхней части страницы вы увидите предупреждение.



Разрешить , чтобы сайт или его компонент (например, карта) узнал, где вы находитесь. В Умной строке появится значок .


Блокировать , чтобы сайт не узнал, где вы. В Умной строке появится значок .

Нажмите или , чтобы изменить решение.

Просмотреть сайты, которым разрешено определять местоположение


Нажмите → Настройки → Сайты . Прокрутите страницу вниз и нажмите Расширенные настройки сайтов . В блоке Доступ к местоположению нажмите ссылку Настройки сайтов.

На вкладке Разрешен отображается список сайтов, которым разрешено следить за вашим местоположением. Чтобы удалить сайт из списка, наведите на него указатель мыши и нажмите появившуюся ссылку Удалить . После этого сайт не будет определять ваше местоположение.


В этом небольшом туториале мы вместе с вами выполним три простых задания:

  • С помощью Geolocation API и Leaflet.js определим текущее местоположение пользователя и отобразим его на карте
  • Реализуем анимированный переход между городами
  • Реализуем переключение между адресами с предварительным получением названия объекта и его координат

Поиграть с кодом можно здесь:

Определяем текущее местоположение пользователя

Geolocation API позволяет пользователю предоставлять веб-приложению данные о своем местоположении. В приложении для запроса этих данных используется метод Geolocation.getCurrentPosition(). Данный метод принимает один обязательный и два опциональных параметра: success — функция обратного вызова, получающая объект Position при предоставлении разрешения, error — функция обратного вызова, получающая объект PositionError при отказе в доступе, и options — объект с настройками. Вот как это выглядит в коде:

Отображаем местоположение пользователя на карте

В качестве карты мы будем использовать Leaflet.js. Данный сервис является альтернативой Google Maps и OpenStreetMap, уступает им по функционалу, но подкупает простотой интерфейса. Создаем разметку, в которой подключаем стили и скрипт карты:


Добавляем минимальные стили (style.css):


Создаем модуль map.js следующего содержания:


Наконец, создаем script.js:


Открываем index.html в браузере, нажимаем на кнопку, предоставляем разрешение на получение данных о местоположении, видим нашу позицию на карте.


Отлично. Двигаемся дальше.

Анимированный переход между городами

Предположим, что у нас имеется объект с тремя городами (Москва, Санкт-Петербург, Екатеринбург) и их координатами (db/cities.json):


Нам необходимо реализовать плавное переключение между этими городами на карте.

Добавляем в разметку контейнер для городов:


Также немного изменим map.js:


Открываем index.html. При нажатии первой кнопки сразу получаем позицию и название города. При нажатии второй и последующих кнопок плавно перемещаемся между городами.


Плавное переключением между адресами

Предположим, что у нас имеются три объекта с названиями и адресами (db/addresses.json):


Нам необходимо реализовать переключение между этими объектами на карте. Но как нам это сделать без координат? Никак. Следовательно, нам каким-то образом нужно эти координаты получить. Для этого воспользуемся сервисом Nominatim от OpenStreetMap. О том, как правильно сформировать строку запроса, смотрите здесь. Я продемонстрирую лишь один из возможных вариантов.

Итак, создаем в разметке контейнер для адресов:


Открываем index.html. При нажатии первой кнопки сразу получаем позицию и название театра. При нажатии второй и последующих кнопок плавно перемещаемся между театрами.


Круто. Все работает, как ожидается.

На этом позвольте откланяться. Надеюсь, вы нашли для себя что-нибудь интересное. Благодарю за внимание и хорошего дня.

Читайте также: