Писал ранее об 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 карт Яндекс или Гугл.
