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

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

Зачем нужен GeoIP

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

Сложно ли определить местоположение пользователя по IP-адресу? Пожалуй не сложно. А вот сделать это качественно — задачка не для слабонервных. Этому есть несколько причин:
  1. Точность определения крайне низкая и варьируется в зависимости от базы IP-адресов;
  2. IP-адреса постоянно меняют местоположение, а обновлять базы владельцы сайтов забывают;
  3. У разработчиков есть соблазн пойти по кривой дорожке и начать обращаться к онлайн-сервисам;
  4. Разработчикам лень делать кэширование;
  5. Название города, которое возвращают гео-базы, сложно связать с местоположениями сайта и бизнес-логикой;
  6. В Битриксе нет готового компонента для отображения/смены города.
Разница в трудоемкости между “и так сойдет” и “надежным решением” составляет 20-40 человеко-часов. Мы долго набивали шишки, а когда надоело — собрали все наши наработки в один крутой модуль для 1С-Битрикс.

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

Как это работает

Несколько 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.

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

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

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

  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-базу. 

Подключение Провайдера информации о IP-адресе

Чтобы компонент начал определять город посетителя автоматически, нужно импортировать стандартные местоположения магазина в Битрикс и включить настройку нашего модуля "Сопоставлять найденному адресу местоположение из модуля "Интернет-магазин"

Обновление баз данных провайдеров

Сохраняем настройки и переходим на вкладку “Проверка”. Проверяем свой 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);
}

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

Код в консоли PHP

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

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

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

Выбор города из выпадающего списка

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

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

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

Информация о покупателе

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

Выводы

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

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

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

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


Оцените статью
27.10.2017
Понравилась статья?
Поделитесь ссылкой с друзьями и коллегами!

Статьи по теме

Выжимаем максимум скорости из PHPКогда дело доходит до запуска PHP-приложений, выбор подходящего веб-сервера критически важен. Цель статьи — помочь в выборе оптимального решения для своих проек...
Организация поиска на сайте: выбираем между поиском Битрикса, Sphinx и ElasticsearchВ статье разбираем популярные поисковые движки, чтобы выбрать лучший под задачи конкретного проекта. Даем советы по индексации каталога и построении «умного» фи...
Доработка системы LMS KnomaryMust have для бизнеса, где главный актив это люди, — стратегия обучения и развития персонала. Рассказываем как помогли доработать LMS-систему для компании ЕВРАЗ...
«Как раньше» больше не работает — B2B-система продаж сейчасВ этой статье хотим поговорить с чем сейчас сталкивается оптовый бизнес (множеством вызовов и изменений, которые требуют адаптации, а также оптимизации процессо...
Интеграция B2B-платформы на Битрикс с системой авторизации KeycloakВ период бурного роста компании менеджмент учетных записей сотрудников и клиентов может стать проблемой. Решение — интеграция с брокером авторизаций Keycloak ил...
Разработка календаря бронирования для сайта на Битрикс авиационного учебного центраЧтобы пилоты авиакомпаний могли бронировать время своих тренировок в учебном центре, мы разработали для них удобный модуль бронирования времени. Рассказываем по...
Мы работаем по одному из двух форматов:
  • аренда команды (от 2 человек, не менее 3 месяцев);
  • итерации с фиксированной ценой (1-3 месяца длительностью).
ИНТЕРВОЛГА предоставляет:
  • регулярные онлайн-планерки с заказчиком;
  • квалифицированных специалистов;
  • организованную команду (находятся в одном помещении, что упрощает решение рабочих вопросов);
  • полную прозрачность и регулярность отчетов о результатах.
Ключевые услуги:
  • нагруженный интернет-магазин;
  • личный кабинет;
  • оптовые продажи — B2B-платформа;
  • маркетплейс;
  • технический аудит сайта;
  • Битрикс24 — корпоративные HR-порталы;
  • Битрикс24 — построение CRM-системы;
  • Битрикс24 — личные кабинеты сотрудников;
  • Битрикс24 — аудит портала;
  • 1С — интеграция с другими системами;
  • 1С — доработка системы;
  • маркетинг — комплексное интернет-продвижение;
  • маркетинг — продвижение для B2B.
Хотите получать лучшие статьи от INTERVOLGA раз в месяц?
Подпишитесь на рассылку — спамить не будем