Получение местоположения с IP-адреса - PullRequest
183 голосов
/ 04 января 2009

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

Ответы [ 24 ]

225 голосов
/ 25 июля 2013

Вы можете загрузить бесплатную базу данных 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");

Client side IP geolocation using ipinfo.io



Full response:

57 голосов
/ 16 мая 2013

Думаю, что я опубликую, так как никто, похоже, не предоставил информацию об этом конкретном 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": ""

}
15 голосов
/ 04 января 2009

Вам нужно использовать внешний сервис ... такой как http://www.hostip.info/, если вы поищете в Google "geo-ip", вы можете получить больше результатов.

API Host-IP основан на HTTP, поэтому вы можете использовать его на PHP или JavaScript в зависимости от ваших потребностей.

15 голосов
/ 23 августа 2012

Использование 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>
14 голосов
/ 22 мая 2016

Я написал бота, используя 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);
13 голосов
/ 13 октября 2016

Чистый пример Javascript, использующий сервисы https://geoip -db.com Они предоставляют решение обратного вызова JSON и JSONP.

JQuery не требуется!

<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geoip-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://geoip-db.com/json/geoip.php?jsonp=callback';
    var h = document.getElementsByTagName('script')[0];
    h.parentNode.insertBefore(script, h);

</script> 
</html>
8 голосов
/ 04 января 2009

Посмотрите на 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.

8 голосов
/ 14 сентября 2016

Этот вопрос защищен, что я понимаю. Тем не менее, я не вижу здесь ответа, я вижу, что многие люди показывают, что они придумали, имея один и тот же вопрос.

В настоящее время существует пять региональных интернет-реестров с различной степенью функциональности, которые служат первым контактным лицом в отношении владения ИС. Этот процесс постоянно меняется, поэтому различные службы здесь работают иногда, а в другое - нет.

Кто есть (очевидно) древний протокол TCP, тем не менее - изначально он работал путем подключения к порту 43, что затрудняет его маршрутизацию через арендованные соединения, через брандмауэры ... и т. Д.

На данный момент - большинство Кто делает это через RESTful HTTP и ARIN, RIPE и APNIC имеют RESTful-сервисы, которые работают. LACNIC возвращает 503, и AfriNIC, по-видимому, не имеет такого API. (Однако у всех есть онлайн-сервисы.)

Это даст вам - адрес зарегистрированного владельца IP, но - не местоположение вашего клиента - вы должны получить его от них, а также - вы должны попросить его. Кроме того, прокси-серверы - это наименьшее беспокойство при проверке IP-адреса, который, по вашему мнению, является отправителем.

Люди не ценят идею о том, что их отслеживают, поэтому, по моим мыслям, получите это от вашего клиента напрямую и с их разрешения и ожидайте, что многое будет противоречить этому понятию.

7 голосов
/ 04 января 2009

Я сделаю тот же ответ, что и я здесь , так как сервис также доступен для PHP:

Мне нравится бесплатный GeoLite City от Maxmind, который работает для большинства приложения и из которых вы можете обновить до платной версии, если это не достаточно точно. Есть PHP API включен, как и для других языки. И если вы бежите Lighttpd в качестве веб-сервера, вы можете даже используйте модуль , чтобы получить информация в переменной SERVER для каждый посетитель, если это то, что вам нужно.

Я должен добавить, что есть также бесплатный Страна геолита (что было бы быстрее, если вам не нужно точно определять город из которого ис) и геолит ASN (если вы хотите знать, кто владеет IP) и что, наконец, все это загружаются на ваш собственный сервер, являются обновляется каждый месяц и довольно быстрый поиск с помощью предоставленных API как они заявляют "тысячи поисков в секунду ".

6 голосов
/ 12 ноября 2014

Служба в ответе Бена Доулинга изменилась, так что теперь она стала проще. Чтобы найти местоположение, просто выполните:

// 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
...