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

Анатолий Ерофеев
Виктор С.

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

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

Зачем нужен 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
Понравилась статья?
Поделитесь ссылкой с друзьями и коллегами!

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

07.03.2023
Дорожная карта внедрения платформы автоматизации оптовых продаж Про построение эффективных отделов продаж написано много крутых статей. Одни эксперты готовы сделать это за 10 шагов, другие предлагают многоэтапную эволюц...
16.02.2023
Как начать B2B-продажи онлайн - особенности и методы оптовой торговли После пандемии рынок e-commerce начал стремительно расти. Мы говорим не только о B2C, но и о B2B-сегменте. Многие крупные компании уже разглядели потенциал...
10.01.2023
Как битриксоиды в React уходили Приятно познакомиться, мы битриксоиды. Да-да, те самые которые: вообще не модные, пишут НЕ на Laravel и Symfony, ...
10.01.2023
Товарная дистрибуция 30 лет спустя. Как программисты изменили продажи крупного бизнеса «Я думал, что буду строить банк, а на самом деле построил ИТ-компанию» Олег Тиньков, безработный Есть такая штука — товарная дистри...
10.01.2023
Как мы решили выпускать собственный продукт через CustDev и у нас получилось Собственный продукт как фиксация компетенции  В развитии крупных компаний-аутсорсеров наступает момент, когда они уже обросли опытом и компетенциями ...
19.12.2022
Учимся настраивать свою почту, не наступая на чужие грабли: Postfix + msmtp + сайт Привет, меня зовут Никита, я backend-разработчик в компании ИНТЕРВОЛГА. Работаю в компании уже 3 года, и за этот срок достаточно часто мне приходилось вози...

Мы работаем по одному из двух форматов:

  • аренда команды (от 2 человек, не менее 3 месяцев);
  • итерации с фиксированной ценой (1-3 месяца длительностью).

ИНТЕРВОЛГА предоставляет:

  • регулярные онлайн-планерки с заказчиком;
  • квалифицированных специалистов;
  • организованную команду (находятся в одном помещении, что упрощает решение рабочих вопросов);
  • полную прозрачность и регулярность отчетов о результатах.

Для доработок и развития мы предлагаем формат 100 часов в месяц. Что можно сделать за это время:

  • новые нетиповые страницы или раздел;
  • 2 отчета с индивидуальными настройками;
  • 3-5 веб-сервисов интеграции;
  • замудренный калькулятор и т.п.

Поддержка «чтобы все работало как часы» стоит 45 тысяч рублей в месяц и описана тут.

Хочешь получать лучшие статьи от INTERVOLGA раз в месяц?
Подпишись на рассылку — спамить не будем