Частенько бывают проекты, в которых необходимо определять город/страну пользователя по его ip. Цель чаще всего одна — повышение конверсии за счет выдачи нужной информации с учетом города посетителя. Это актуально как в магазинах, так и на лендингах. Под катом небольшой список сервисов, которые предоставляют бесплатный API для получения такой инфы или бесплатные базы.
Очень простое API у сервиса http://geoiplookup.net/xml-api/ — кидаем ему ip и получаем инфу в виде xml. Но вся инфа на ангийском, русских названий нет.
https://ipinfodb.com/api — более продвинутое API с возможностью выбора формата получаемых данных, но требуется регистрация. Так же этот сервис предоставляет бесплатную базу, которую можно поставить на свой сервер и работать напрямую с ней. Сервис тоже буржуйский и все на английском.
Ну и напоследок сервис, которым пользуюсь чаще всего — https://sypexgeo.net/ru/api/ . Хорошее API с большим количеством информации, как на русском, так и на английском языках. Бесплатно и без регистрации доступно 10000 запросов в месяц. Так же можно использовать их бинарную базу данных у себя на сервере, это абсолютно бесплатно. Я почти во всех проектах использовал именно базу данных, а не API. Этого чаще всего достаточно, но есть минус — базу нужно периодически обновлять, а в API всегда свежие данные.
Работать с sypexgeo очень удобно, есть свой php класс для работы с базой. Пример работы:
<?php // Пример работы с классом SxGeo v2.2 header('Content-type: text/plain; charset=utf8'); // Подключаем SxGeo.php класс include("SxGeo.php"); // Создаем объект // Первый параметр - имя файла с базой (используется оригинальная бинарная база SxGeo.dat) // Второй параметр - режим работы: // SXGEO_FILE (работа с файлом базы, режим по умолчанию); // SXGEO_BATCH (пакетная обработка, увеличивает скорость при обработке множества IP за раз) // SXGEO_MEMORY (кэширование БД в памяти, еще увеличивает скорость пакетной обработки, но требует больше памяти) $SxGeo = new SxGeo('SxGeoCity.dat'); //$SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY); // Самый производительный режим, если нужно обработать много IP за раз $ip = $_SERVER['REMOTE_ADDR']; var_export($SxGeo->getCityFull($ip)); // Вся информация о городе var_export($SxGeo->get($ip)); // Краткая информация о городе или код страны (если используется база SxGeo Country) var_export($SxGeo->about()); // Информация о базе данных