Мелкие провайдеры, обычно, действуют в рамках одного или нескольких городов в пределах одного региона. Соответственно, все их IP-адреса будут принадлежать к конкретному региону и, с большой долей вероятности, к определенному городу, в котором и работает провайдер.
Для крупных же провайдеров вполне характерна ситуация, когда пользователи одного региона выходят в сеть через шлюз, расположенный в другом регионе. А у мобильных операторов проблема усугубляется использованием NAT, когда вообще всегда все пользователи федерального округа выходят через единый шлюз. Например, Калининградцы, использующие Мегафон, выходят в Интернет через Санкт-Петербург, точно так же, как и сами Питерцы, и еще куча регионов, да еще и одновременно с одного IP-адреса (по крайней мере, я не заметил распределения IP-адресов из их диапазона по регионам). В данном случае определить регион по IP-адресу просто невозможно.
По моему для них это не проблема. Они наверно даже и не в курсе про наши проблемы. Так как по видимому с этого не зарабатывают.
Я решил эту проблему для себя так. Не показываю гео зависимую выдачу если клиент зашёл через мобильного оператора. Может показаться что я теряю что то но я терял больше когда людям из одного города показывал другой. Чисто потому что оператор выход в интернет с делал в другом городе.
«okato»:"" // ОКАТО код для регионов России, КОАТУУ для Украины и СОАТО для Беларуси
Для каждого варианта будет свое наименование поля? Или будет всегда именоваться okato?
Пока что сходу вижу очевидный недочет — вы не возвращаете диапазон IP провайдера к которому принадлежит запрашиваемый IP, что крайне затрудняет кеширование запросов и существенно увеличивает их число к вашему сервису.
PS Часовой пояс желательно бы для города, а не для страны возвращать. Более практически полезно будет.
Реальная ситуация с распределением IP меняется постоянно, минимум раз в месяц, зачем мне просроченные данные?
Результаты запросов кешируются для уменьшения их числа, но не дольше чем на 30 дней.
Этим и отличаются недобросовестные GeoIP сервисы, что заливают 1 раз базу к себе и бросают в таком состоянии на N лет. Нужен именно поддерживаемый внешний сервис.
Я автоматом поставил скачиваться и парситься базу ipgeobase раз в неделю, благо архив всегда доступен по одному и тому же адресу.
В итоге у меня один-единственный медленный запрос в неделю и вполне актуальные данные.
Как раз ipgeobase последнее время крайне разочаровывает редиректами из-за превышения нагрузки (писал ранее на тостере), а перекачивать регулярно. Да и одного СНГ маловато…
Если вам нужно обрабатывать много адресов, то лучше использовать базу локально. Так как в любом случае ping никуда не денется. И значительно быстрее проверить по локальной базе. API имеет смысл использовать, когда запросы достаточно редкие, ну например, в админке сделать кнопочку посмотреть откуда юзер пришел.
— рейтинг достоверности источника (ведь наверняка данные не из одного источника);
— диапазон IP к которому принадлежит адрес;
— (возможно) владелец диапазона.
Было бы еще хорошо давать возможность делать срезы базы данных. Например, сайт имеет свои страницы для областных центров Уральского ФО, а остальные посетители перенаправляются на страницу по умолчанию. Поэтому, был бы интересен срез по конкретным городам.
Есть проблема с одноименными населенными пунктами, так например адрес 77.106.95.186 принадлежит российскому Северску в Томской области, но определяется как украинский из Донецкой области.
Sypex Geo 2.2 — теперь с GeoNames и ОКАТО