5 мая 2014 в 21:05

Sypex Geo 2.2 — теперь с GeoNames и ОКАТО

Вышла новая версия Sypex Geo 2.2 — очень быстрого алгоритма определения города по IP. Теперь базы данных стали двуязычными (русский и английский), регионы и города теперь привязаны к базе данных GeoNames, и имеют постоянные ID.

Были добавлены ОКАТО коды для городов и регионов России, КОАТУУ для Украины и СОАТО для Беларуси.

Технические подробности


Алгоритм работы Sypex Geo значительно не изменился, были исправлены небольшие ошибки, которые возникали при сильной неравномерности распределения IP диапазонов.

Основные изменения коснулись справочников.
  • Добавился справочник стран, позволяющий сохранянь более подробную информацию о стране.
  • Внедрен универсальный формат упаковщика данных, благодаря чему можно сохранять в базу любые данные, без изменений в API.
  • Формат упаковки сохраняется в файле базы данных, после заголовка.

Подробнее о формате данных можно почитать в спецификации формата SxGeo 2.2.

REST API


Вместе с новой версией Sypex Geo был запущен сервис REST API. Где с помощью простого запроса по HTTP или HTTPS можно получить наиболее актуальную и расширенную информацию об IP, используя самую свежую базу данных Sypex Geo Max.

Результаты могут выдаваться в 3 форматах: JSON, JSONP и XML. Поддерживается пакетная обработка, до 100 IP в запросе.

Простейший запрос к API выглядит так:
api.sypexgeo.net
В результате будет получена информация о вашем IP в формате JSON.
{
"ip":"123.45.67.89", // Запрашиваемый IP
"city":{ // Информация о городе
    "id":1835848, // ID города в GeoNames
    "lat":37.566, // Широта города
    "lon":126.9784, // Долгота города
    "name_ru":"Сеул", // Название на русском
    "name_en":"Seoul", // Название на английском
    "okato":"" // ОКАТО коды для городов России, КОАТУУ для Украины и СОАТО для Беларуси
},
"region":{ // Информация о регионе
    "id":1835847, // ID региона в GeoNames
    "lat":37.58, // Широта региона
    "lon":127, // Долгота региона
    "name_ru":"Сеул", // Название на русском
    "name_en":"Seoul", // Название на английском
    "iso":"KR-11", // ISO3166-2 геокод региона
    "timezone":"Asia/Seoul", // Часовой пояс региона
    "okato":"" // ОКАТО код для регионов России, КОАТУУ для Украины и СОАТО для Беларуси
},
"country":{ // Информация о стране
    "id":119, // ID страны
    "iso":"KR", // ISO3166-1 геокод страны
    "continent":"AS", // Код континента
    "lat":36.5, // Широта центра страны
    "lon":127.75, // Долгота центра страны
    "name_ru":"Южная Корея", // Название на русском
    "name_en":"South Korea", // Название на английском
    "timezone":"Asia/Seoul" // Часовой пояс столицы
}}


Те же данные в xml можно получить выполнив
api.sypexgeo.net/xml

Чтобы получить информацию об произвольном IP нужно выполнить запрос:
api.sypexgeo.net/json/123.45.67.89

Если нужно проверить сразу несколько IP, нужно их просто перечислить через запятую или точку с запятой
api.sypexgeo.net/json/123.45.67.89;222.22.22.22

Чтобы получить данные в формате JSONP нужно выполнить запрос:
api.sypexgeo.net/jsonp/123.45.67.89&callback=alert

Допускаются и POST запросы, в таком случае IP указываются в параметре ip.

Ссылки по теме

@zapimir
карма
98,2
рейтинг 0,0
Похожие публикации
Самое читаемое Разработка

Комментарии (40)

  • +1
    Ура! Дождались!

    Надеюсь на регулярность обновления.
    • 0
      Пока, что по планам темп обновлений — 2 раза в месяц.
  • –1
    Всё хорошо но вот только изо 3G операторов не получается точно определять ip.
    А рынок без проводного рынка растет.
    • +1
      Ну с 3G как и просто с крупными провайдерами могут быть проблемы, так как далеко не всегда они указывают информацию о распределении IP.
      • 0
        А некрупные просто вам сообщают домашние адреса своих клиентов по ip?
        • 0
          Зависит от провайдера, зачастую указывают, в каком городе подсеть или районе города для крупных городов.
        • +1
          Мелкие провайдеры, обычно, действуют в рамках одного или нескольких городов в пределах одного региона. Соответственно, все их IP-адреса будут принадлежать к конкретному региону и, с большой долей вероятности, к определенному городу, в котором и работает провайдер.

          Для крупных же провайдеров вполне характерна ситуация, когда пользователи одного региона выходят в сеть через шлюз, расположенный в другом регионе. А у мобильных операторов проблема усугубляется использованием NAT, когда вообще всегда все пользователи федерального округа выходят через единый шлюз. Например, Калининградцы, использующие Мегафон, выходят в Интернет через Санкт-Петербург, точно так же, как и сами Питерцы, и еще куча регионов, да еще и одновременно с одного IP-адреса (по крайней мере, я не заметил распределения IP-адресов из их диапазона по регионам). В данном случае определить регион по IP-адресу просто невозможно.
      • 0
        По моему для них это не проблема. Они наверно даже и не в курсе про наши проблемы. Так как по видимому с этого не зарабатывают.
        Я решил эту проблему для себя так. Не показываю гео зависимую выдачу если клиент зашёл через мобильного оператора. Может показаться что я теряю что то но я терял больше когда людям из одного города показывал другой. Чисто потому что оператор выход в интернет с делал в другом городе.
  • +1
    Парни, ОКАТО отменили.
    Теперь ОКТМО.
    • 0
      Пасиб за инфу, заменим к следующему обновлению базы.
  • 0
    «okato»:"" // ОКАТО код для регионов России, КОАТУУ для Украины и СОАТО для Беларуси
    Для каждого варианта будет свое наименование поля? Или будет всегда именоваться okato?
    • 0
      поле везде okato, так как по сути одно и тоже, только по разному названо в разных странах.
  • 0
    Да уж, уже более года искал GeoIP базу поддерживаемую, но на мои вопросы так и не отозвались…
    У Вас как дела обстоят?
    • +1
      Пока что сходу вижу очевидный недочет — вы не возвращаете диапазон IP провайдера к которому принадлежит запрашиваемый IP, что крайне затрудняет кеширование запросов и существенно увеличивает их число к вашему сервису.
      PS Часовой пояс желательно бы для города, а не для страны возвращать. Более практически полезно будет.
      • 0
        А почему Вы не храните слепок geoip-базы у себя?
        • 0
          Реальная ситуация с распределением IP меняется постоянно, минимум раз в месяц, зачем мне просроченные данные?
          Результаты запросов кешируются для уменьшения их числа, но не дольше чем на 30 дней.

          Этим и отличаются недобросовестные GeoIP сервисы, что заливают 1 раз базу к себе и бросают в таком состоянии на N лет. Нужен именно поддерживаемый внешний сервис.
          • 0
            Я автоматом поставил скачиваться и парситься базу ipgeobase раз в неделю, благо архив всегда доступен по одному и тому же адресу.
            В итоге у меня один-единственный медленный запрос в неделю и вполне актуальные данные.
            • 0
              Как раз ipgeobase последнее время крайне разочаровывает редиректами из-за превышения нагрузки (писал ранее на тостере), а перекачивать регулярно. Да и одного СНГ маловато…
      • 0
        Если вам нужно обрабатывать много адресов, то лучше использовать базу локально. Так как в любом случае ping никуда не денется. И значительно быстрее проверить по локальной базе. API имеет смысл использовать, когда запросы достаточно редкие, ну например, в админке сделать кнопочку посмотреть откуда юзер пришел.
        • 0
          Нет, не лучше, см коммент выше. Нужная актуальная информация, а не «кукла».
  • 0
    Дополнительные данные получаете с гугла?
    • 0
      Что под дополнительными данными имеется ввиду? Если окато, временные зоны, то из открытых справочников, в том числе wiki.
  • 0
    А выложите плз скрипт-пример, как загнать свою базу в формат sxgeo.
    • 0
      Я думаю к середине месяца выложим. Сейчас соберем отзывы если всё нормально, то выложим конвертер. И займемся модулями для серверов.
  • +1
    Было бы полезно в информации о городе иметь данные о часовом поясе, а то эта информация для страны применимо к России не очень поможет.
    • 0
      Сейчас информация о часовом поясе идет для каждого региона. Проверю, есть ли города у которых временная зона отличается от временной зоны для региона.
      • 0
        Исключений оказалось не много, но они есть: Вики
  • 0
    Не помешало бы:

    — рейтинг достоверности источника (ведь наверняка данные не из одного источника);
    — диапазон IP к которому принадлежит адрес;
    — (возможно) владелец диапазона.
  • 0
    Было бы еще хорошо давать возможность делать срезы базы данных. Например, сайт имеет свои страницы для областных центров Уральского ФО, а остальные посетители перенаправляются на страницу по умолчанию. Поэтому, был бы интересен срез по конкретным городам.
    • 0
      В принципе такое легко реализуемо, тут разве что нужно подумать как будет выглядеть интерфейс для создания срезов.
  • 0
    Есть проблема с одноименными населенными пунктами, так например адрес 77.106.95.186 принадлежит российскому Северску в Томской области, но определяется как украинский из Донецкой области.

    • +1
      Если бы только. 78.30.215.196 принадлежит Севастополю. (http://api.sypexgeo.net/json/78.30.215.196), который уже не UA и таймзона там не киевская
      • 0
        Данные привязаны к GeoNames, так что, тут разве, что спецверсию базы для России делать.
        • 0
          в ссылке-примере 109.110.95.135 (Севастополь) на карте отобразило возле Брянска где-то…
          • 0
            Базы MaxMind и IP2Location тоже так думают. Думаю, виноват здесь, опять же, GeoNames.
          • 0
            Поправили. Добавил возможность давать ссылки на демку sypexgeo.net/ru/demo/78.30.215.196
            Тут как раз приколы в том, что в России есть еще два Севастополя. Потому бывают такие глюки.
      • –4
        Разработчик из Украины. По конституции Украины, АР Крым находится в составе Украины. Так что все правильно Севастополь — UA.
        • +1
          Так что же, теперь все Geo-базы будут составляться в зависимости от того, кому как захотелось, независимо от реального положения дел?

          Тем более, whois IP-адреса говорит сам за себя:
          netname:        LANCOM-DIR2
          descr:          Lancom Ltd, Russia, Sevastopol
          descr:          Sevstar TM, broadband
          country:        ru
          


          P.S. Вот и автор выше озвучил, почему так вышло. И никакой политики здесь нет.
    • 0
      Пасиб, да, был такой глюк исправили.
  • +1
    Большое спасибо за внешние ключики из geonames.
    А то раньше по несколько часов бедный Левенштайн работал.

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