Я хочу получить информацию о городе, штате и стране посетителя с его IP-адреса, чтобы я мог настроить свою веб-страницу в соответствии с их местоположением. Есть ли хороший и надежный способ сделать это в PHP? Я использую JavaScript для сценариев на стороне клиента, PHP для сценариев на стороне сервера и MySQL для базы данных.






Вам необходимо использовать внешнюю службу ... например, http://www.hostip.info/, если вы введете в Google поиск по запросу "geo-ip", вы сможете получить больше результатов.
Host-IP API основан на HTTP, поэтому вы можете использовать его как на PHP, так и на JavaScript, в зависимости от ваших потребностей.
согласился, это говорит мне, что я живу в Уокинге ... Честно говоря, он получил немного правильного ответа ... Но я в Лондоне.
Имейте в виду, что любая услуга будет настолько хороша, насколько доступна общедоступная информация / данные. Из соображений конфиденциальности эта информация может быть только «очень хорошей». Если это правильно для вашей страны и, по крайней мере, близко к штату / провинции, я считаю, что это ПОБЕДА. Если вы используете это для поиска информации об атаке DOS, имейте в виду, что IP-адреса могут быть даже недействительными (не назначены никому или вне допустимого диапазона общедоступных IP-адресов).
На их веб-сайте я получил сообщение «Местоположение: ... на самом деле мы понятия не имеем». Все, что мне нужно было знать
Взгляните на API с hostip.info - там много информации. Пример на PHP:
$data = file_get_contents("http://api.hostip.info/country.php?ip=12.215.42.19");
//$data contains: "US"
$data = file_get_contents("http://api.hostip.info/?ip=12.215.42.19");
//$data contains: XML with country, lat, long, city, etc...
Если вы доверяете hostip.info, это может показаться очень полезным API.
Предполагая, что вы хотите сделать это самостоятельно, а не полагаться на других поставщиков, IP2Nation предоставляет базу данных MySQL сопоставлений, которые обновляются по мере того, как региональные реестры меняют ситуацию.
Я использовал внешний сервис, и внезапно мой сайт стал очень медленным. Внешней службе потребовалось добрых 20 секунд, чтобы отправить информацию, что, очевидно, было катастрофой для посетителей. Вот и решил заняться сам, и это отличное решение. Большое спасибо.
Мне нравится бесплатный GeoLite City от Maxmind, который работает для большинства приложения, с которых вы можете перейти на платную версию, если она недостаточно точна. Есть PHP API, как и для других языков. И если вы запускаете Lighttpd в качестве веб-сервера, вы даже можете использовать модуль для получения информации в переменной SERVER для каждого посетителя, если это то, что вам нужно.
Я должен добавить, что есть также бесплатный Страна геолитов (который будет быстрее, если вам не нужно точно определять город, из которого принадлежит IP) и Geolite ASN (если вы хотите знать, кому принадлежит IP), и что, наконец, все они доступны для загрузки на вашем собственном сервере, обновляются каждый месяц и довольно быстро просматриваются с помощью предоставленных API, поскольку они заявляют «тысячи запросов в секунду».
Вы можете рассмотреть IP2Location LITE lite.ip2location.com, который является бесплатным. Он содержит информацию о почтовом индексе, которая очень полезна.
PHP имеет расширение для этого.
Из PHP.net:
The GeoIP extension allows you to find the location of an IP address. City, State, Country, Longitude, Latitude, and other information as all, such as ISP and connection type can be obtained with the help of GeoIP.
Например:
$record = geoip_record_by_name($ip);
echo $record['city'];
Это просто php-модуль для базы данных MaxMind, которая является платной. (Бесплатные "облегченные" версии очень неточны.) Не говорю, что это плохо, но на самом деле это полезно только для коммерческих целей.
Используя Google APIS:
<script type = "text/javascript" src = "http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>
The geolocation functionality in the Loader hasn't been retired, per se. We stopped documenting it several years ago and have recommended the HTML-based solutions due to their improved accuracy, but the functionality itself has not been removed from the Loader at this time.code.google.com/p/google-ajax-apis/issues/detail?id=586Как насчет качества геолокации IP-адреса Google APIS? (это так, или я ошибаюсь?) по сравнению с другими сервисами типа ipinfo.io?
Я попросил ~ 30 человек в разных городах, и качество геолокации IP Google APIS оставляет желать лучшего по сравнению с ipinfo.io
@Basj Google API работает как шарм, в то время как ipinfo.io показывает, что я нахожусь в США, а на самом деле я нахожусь в центральной Европе
Думал, что опубликую, поскольку никто, похоже, не предоставил информацию об этом конкретном API, но он возвращает именно то, что мне нужно, и вы можете вернуть его в нескольких форматах, json, xml and csv.
$location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
print_r($location);
Это даст вам все, что вы могли бы пожелать:
{
"ip": "77.99.179.98",
"country_code": "GB",
"country_name": "United Kingdom",
"region_code": "H9",
"region_name": "London, City of",
"city": "London",
"zipcode": "",
"latitude": 51.5142,
"longitude": -0.0931,
"metro_code": "",
"areacode": ""
}
Привет, Джейми. FreegeoIp.net не работает. Есть ли другой способ?
Извините, на данный момент нет, но жаль, что я использую эту услугу на своих действующих сайтах. Будем надеяться, что они вернутся когда-нибудь так
в основном вниз и редко дает какой-либо регион или город
Служба Тони в Azure работает быстро и надежно: freegeoip2
Этот код возвращает мне null. Что мне теперь делать?
Скоро он станет нерекомендуемым
К сожалению, эта служба будет отключена 1 июля 2018 г. в соответствии со следующим сообщением: «Эта конечная точка API устарела и перестанет работать 1 июля 2018 г. Для получения дополнительной информации посетите: github.com/apilayer/freegeoip#readme \
Вы можете загрузить бесплатную базу данных GeoIP и найти IP-адрес локально, или вы можете использовать стороннюю службу и выполнить удаленный поиск. Это более простой вариант, поскольку он не требует настройки, но вносит дополнительную задержку.
Вы можете использовать один сторонний сервис, http://ipinfo.io. Они предоставляют имя хоста, геолокацию, владельца сети и дополнительную информацию, например:
$ curl ipinfo.io/8.8.8.8
{
"ip": "8.8.8.8",
"hostname": "google-public-dns-a.google.com",
"loc": "37.385999999999996,-122.0838",
"org": "AS15169 Google Inc.",
"city": "Mountain View",
"region": "CA",
"country": "US",
"phone": 650
}
Вот пример PHP:
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"
Вы также можете использовать его на стороне клиента. Вот простой пример jQuery:
$.get("https://ipinfo.io/json", function (response) {
$("#ip").html("IP: " + response.ip);
$("#address").html("Location: " + response.city + ", " + response.region);
$("#details").html(JSON.stringify(response, null, 4));
}, "jsonp");<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Client side IP geolocation using <a href = "http://ipinfo.io">ipinfo.io</a></h3>
<hr/>
<div id = "ip"></div>
<div id = "address"></div>
<hr/>Full response: <pre id = "details"></pre>Вы можете убедиться, что добавили json в конце URL-адреса, чтобы получить обратно json вместо полной веб-страницы. $ details = json_decode (file_get_contents ("ipinfo.io {$ ip} / json"));
Вы также получаете JSON без добавления / json, если запрашиваете его из PHP, а не из веб-браузера.
Не всегда. Я вернул веб-страницу и запустил ее с PHP.
Не похоже на очень надежный сервис. Я получаю null для названия моего города. Это не похоже на маленький город или что-то в этом роде, но он все равно не мог его найти. Если он не работает в США, я сомневаюсь, как часто он также будет возвращать null за пределами США.
Удалите строку $ ip и вместо этого используйте просто «ipinfo.io». Сервис теперь достаточно интуитивно понятен, чтобы выяснить все остальное, а $ details-> city воспроизводится правильно.
@BenDowling Согласно вашему примеру и jsfiddle, кажется, что мы можем использовать ipinfo.io без логина / пароля, или я ошибаюсь? Тогда как вы можете проверить, выполнял ли мой веб-сайт более 10'000 ежедневных запросов и требовал ли платный тарифный план?
Да это правильно. Мы применяем ограничение в 1000 (а не 10000) в день на основе ряда различных факторов, включая запрашиваемый IP-адрес и запрашивающий домен. Однако все платные планы идут с токеном доступа.
результат не точный .. регион, город почта
ВНИМАНИЕ! По состоянию на январь 2019 года некоторые люди сообщали, что этот URL-адрес ipinfo на virustotal является небезопасно из-за трояна. Голосование проходило с 2015 по 2018 год.
Он был неправильно добавлен с помощью этого изменения github.com/easylist/easylist/commit/… - мы работаем над его удалением. Однако в ipinfo.io нет ничего опасного.
@BenDowling по какой-то причине ipinfo.io/json вообще не загружается, по истечении 3,5 минут таймаута
Ниже приводится измененная версия найденного мной фрагмента, в котором для получения информации используется http://ipinfodb.com/ip_locator.php. Имейте в виду, что вы также можете подать заявку на получение ключа API с ними и использовать API напрямую, чтобы получить информацию, предоставленную по вашему усмотрению.
function detect_location($ip=NULL, $asArray=FALSE) {
if (empty($ip)) {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
else { $ip = $_SERVER['REMOTE_ADDR']; }
}
elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
$ip = '8.8.8.8';
}
$url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
$i = 0; $content; $curl_info;
while (empty($content) && $i < 5) {
$ch = curl_init();
$curl_opt = array(
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_TIMEOUT => 1,
CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
);
if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
curl_setopt_array($ch, $curl_opt);
$content = curl_exec($ch);
if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
curl_close($ch);
}
$araResp = array();
if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);
$strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';
return $asArray ? $araResp : $strResp;
}
detect_location();
// returns "CITY, STATE" based on user IP
detect_location('xxx.xxx.xxx.xxx');
// returns "CITY, STATE" based on IP you provide
detect_location(NULL, TRUE); // based on user IP
// returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }
detect_location('xxx.xxx.xxx.xxx', TRUE); // based on IP you provide
// returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }
Также вы можете воспользоваться услугой «smart-ip»:
$.getJSON("http://smart-ip.net/geoip-json?callback=?",
function (data) {
alert(data.countryName);
alert(data.city);
}
);
Служба в ответе Бена Доулинга изменилась, поэтому теперь она проще. Чтобы найти место, просто выполните:
// no need to pass ip any longer; ipinfo grabs the ip of the person requesting
$details = json_decode(file_get_contents("http://ipinfo.io/"));
echo $details->city; // city
Координаты возвращаются в виде одной строки, например '31, -80 ', поэтому оттуда вы просто:
$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude
Вы правы в том, что ipinfo.io по умолчанию возвращает данные об IP-адресе вызывающего абонента. Если вы используете веб-сайт PHP, это будет IP-адрес вашего сервера, а не IP-адрес пользователя. Вот почему вам нужно передать $ _SERVER ['REMOTE_ADDR']. Если вам просто нужны координаты, будет быстрее добавить / loc к URL-адресу, чтобы получить только это поле.
Я провел кучу тестов со службами IP-адресов, и вот несколько способов сделать это сам. Во-первых, несколько ссылок на полезные сайты, которые я использую:
https://db-ip.com/db Имеет бесплатную службу поиска IP и несколько бесплатных файлов csv, которые вы можете скачать. Для этого используется бесплатный ключ API, который прикреплен к вашему электронному письму. Он ограничен 2000 запросами в день.
http://ipinfo.io/ Бесплатная служба поиска по ip без api-ключа Функции PHP:
//uses http://ipinfo.io/.
function ip_visitor_country($ip){
$ip_data_in = get_web_page("http://ipinfo.io/".$ip."/json"); //add the ip to the url and retrieve the json data
$ip_data = json_decode($ip_data_in['content'],true); //json_decode it for php use
//this ip-lookup service returns 404 if the ip is invalid/not found so return false if this is the case.
if (empty($ip_data) || $ip_data_in['httpcode'] == 404){
return false;
}else{
return $ip_data;
}
}
function get_web_page($url){
$user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';
$options = array(
CURLOPT_CUSTOMREQUEST =>"GET", //set request type post or get
CURLOPT_POST =>false, //set to GET
CURLOPT_USERAGENT => $user_agent, //set user agent
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
$httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
curl_close( $ch );
$header['errno'] = $err; //curl error code
$header['errmsg'] = $errmsg; //curl error message
$header['content'] = $content; //the webpage result (In this case the ip data in json array form)
$header['httpcode'] = $httpCode; //the webpage response code
return $header; //return the collected data and response codes
}
В итоге вы получите что-то вроде этого:
Array
(
[ip] => 1.1.1.1
[hostname] => No Hostname
[city] =>
[country] => AU
[loc] => -27.0000,133.0000
[org] => AS15169 Google Inc.
)
http://www.geoplugin.com/ Немного старше, но этот сервис дает вам кучу дополнительной полезной информации, такой как валюта страны, код континента, долгота и многое другое.
http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Предлагает кучу загружаемых файлов с инструкциями по их импорту в вашу базу данных. Если у вас есть один из этих файлов в вашей базе данных, вы можете довольно легко выбрать данные.
SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to
Используйте функцию php ip2long (); чтобы превратить ip-адрес в числовое значение. Например, 1.1.1.1 становится 16843009. Это позволяет сканировать диапазоны IP, предоставленные вам файлом базы данных.
Итак, чтобы узнать, где 1.1.1.1 принадлежит всему, что мы делаем, запустим этот запрос:
SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;
Это возвращает эти данные в качестве примера.
FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809
Я написал бота, используя API из ipapi.co, вот как вы можете получить местоположение для IP-адреса (например, 1.2.3.4) в php:
Установить заголовок:
$opts = array('http'=>array('method'=>"GET", 'header'=>"User-Agent: mybot.v0.7.1"));
$context = stream_context_create($opts);
Получить ответ в формате JSON
echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);
для получения определенного поля (страна, часовой пояс и т. д.)
echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);
Я понимаю, что этот вопрос защищен. Однако я не вижу здесь ответа, я вижу, что многие люди показывают, к чему они пришли, задав один и тот же вопрос.
В настоящее время существует пять региональных интернет-реестров с разной степенью функциональности, которые служат в качестве первого контактного лица в отношении владения ИС. Процесс находится в постоянном движении, поэтому различные службы здесь иногда работают, а иногда - нет.
Однако Who Is (очевидно) является древним протоколом TCP - изначально он работал при подключении к порту 43, что затрудняет его маршрутизацию через арендованные соединения, через брандмауэры и т. д.
На данный момент большая часть Who Is выполняется через RESTful HTTP, а ARIN, RIPE и APNIC имеют работающие службы RESTful. LACNIC возвращает 503, а AfriNIC, по-видимому, не имеет такого API. (Однако у всех есть онлайн-сервисы.)
Это даст вам - адрес зарегистрированного владельца IP, но - не местонахождение вашего клиента - вы должны получить это от них, а также - вы должны попросить об этом. Кроме того, прокси - это наименьшая из ваших проблем при проверке IP-адреса, который, по вашему мнению, является отправителем.
Людям не нравится мысль о том, что за ними следят, поэтому - я думаю - получите это напрямую от своего клиента и с его разрешения и ожидайте, что многие будут сопротивляться этому мнению.
Пример чистого Javascript с использованием служб https://geolocation-db.com. Они предоставляют решение для обратного вызова JSON и JSONP.
Не требуется jQuery!
<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geolocation-db.com</title>
</head>
<body>
<div>Country: <span id = "country"></span></div>
<div>State: <span id = "state"></span></div>
<div>City: <span id = "city"></span></div>
<div>Postal: <span id = "postal"></span></div>
<div>Latitude: <span id = "latitude"></span></div>
<div>Longitude: <span id = "longitude"></span></div>
<div>IP address: <span id = "ipv4"></span></div>
</body>
<script>
var country = document.getElementById('country');
var state = document.getElementById('state');
var city = document.getElementById('city');
var postal = document.getElementById('postal');
var latitude = document.getElementById('latitude');
var longitude = document.getElementById('longitude');
var ip = document.getElementById('ipv4');
function callback(data)
{
country.innerHTML = data.country_name;
state.innerHTML = data.state;
city.innerHTML = data.city;
postal.innerHTML = data.postal;
latitude.innerHTML = data.latitude;
longitude.innerHTML = data.longitude;
ip.innerHTML = data.IPv4;
}
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://geoilocation-db.com/json/geoip.php?jsonp=callback';
var h = document.getElementsByTagName('script')[0];
h.parentNode.insertBefore(script, h);
</script>
</html>
Есть ли какие-либо ограничения на использование API https://geoilocation-db.com?
Если кто-то наткнется на эту ветку, вот еще одно решение. В timezoneapi.io вы можете запросить IP-адрес и получить взамен несколько объектов (я создал эту службу). Он был создан, потому что мне нужно было знать, в каком часовом поясе находятся мои пользователи, где в мире и какое время сейчас.
В PHP - возвращает местоположение, часовой пояс и дату / время:
// Get IP address
$ip_address = getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_X_FORWARDED') ?: getenv('HTTP_FORWARDED_FOR') ?: getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR');
// Get JSON object
$jsondata = file_get_contents("http://timezoneapi.io/api/ip/?" . $ip_address);
// Decode
$data = json_decode($jsondata, true);
// Request OK?
if ($data['meta']['code'] == '200'){
// Example: Get the city parameter
echo "City: " . $data['data']['city'] . "<br>";
// Example: Get the users time
echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";
}
Используя jQuery:
// Get JSON object
$.getJSON('https://timezoneapi.io/api/ip', function(data){
// Request OK?
if (data.meta.code == '200'){
// Log
console.info(data);
// Example: Get the city parameter
var city = data.data.city;
alert(city);
// Example: Get the users time
var time = data.data.datetime.date_time_txt;
alert(time);
}
});
Если вам нужно получить местоположение с IP-адреса, вы можете использовать надежную службу гео-IP, вы можете получить более подробную информацию здесь. Он поддерживает IPv6.
В качестве бонуса он позволяет проверить, является ли IP-адрес узлом tor, публичным прокси или спамером.
Вы можете использовать javascript или php, как показано ниже.
Код Javascript:
$(document).ready(function () {
$('#btnGetIpDetail').click(function () {
if ($('#txtIP').val() == '') {
alert('IP address is reqired');
return false;
}
$.getJSON("http://ip-api.io/json/" + $('#txtIP').val(),
function (result) {
alert('City Name: ' + result.city)
console.info(result);
});
});
});
Код PHP:
$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);
Выход:
{
"ip": "64.30.228.118",
"country_code": "US",
"country_name": "United States",
"region_code": "FL",
"region_name": "Florida",
"city": "Fort Lauderdale",
"zip_code": "33309",
"time_zone": "America/New_York",
"latitude": 26.1882,
"longitude": -80.1711,
"metro_code": 528,
"suspicious_factors": {
"is_proxy": false,
"is_tor_node": false,
"is_spam": false,
"is_suspicious": false
}
Ipdata.co - это быстрый, высокодоступный API-интерфейс IP-геолокации с надежной производительностью.
Он чрезвычайно масштабируем с 10 конечными точками по всему миру, каждая из которых может обрабатывать> 10 000 запросов в секунду!
This answer uses a 'test' API Key that is very limited and only meant for testing a few calls. Signup for your own Free API Key and get up to 1500 requests daily for development.
В php
php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->latitude;
37.751
Вот пример на стороне клиента, показывающий, как получить страну, регион и город;
$.get("https://api.ipdata.co?api-key=test", function (response) {
$("#response").html(JSON.stringify(response, null, 4));
$("#country").html('Country: ' + response.country_name);
$("#region").html('Region ' + response.region);
$("#city").html('City' + response.city);
}, "jsonp");<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "country"></div>
<div id = "region"></div>
<div id = "city"></div>
<pre id = "response"></pre>Заявление об отказе от ответственности;
Я построил сервис.
Примеры на нескольких языках см. В Документы.
Также см. Подробный анализ это лучших API геолокации IP.
Я запускаю службу по адресу IPLocate.io, и вы можете бесплатно подключиться к ней одним простым вызовом:
<?php
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8');
$res = json_decode($res);
echo $res->country; // United States
echo $res->continent; // North America
echo $res->latitude; // 37.751
echo $res->longitude; // -97.822
var_dump($res);
Объект $res будет содержать ваши поля геолокации, такие как country, city и т. д.
Ознакомьтесь с документы для получения дополнительной информации.
Существует два основных подхода к выполнению геолокации IP: один - загрузить набор данных, разместить его в своей инфраструктуре и поддерживать его в актуальном состоянии. Это требует времени и усилий, особенно если вам нужно поддерживать большое количество запросов. Другое решение - использовать существующую службу API, которая управляет всей работой за вас и не только.
Существует множество служб геолокации API: Maxmind, Ip2location, Ipstack, IpInfo и т. д. Недавно компания, в которой я работаю, перешла на Ipregistry (https://ipregistry.co), и я принимал участие в процессе принятия решения и реализации. Вот некоторые элементы, которые следует учитывать при поиске API геолокации IP:
Вот пример получения информации о геолокации IP (а также данных об угрозах и пользовательских агентах с помощью одного вызова):
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;
Примечание: я здесь не для того, чтобы продвигать Ipregistry и сказать, что это лучший вариант, но я провел много времени, анализируя существующие решения, и их решение действительно многообещающее.
Я пользуюсь hostip.info уже год и НЕ впечатлен. Обычно он возвращает неизвестные 9/10 чеков