Идеального API «Город по IP» не существует. Наше — хорошее

У «Дадаты» есть фича «Город по IP» — ее часто используют, например, интернет-магазины.

По IP определяют, где живет посетитель сайта. Если город известен, клиенту можно сразу показать стоимость доставки или скорректировать список доступных товаров.

Порой нам пишут пользователи и сетуют: мол, у вас в «Адресе по айпи» ошибки. Не тот город.

Весточка из числа тех, что мы иногда получаем

Проблема действительно существует: «Дадата» определяет населенный пункт по IP с точностью 60-80%. В статье я расскажу, почему определить город по айпи так сложно, откуда берутся промахи и есть ли в природе идеальное решение.

Спойлер: увы, полностью от ошибок не избавиться. Это не проблема «Дадаты» как сервиса, а принципиальная особенность технологии.

Как «Дадата» определяет город по IP

Собирать и обновлять все IP-адреса страны с привязкой к городам — колоссальная задача. Ее потянут разве что гиганты вроде «Яндекса». Поэтому на старте мы взяли один из сторонних справочников, где IP сопоставлены населенным пунктам.

Подобные базы данных собирают и продают специальные провайдеры. Иногда отдают по бесплатным лицензиям. Провайдеров немало, навскидку назову около десятка. Делая «Дадату», мы вложили в тестирование справочников много сил.

В свое время проверили справочники IPGeoBaseSypexGEOMaxMind Liteip2ruscity2ip.ru и другие. Тестировали полноту, частоту обновлений, формат данных, детализацию. По итогам выложили на «Хабре» подробный обзор.

Мы выбрали самый точный справочник городов и IP из всех, что удалось найти — IPGeoBase. Но все еще были недовольны ошибками. Поэтому в 2018 году перешли на данные RIPE NCC.

RIPE хорош тем, что эти ребята своими руками назначают IP-адреса интернет-провайдерам. Поэтому дают самый актуальный справочник с указанием, какой диапазон IP кому принадлежит.

Мы очистили данные RIPE от колоссального количества ошибок. Затем подружили с российской адресной системой ФИАС. В итоге «Дадата» не просто отдает привязку IP к городу. Внутри:

  • названия и типы найденных объектов и всех родителей;
  • признаки центра региона;
  • индексы населенных пунктов;
  • ФИАС- и КЛАДР-коды регионов и городов;
  • ISO-коды регионов;
  • и еще множество данных. Весь список — в документации.

«Дадата» полнее и точнее, чем любой «голый» справочник. Во-первых, мы отдаем больше информации. Во-вторых, каждый месяц исправляем ошибки. В-третьих, забираем новые данные у RIPE, не приходится делать это вручную. Наконец, проще получать данные по API, чем писать интерфейс доступа к справочнику.

Казалось бы, проблема решена: RIPE предоставляет идеальный справочник «город по IP», а «Дадата» насыщает его данными. Увы, проблему неправильно найденных городов не решить даже так.

Почему поиск по IP показывает другой город

Поиск города неточен, потому что так устроен сам алгоритм назначения IP-адресов. Технологически IP не привязаны к географии и спокойно гуляют между населенными пунктами. Кроме того, «айпишники» постоянно переезжают от одних региональных подразделений провайдеров к другим.

Например, RIPE назначил диапазон IP провайдеру из Екатеринбурга. А тот по своему усмотрению раздает адреса всем городам Урала. RIPE об этом ничего не узнает.

Об изменениях в географии IP никто не сообщает, поэтому и сервисы, и составители справочников ошибаются. За жизнью не успевают даже те их них, что обновляются раз в неделю.

В любом справочнике хватает ошибок, даже у гигантов. При этом недочеты отличаются, потому что разные сервисы и провайдеры обновляют данные с разной частотой. А еще по-разному пытаются повысить точность поиска. Из-за этого порой кажется, что чужой справочник лучше своего.

Типичный кейс: пользователь видит, что «Дадата» неправильно определяет город для конкретного айпи. А условный справочник 2ip этот же IP трактует как надо.

Пользователь переключается на 2ip, но через неделю обнаруживает, что ситуация не улучшилась. Просто раньше «Город по IP» ошибался с одними адресами, а теперь — с другими. Мы сталкивались с этим неоднократно, в том числе когда сами выбирали справочник для «Дадаты».

На деле, если используешь известный и авторитетный справочник, менять его бессмысленно. Увы, метод «Город по IP» будет порой ошибаться, даже если сменить «Дадату» на любой другой сервис.

Как повысить точность поиска прямо сейчас

Единственный способ точнее определять город — использовать альтернативные методы.

Если речь о мобильном приложении, можно получать координаты с GPS-датчика. Но тогда проблема с точностью, скорее всего, и не возникла бы. Если есть координаты, зачем искать город по IP.

Альтернатива для интернет-сервисов и сайтов — запрашивать координаты браузера с помощью HTML5 Geolocation API. Правда, у метода есть проблема: пользователь должен дать осознанное согласие на передачу координат.

Когда сайт или сервис запрашивает координаты, посетитель видит такое окно

Мы не знаем, станет ли лучше, если вместо IP определять город по координатам браузера. Для стационарных компьютеров этот метод столь же неточен, потому что GPS-датчики и вышки сотовой связи недоступны. Но есть проблемы и посерьезнее:

  • всплывающие окна всех раздражают;
  • люди не любят раскрывать местоположение, когда их прямо об этом спрашивают. Скорее отказываются.

Можно внедрить гибридную модель: для начала запрашивать координаты браузера. А если пользователь отказывает, определять город по IP.

Не пропускайте важные материалы

Подпишитесь в соцсетях

Публикуем ссылку на статью, как только она выходит. А еще даём знать о новых фичах и срочных новостях. Например, напишем, если налоговая потеряет данные по организациям в свежей выгрузке или API «Дадаты» перестанет отвечать.

Подпишитесь на рассылку

Раз в месяц присылаем на почту новые статьи из блога и обновления сервисов «Дадаты». Не тревожим без повода и не шлем спам.