Определение города по GeoIP и геозависимость на сайтах

Слушайте, я не узнаю́ вас в гриме! Кто Вы такой?

© Иван Васильевич меняет профессию

Зачем нужен GeoIP

Перед Вами стоит задача показывать разные телефоны/цены/наличие товаров в зависимости от города пользователя? Или может быть вы хотите упростить пользователю оформление заказа? — Эти задачи упираются в автоматическое определение страны/города по IP-адресу.

Сложно ли определить местоположение пользователя по IP-адресу? Пожалуй не сложно. А вот сделать это качественно — задачка не для слабонервных. Этому есть несколько причин:

  1. Точность определения крайне низкая и варьируется в зависимости от базы IP-адресов
  2. IP-адреса постоянно меняют местоположение, а обновлять базы владельцы сайтов забывают
  3. У разработчиков есть соблазн пойти по кривой дорожке и начать обращаться к онлайн-сервисам
  4. Разработчикам лень делать кэширование
  5. Название города, которое возвращают гео-базы, сложно связать с местоположениями сайта и бизнес-логикой.
  6. В Битриксе нет готового компонента для отображения/смены города

Разница в трудоемкости между “и так сойдет” и “надежным решением” составляет 20-40 человеко-часов. Мы долго набивали шишки, а когда надоело — собрали все наши наработки в один крутой модуль для 1С-Битрикс .

Под капотом гео-модуля

Несколько GEO IP баз на выбор

Всего существует 4,22 миллиарда IPv4 адресов. Они делятся между странами. Внутри стран между интернет-операторами. Последние в свою очередь распределяют их между городами присутствия. А потом перераспределяют по необходимости.

Существуют специальные реестры где зафиксировано это самое распределение. В рамках статьи мы будем называть их GeoIP-базами. Отличаются они частотой обновления, точностью и объемом дополнительных данных (названия городов на нескольких языках, почтовые индексы, названия интернет-операторов).

В модуле мы поддерживаем 3 обычные гео-базы:

и одну “мета-базу”: MaxMind + IpGeoBase.

MaxMind определяется местоположение вплоть до городов по всему миру. Но обновляется редко (бесплатная версия раз в месяц). С другой стороны IpGeoBase хорошо работает только по РФ и Украине, зато обновляется каждый день.

“Мета-база” определяет местоположение сначала по IpGeoBase. Если страна определена как Россия или Украина, данные считаются самыми точными. Если страна другая — обращаемся к MaxMind.

Независимость от кодировок

Разные базы хранятся в разных кодировках (CP1251, UTF-8). И сайты могут быть в разных кодировках. Это было непросто, но мы реализовали корректную работу всех гео-баз для сайтов в обеих кодировках.

Высокая скорость работы

Почти со всеми гео-базам можно обращаться и через веб-сервисы, и локально (после скачивания).

Начинающие разработчики часто выбирают первый вариант. Оно и понятно, это проще и не нужно заботиться об обновлении баз. Но есть 2 ложки дегтя:

  • Зависнет веб-сервис — зависнет и сайт. Веб-сервис “умер” — сайт не открывается совсем.
  • Обращение к веб-сервисам это сетевой запрос. А это в свою очередь “самая долгая” операция в программировании (10-100% от времени формирования всей страницы).

Мы (ИНТЕРВОЛГА) видели много примеров, когда разработчики шли этим путем и получали кучу проблем со скоростью работы сайта.

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

Автоматическое обновление гео-баз

Локальные гео-базы это надежно. Но их нужно обновлять. А никто про это не помнит.

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

На выбор есть несколько способов: на агентах (по умолчанию), на хитах и на CRON.

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

Геобазы возвращают текстовое название страны и города. Но без привязки к логике работы сайта толку от этого – ноль.

Давайте подробнее рассмотрим, зачем вообще нужно определение положения пользователя:

  1. Показать наличие и/или стоимость доставки в конкретном городе в карточке товара.
  2. Выбрать город по умолчанию в форме заказа.
  3. Показать разные номера телефонов в шапке для Москвы, Санкт-Петербурга, Города X и телефон по умолчанию для всех остальных.

К сожалению, в программном коде вы узнаете только название города вашего посетителя. Например, “Волгоград”. Для одной из трех задач этого хватит.

Для двух других задач потребуется сопоставить текстовое название города из гео-базы с местоположениями 1С-Битрикс . А они древовидные, а названия городов с гео-базами не совпадают (“Волгоград” vs “г. Волгоград”)…

Мы реализовали такое сопоставление хитрым алгоритмом и считаем получившийся результат достаточно качественным.

Интеграция с новым API Битрикса для геолокации

С версии 17.0.9 главного модуля в БУС добавлены службы геолокации и мы реализовали интеграцию нашего модуля с этим новым API.

Виджеты и компоненты

В модуле есть 2 компонента:

  • Местоположение пользователя.
    Виджет показывает текущий город посетителя с возможностью смены.
  • Автолокация.
    Кнопка при нажатии на которую происходит определение местоположения и перезагрузка страницы. Дополнительно в этом компоненте реализовано определение города на основе Яндекс.Карт (точнее, но работает только в браузере — не на сервере).

Подробнее об их использовании — ниже.

Дополнительные сведения о браузере

Помимо определения GEO IP мы встроили в наш модуль определение информации о браузере посетителя (операционная система, мобильность, язык и т.д.) на основе параметра браузера “User Agent”.

Эта информация нужна редко, но в паре проектов нам пригодилась.

Интерфейс проверки

В разделе настройки модуля мы реализовали отдельную закладку для тестирования его возможностей.

Она позволяет быстро протестировать все доступные гео-базы на разных IP-адресах.


Настройки модуля

Ограничения

  • Версия 1С-Битрикс >= 16.0
  • Версия PHP >= 5.5.

Установка, настройка, использование

Рассмотрим как установить, настроить и начать использовать модуль на примере типового интернет-магазина 1С-Битрикс.

Установка и настройка модуля

После установки модуля необходимо в настройках (Настройки > Настройки продукта > Настройки модулей > ”GEOIP и расширенные данные о посетителе”) выбрать наиболее подходящую GeoIP-базу. Остальные настройки не трогаем без необходимости.

Геобаза.png

Сохраняем настройки и переходим на вкладку “Проверка”. Проверяем свой IP-адрес.

Местоположение определено верно? — Отлично.

Не верно? — Пробуйте другую гео-базу на вкладке “Основные”.

Для 1С-Битрикс 17+
Переходим в настройки геолокации 1С-Битрикс: Настройки > Настройки продукта > Геолокация. В списке доступных провайдеров открываем “INTERVOLGA: GeoIP и расширенные данные о посетителе”.

Активируем. Полем “Сортировка” устанавливаем самый высокий приоритет среди других провайдеров. Сохраняем.

Использование на уровне API

Давайте убедимся что модуль работает и разберемся как использовать его на уровне API.

В админ. панели на странице “Консоль PHP” выполните код

use Bitrix\Main\Loader;
if (Loader::includeModule('intervolga.enrich')) {
     $result = \Intervolga\Enrich\ProviderProxy::getIpInfo('88.87.88.238');
     var_dump($result);
}

Результат должен быть примерно такой

Вывод API.jpg

Выбор города в шапке сайта

Компонент называется intervolga:enrich.user.location. Вот так выглядит результат его работы.

Компонент - 1.jpg

Компонент - 2.png

Хотите получить полное описание настроек компонента и узнать как в своем коде узнать текущий выбранный/измененный город? — Поделитесь статьей в соц. сетях, укажите ссылку в форме ниже и мы пришлем Вам инструкцию.

Автоопределение города в оформлении заказа

Компонент enrich.autolocation – кнопочка, которая встраивается в старый шаблон компонента оформления заказа (версия Битрикса 16.0.11). По нажатию на эту кнопку происходит автоподстановка местоположения пользователя в поле ввода местоположения без перезагрузки страницы.

Компонент - 3.png


Если же у вас используется более новая версия Битрикса (17.0.+), компонент не нужен и местоположение будет определено автоматически за счет службы геолокации для автоопределения местоположения.

Выводы

Модуль intervolga.enrich был собран на базе наших лучших практик. Это универсальное надежное решение без каких-либо зависимостей.

Он закрывает большинство гео-задач встречаемых при разработке сложных интернет-магазинов:

  • выбор города в шапке сайт,
  • выбор города в профиле пользователя,
  • выбор города в оформлении заказа,
  • вывод определенного контента в зависимости от города.

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


Я «поделился» статьей, прошу прислать файл