Писал ранее об API ipinfo.io. Сервис позволяет вытащить как гео координаты, так и названия города, региона, страны. Единственный недостаток — информация на английском языке. В данной статье рассмотрим пару примеров использования сервиса.
Обращение к ipinfo.io из PHP
Нас интересует расшифровка ip адреса посетителя, потому адрес запроса должен его содержать в явном виде. Иначе мы получим гео информацию о сервере, где выполняется PHP код.
1 |
$request_url = "http://ipinfo.io/" . $_SERVER['REMOTE_ADDR']; |
Для выполнения запроса используем библиотеку curl.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//geo info из базы ipinfo.io $ch = curl_init($request_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); $json = curl_exec($ch); $info = curl_getinfo($ch); if ($json === false || $info['http_code'] != 200) { //что то пошло не так //возможно ошибка сервера ... if ($info['http_code'] == 429) { //если исчерпана квота, то вы получите код 429 } } else { //смотрим данные, с сервера print_r(json_decode($json)); } |
Пример ответа сервера:
1 2 3 4 5 6 7 8 9 10 |
{ city: "Moscow", country: "RU", hostname: "No Hostname", ip: "195.239.3.10", loc: "55.7522,37.6156", org: "AS3216 PJSC Vimpelcom", postal: "125315", region: "Moscow" } |
Состав атрибутов не всегда полон, названия города может и не быть в их числе. Чаще всего имеем данные о стране и гео-локации.
Поддерживается и ipv6 формат адресов.
Если требуются русские (кириллические) названия и территориальное определение адресов, ограниченных РФ, то возможно вам подойдет другой сервис — IPGeoBase.
IPinfo разрешает выполнить 1000 запросов/сутки бесплатно. Не сложно реализовать кеширование обращений к серверу и/или отсечку ботов, чтобы не тратить квоту зря.
Обращение к ipinfo.io из JS (jQuery)
На сайте ipinfo.io есть множество примеров. Я кое что собрал из них, кое что дополнил, в итоге получилась вот такая рабочая заготовка.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//примитивная отсечка ботов if (!navigator.userAgent.match(/bot|spider/i)) { //для людей jQuery.ajax({ url: 'https://ipinfo.io', success: function(response) { //response-объект содержит ответ сервера console.log(response); }, error: function( jqXHR, textStatus, errorThrown ) { //обработка ошибки ... }, dataType: 'json', }); } else { //для ботов можно заготовить какой то дефолтовый результат, //например считать, что все они из Москвы //а запрос к ipinfo не делать } |
Типичные задачи
В собственных проектах мне бòльшую ценность представляют гео-координаты, чем название города, по ним я уже ищу ближайший объект из базы сайта (филиал, точку продаж и т.п.).
В общем то вы можете перекодировать полученные гео-координаты в ближайший адрес, используя API карт Яндекс или Гугл.