Работа с GeoIP средствами битрикс

Модуль расширенного управления меню для битрикс

Июль 4, 2018

Теги: Основное

Работа с GeoIP (определением местоположения пользователя) штатными средствами битрикс (класс "\Bitrix\Main\Service\GeoIp").

Данные о местоположении при использовании этого класса могут быть определены при помощи разных провайдеров (MaxMind, SypexGeo и др., см. событие "onMainGeoIpHandlersBuildList"). Установленные источники данных о местоположении отображаются на странице Настройки > Настройки продукта > Геолокация. Там же можно настроить дополнительные параметры для служб, например, без регистрационного ключа SypexGeo позволяет определять местоположение только 10 000 раз в месяц, MaxMind на данный момент вообще не работает без лицензии т.д. Также можно настроить порядок, в котором будут происходить попытки определения местоположения разными службами. Чтобы использовать службу "Расширение GeoIP", необходимо чтобы соответствующий плагин был установлен и были загружены необходимые базы (которые также предоставляются MaxMind).

Определение IP-адреса пользователя:


$ip = \Bitrix\Main\Service\GeoIp\Manager::getRealIp();

Получение объекта с данными о местоположении (на некоторых хостингах, например, timeweb, может быть установлена только англоязычная база расширения geoip, поэтому, если не работает, можно попробовать "en" вместо LANGUAGE_ID):


$geoIpData = \Bitrix\Main\Service\GeoIp\Manager::getDataResult($ip,LANGUAGE_ID);

/*
Bitrix\Main\Service\GeoIp\Result Object
(
    [geoData:protected] => Bitrix\Main\Service\GeoIp\Data Object
        (
            [ip] => 5.22.219.240
            [lang] => ru
            [countryName] => Россия
            [regionName] => Санкт-Петербург
            [subRegionName] => 
            [cityName] => Санкт-Петербург
            [countryCode] => RU
            [regionCode] => RU-SPE
            [zipCode] => 
            [latitude] => 59.45637
            [longitude] => 30.73856
            [timezone] => Europe/Moscow
            [asn] => 
            [ispName] => 
            [organizationName] => 
            [handlerClass] => Bitrix\Main\Service\GeoIp\SypexGeo
        )

    [isSuccess:protected] => 1
    [errors:protected] => Bitrix\Main\ErrorCollection Object
        (
            [values:protected] => Array
                (
                )

        )

    [data:protected] => Array
        (
        )

)    
*/

Проверить, было ли определение успешным:


$geoIpData->isSuccess()

Получение страны:


$geoIpData->getGeoData()-countryName // "Russia"

Получение региона:


$geoIpData->getGeoData()-regionName

Получение города:


$geoIpData->getGeoData()-cityName

Прочие данные:


$geoIpData->getGeoData()->countryName // Россия

$geoIpData->getGeoData()->regionName // Санкт-Петербург
$geoIpData->getGeoData()->subRegionName
$geoIpData
->getGeoData()->cityName // Санкт-Петербург
$geoIpData->getGeoData()->countryCode // RU
$geoIpData->getGeoData()->regionCode // RU-SPE
$geoIpData->getGeoData()->zipCode 
$geoIpData
->getGeoData()->latitude // 59.45637
$geoIpData->getGeoData()->longitude // 30.73856
$geoIpData->getGeoData()->timezone // Europe/Moscow
$geoIpData->getGeoData()->asn
$geoIpData
->getGeoData()->ispName
$geoIpData
->getGeoData()->organizationName

Класс службы, с помощью которой было определено местоположение:


$geoIpData->getGeoData()->handlerClass // Bitrix\Main\Service\GeoIp\SypexGeo

Код страны одной строкой:


$countryCode = \Bitrix\Main\Service\GeoIp\Manager::getCountryCode($ip,LANGUAGE_ID); // "RU", "US"

Название страны одной строкой:


$countryName = \Bitrix\Main\Service\GeoIp\Manager::getCountryName($ip,LANGUAGE_ID); // "Россия", "США"

Название города одной строкой:


$cityName = \Bitrix\Main\Service\GeoIp\Manager::getCityName($ip,LANGUAGE_ID); // "Санкт-Петербург", "Москва"

Почтовый индекс города одной строкой:


$postCode = \Bitrix\Main\Service\GeoIp\Manager::getCityPostCode($ip,LANGUAGE_ID); // NULL (определяется не всегда)

Данные о геопозиции одной строкой:


$geoPosition = \Bitrix\Main\Service\GeoIp\Manager::getGeoPosition($ip,LANGUAGE_ID);

/*
Array
(
    [latitude] => 59.45637
    [longitude] => 30.73856
)
*/
$lat = \Bitrix\Main\Service\GeoIp\Manager::getGeoPositionLatitude($ip,LANGUAGE_ID)); // float(59.45637)
$lon = \Bitrix\Main\Service\GeoIp\Manager::getGeoPositionLongitude($ip,LANGUAGE_ID)); // float(30.73856)

Другие shorthand-функции:


\Bitrix\Main\Service\GeoIp\Manager::getOrganizationName($ip,LANGUAGE_ID)); 

\
Bitrix\Main\Service\GeoIp\Manager::getIspName($ip,LANGUAGE_ID)); 
\
Bitrix\Main\Service\GeoIp\Manager::getTimezoneName($ip,LANGUAGE_ID)); // "Europe/Moscow"

Список кодов регионов для geoip:


RU,01,"Adygeya, Republic of"

RU,02,"Aginsky Buryatsky AO"
RU,03,"Gorno-Altay"
RU,04,"Altaisky krai"
RU,05,"Amur"
RU,06,"Arkhangel'sk"
RU,07,"Astrakhan'"
RU,08,"Bashkortostan"
RU,09,"Belgorod"
RU,10,"Bryansk"
RU,11,"Buryat"
RU,12,"Chechnya"
RU,13,"Chelyabinsk"
RU,14,"Chita"
RU,15,"Chukot"
RU,16,"Chuvashia"
RU,17,"Dagestan"
RU,18,"Evenk"
RU,19,"Ingush"
RU,20,"Irkutsk"
RU,21,"Ivanovo"
RU,22,"Kabardin-Balkar"
RU,23,"Kaliningrad"
RU,24,"Kalmyk"
RU,25,"Kaluga"
RU,26,"Kamchatka"
RU,27,"Karachay-Cherkess"
RU,28,"Karelia"
RU,29,"Kemerovo"
RU,30,"Khabarovsk"
RU,31,"Khakass"
RU,32,"Khanty-Mansiy"
RU,33,"Kirov"
RU,34,"Komi"
RU,36,"Koryak"
RU,37,"Kostroma"
RU,38,"Krasnodar"
RU,39,"Krasnoyarsk"
RU,40,"Kurgan"
RU,41,"Kursk"
RU,42,"Leningrad"
RU,43,"Lipetsk"
RU,44,"Magadan"
RU,45,"Mariy-El"
RU,46,"Mordovia"
RU,47,"Moskva"
RU,48,"Moscow City"
RU,49,"Murmansk"
RU,50,"Nenets"
RU,51,"Nizhegorod"
RU,52,"Novgorod"
RU,53,"Novosibirsk"
RU,54,"Omsk"
RU,55,"Orenburg"
RU,56,"Orel"
RU,57,"Penza"
RU,58,"Perm'"
RU,59,"Primor'ye"
RU,60,"Pskov"
RU,61,"Rostov"
RU,62,"Ryazan'"
RU,63,"Sakha"
RU,64,"Sakhalin"
RU,65,"Samara"
RU,66,"Saint Petersburg City"
RU,67,"Saratov"
RU,68,"North Ossetia"
RU,69,"Smolensk"
RU,70,"Stavropol'"
RU,71,"Sverdlovsk"
RU,72,"Tambovskaya oblast"
RU,73,"Tatarstan"
RU,74,"Taymyr"
RU,75,"Tomsk"
RU,76,"Tula"
RU,77,"Tver'"
RU,78,"Tyumen'"
RU,79,"Tuva"
RU,80,"Udmurt"
RU,81,"Ul'yanovsk"
RU,83,"Vladimir"
RU,84,"Volgograd"
RU,85,"Vologda"
RU,86,"Voronezh"
RU,87,"Yamal-Nenets"
RU,88,"Yaroslavl'"
RU,89,"Yevrey"
RU,90,"Permskiy Kray"
RU,91,"Krasnoyarskiy Kray"
RU,92,"Kamchatskiy Kray"
RU,93,"Zabaykal'skiy Kray"

См. также:

← Переход к списку