Определение города по GeoIP и геозависимость на сайтах
Слушайте, я не узнаю́ вас в гриме! Кто Вы такой?
Зачем нужен GeoIP
Перед Вами стоит задача показывать разные телефоны/цены/наличие товаров в зависимости от города пользователя? Или может быть вы хотите упростить пользователю оформление заказа? — Эти задачи упираются в автоматическое определение страны/города по IP-адресу.Сложно ли определить местоположение пользователя по IP-адресу? Пожалуй не сложно. А вот сделать это качественно — задачка не для слабонервных. Этому есть несколько причин:
- Точность определения крайне низкая и варьируется в зависимости от базы IP-адресов;
- IP-адреса постоянно меняют местоположение, а обновлять базы владельцы сайтов забывают;
- У разработчиков есть соблазн пойти по кривой дорожке и начать обращаться к онлайн-сервисам;
- Разработчикам лень делать кэширование;
- Название города, которое возвращают гео-базы, сложно связать с местоположениями сайта и бизнес-логикой;
- В Битриксе нет готового компонента для отображения/смены города.
Под капотом гео-модуля
Как это работаетНесколько GEO IP баз на выбор
Всего существует 4,22 миллиарда IPv4 адресов. Они делятся между странами. Внутри стран между интернет-операторами. Последние в свою очередь распределяют их между городами присутствия. А потом перераспределяют по необходимости.
Существуют специальные реестры где зафиксировано это самое распределение. В рамках статьи мы будем называть их GeoIP-базами. Отличаются они частотой обновления, точностью и объемом дополнительных данных (названия городов на нескольких языках, почтовые индексы, названия интернет-операторов).
В модуле мы поддерживаем 3 обычные гео-базы:
- MaxMind,
- IpGeoBase,
- Sypex Geo
и одну “мета-базу”: MaxMind + IpGeoBase.
MaxMind определяется местоположение вплоть до городов по всему миру. Но обновляется редко (бесплатная версия раз в месяц). С другой стороны IpGeoBase хорошо работает только по РФ и Украине, зато обновляется каждый день.
“Мета-база” определяет местоположение сначала по IpGeoBase. Если страна определена как Россия или Украина, данные считаются самыми точными. Если страна другая — обращаемся к MaxMind.
Независимость от кодировок
Разные базы хранятся в разных кодировках (CP1251, UTF-8). И сайты могут быть в разных кодировках. Это было непросто, но мы реализовали корректную работу всех гео-баз для сайтов в обеих кодировках.
Высокая скорость работы
Почти со всеми гео-базам можно обращаться и через веб-сервисы, и локально (после скачивания).
Начинающие разработчики часто выбирают первый вариант. Оно и понятно, это проще и не нужно заботиться об обновлении баз. Но есть 2 ложки дегтя:
- Зависнет веб-сервис — зависнет и сайт. Веб-сервис “умер” — сайт не открывается совсем.
- Обращение к веб-сервисам это сетевой запрос. А это в свою очередь “самая долгая” операция в программировании (10-100% от времени формирования всей страницы).
Мы (ИНТЕРВОЛГА) видели много примеров, когда разработчики шли этим путем и получали кучу проблем со скоростью работы сайта.
Наш модуль работает исключительно с локальными гео-базами. Кроме того, мы реализовали кеширование запросов к этим базам. Как результат определение местоположения по IP практически не влияет на скорость работы сайта.
Автоматическое обновление гео-баз
Локальные гео-базы это надежно. Но их нужно обновлять. А никто про это не помнит.
Специально на этот случай мы реализовали автоматическое обновление этих самых баз: только нужных, только если они изменились, с частотой необходимой для конкретной базы, с последующим сбросом кеша гео-запросов.
На выбор есть несколько способов: на агентах (по умолчанию), на хитах и на CRON.
Связь с местоположениями Битрикса
Геобазы возвращают текстовое название страны и города. Но без привязки к логике работы сайта толку от этого – ноль.
Давайте подробнее рассмотрим, зачем вообще нужно определение положения пользователя:
- Показать наличие и/или стоимость доставки в конкретном городе в карточке товара.
- Выбрать город по умолчанию в форме заказа.
- Показать разные номера телефонов в шапке для Москвы, Санкт-Петербурга, Города X и телефон по умолчанию для всех остальных.
К сожалению, в программном коде вы узнаете только название города вашего посетителя. Например, “Волгоград”. Для одной из трех задач этого хватит.
Для двух других задач потребуется сопоставить текстовое название города из гео-базы с местоположениями 1С-Битрикс. А они древовидные, а названия городов с гео-базами не совпадают (“Волгоград” vs “г. Волгоград”)…
Мы реализовали такое сопоставление хитрым алгоритмом и считаем получившийся результат достаточно качественным.
Интеграция с новым API Битрикса для геолокации
С версии 17.0.9 главного модуля в БУС добавлены службы геолокации и мы реализовали интеграцию нашего модуля с этим новым API.
Виджеты и компоненты
В модуле есть 2 компонента:
-
Местоположение пользователя.
Виджет показывает текущий город посетителя с возможностью смены. -
Автолокация.
Кнопка при нажатии на которую происходит определение местоположения и перезагрузка страницы. Дополнительно в этом компоненте реализовано определение города на основе Яндекс.Карт (точнее, но работает только в браузере — не на сервере).
Подробнее об их использовании — ниже.
Дополнительные сведения о браузере
Помимо определения GEO IP мы встроили в наш модуль определение информации о браузере посетителя (операционная система, мобильность, язык и т.д.) на основе параметра браузера “User Agent”.
Эта информация нужна редко, но в паре проектов нам пригодилась.
Интерфейс проверки
В разделе настройки модуля мы реализовали отдельную закладку для тестирования его возможностей.
Она позволяет быстро протестировать все доступные гео-базы на разных IP-адресах.
Ограничения
- Версия 1С-Битрикс >= 16.0
- Версия PHP >= 5.5.
Установка, настройка, использование
Рассмотрим как установить, настроить и начать использовать модуль на примере типового интернет-магазина 1С-Битрикс.
Установка и настройка модуля
После установки модуля необходимо в настройках (Настройки > Настройки продукта > Настройки модулей > ”GEOIP и расширенные данные о посетителе”) выбрать наиболее подходящую GeoIP-базу.
Чтобы компонент начал определять город посетителя автоматически, нужно импортировать стандартные местоположения магазина в Битрикс и включить настройку нашего модуля "Сопоставлять найденному адресу местоположение из модуля "Интернет-магазин"
Сохраняем настройки и переходим на вкладку “Проверка”. Проверяем свой 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);
}
Результат должен быть примерно такой
Выбор города в шапке сайта
Компонент называется intervolga:enrich.user.location. Вот так выглядит результат его работы.
Хотите получить полное описание настроек компонента и узнать как в своем коде узнать текущий выбранный/измененный город? — Поделитесь статьей в соц. сетях, укажите ссылку в форме ниже и мы пришлем Вам инструкцию.
Автоопределение города в оформлении заказа
Компонент enrich.autolocation – кнопочка, которая встраивается в старый шаблон компонента оформления заказа (версия Битрикса 16.0.11). По нажатию на эту кнопку происходит автоподстановка местоположения пользователя в поле ввода местоположения без перезагрузки страницы.
Если же у вас используется более новая версия Битрикса (17.0.+), компонент не нужен и местоположение будет определено автоматически за счет службы геолокации для автоопределения местоположения.
Выводы
Модуль intervolga.enrich был собран на базе наших лучших практик. Это универсальное надежное решение без каких-либо зависимостей.
Он закрывает большинство гео-задач встречаемых при разработке сложных интернет-магазинов:
- выбор города в шапке сайт,
- выбор города в профиле пользователя,
- выбор города в оформлении заказа,
- вывод определенного контента в зависимости от города.
В модуле есть публичные методы для получения информации о пользователе, которые можно использовать для расширения функционала своих решений.
Статьи по теме
- аренда команды (от 2 человек, не менее 3 месяцев);
- итерации с фиксированной ценой (1-3 месяца длительностью).
- регулярные онлайн-планерки с заказчиком;
- квалифицированных специалистов;
- организованную команду (находятся в одном помещении, что упрощает решение рабочих вопросов);
- полную прозрачность и регулярность отчетов о результатах.
- нагруженный интернет-магазин;
- личный кабинет;
- оптовые продажи — B2B-платформа;
- маркетплейс;
- технический аудит сайта;
- Битрикс24 — корпоративные HR-порталы;
- Битрикс24 — построение CRM-системы;
- Битрикс24 — личные кабинеты сотрудников;
- Битрикс24 — аудит портала;
- 1С — интеграция с другими системами;
- 1С — доработка системы;
- маркетинг — комплексное интернет-продвижение;
- маркетинг — продвижение для B2B.