Получение местоположения с IP-адреса

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
209
0
410 387
20

Ответы 20

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

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

Я пользуюсь hostip.info уже год и НЕ впечатлен. Обычно он возвращает неизвестные 9/10 чеков

aron 30.06.2010 18:32

согласился, это говорит мне, что я живу в Уокинге ... Честно говоря, он получил немного правильного ответа ... Но я в Лондоне.

Jamie Hutber 16.05.2013 18:02

Имейте в виду, что любая услуга будет настолько хороша, насколько доступна общедоступная информация / данные. Из соображений конфиденциальности эта информация может быть только «очень хорошей». Если это правильно для вашей страны и, по крайней мере, близко к штату / провинции, я считаю, что это ПОБЕДА. Если вы используете это для поиска информации об атаке DOS, имейте в виду, что IP-адреса могут быть даже недействительными (не назначены никому или вне допустимого диапазона общедоступных IP-адресов).

eselk 16.04.2014 23:32

На их веб-сайте я получил сообщение «Местоположение: ... на самом деле мы понятия не имеем». Все, что мне нужно было знать

Bojan Kogoj 15.02.2016 17:07

Взгляните на 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 секунд, чтобы отправить информацию, что, очевидно, было катастрофой для посетителей. Вот и решил заняться сам, и это отличное решение. Большое спасибо.

Williamz902 23.11.2018 14:45

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

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

Вы можете рассмотреть IP2Location LITE lite.ip2location.com, который является бесплатным. Он содержит информацию о почтовом индексе, которая очень полезна.

Michael C. 16.11.2014 03:59

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, которая является платной. (Бесплатные "облегченные" версии очень неточны.) Не говорю, что это плохо, но на самом деле это полезно только для коммерческих целей.

Mantriur 19.03.2012 04:33

Используя 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
TheFrost 28.08.2013 04:15

Как насчет качества геолокации IP-адреса Google APIS? (это так, или я ошибаюсь?) по сравнению с другими сервисами типа ipinfo.io?

Basj 24.04.2016 15:43

Я попросил ~ 30 человек в разных городах, и качество геолокации IP Google APIS оставляет желать лучшего по сравнению с ipinfo.io

Basj 25.04.2016 00:10

@Basj Google API работает как шарм, в то время как ipinfo.io показывает, что я нахожусь в США, а на самом деле я нахожусь в центральной Европе

patryk 20.02.2017 23:01

Думал, что опубликую, поскольку никто, похоже, не предоставил информацию об этом конкретном 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 не работает. Есть ли другой способ?

Adi 10.12.2014 11:23

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

Jamie Hutber 10.12.2014 13:43

в основном вниз и редко дает какой-либо регион или город

Rahul aman 03.10.2015 21:45

Служба Тони в Azure работает быстро и надежно: freegeoip2

Gustav 27.06.2016 17:32

Этот код возвращает мне null. Что мне теперь делать?

Chonchol Mahmud 22.10.2016 11:02

Скоро он станет нерекомендуемым

dipak_pusti 11.05.2018 18:00

К сожалению, эта служба будет отключена 1 июля 2018 г. в соответствии со следующим сообщением: «Эта конечная точка API устарела и перестанет работать 1 июля 2018 г. Для получения дополнительной информации посетите: github.com/apilayer/freegeoip#readme \

Julio Bailon 19.05.2018 17:54

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

Doug 21.12.2013 06:57

Вы также получаете JSON без добавления / json, если запрашиваете его из PHP, а не из веб-браузера.

Ben Dowling 21.12.2013 10:44

Не всегда. Я вернул веб-страницу и запустил ее с PHP.

Doug 21.12.2013 18:47

Не похоже на очень надежный сервис. Я получаю null для названия моего города. Это не похоже на маленький город или что-то в этом роде, но он все равно не мог его найти. Если он не работает в США, я сомневаюсь, как часто он также будет возвращать null за пределами США.

Derek 朕會功夫 08.10.2014 03:00

Удалите строку $ ip и вместо этого используйте просто «ipinfo.io». Сервис теперь достаточно интуитивно понятен, чтобы выяснить все остальное, а $ details-> city воспроизводится правильно.

Isaac Askew 12.11.2014 20:41

@BenDowling Согласно вашему примеру и jsfiddle, кажется, что мы можем использовать ipinfo.io без логина / пароля, или я ошибаюсь? Тогда как вы можете проверить, выполнял ли мой веб-сайт более 10'000 ежедневных запросов и требовал ли платный тарифный план?

Basj 24.04.2016 15:46

Да это правильно. Мы применяем ограничение в 1000 (а не 10000) в день на основе ряда различных факторов, включая запрашиваемый IP-адрес и запрашивающий домен. Однако все платные планы идут с токеном доступа.

Ben Dowling 25.04.2016 16:53

результат не точный .. регион, город почта

Mark Gerryl Mirandilla 26.10.2016 03:48

ВНИМАНИЕ! По состоянию на январь 2019 года некоторые люди сообщали, что этот URL-адрес ipinfo на virustotal является небезопасно из-за трояна. Голосование проходило с 2015 по 2018 год.

Ricardo 03.01.2019 03:50

Он был неправильно добавлен с помощью этого изменения github.com/easylist/easylist/commit/… - мы работаем над его удалением. Однако в ipinfo.io нет ничего опасного.

Ben Dowling 08.01.2019 20:40

@BenDowling по какой-то причине ipinfo.io/json вообще не загружается, по истечении 3,5 минут таймаута

Rashmi Kumari 29.10.2020 22:48

Ниже приводится измененная версия найденного мной фрагмента, в котором для получения информации используется 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-адресу, чтобы получить только это поле.

Ben Dowling 16.11.2014 02:58

Я провел кучу тестов со службами 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?

Priyanka Sharma 18.06.2020 11:19

Если кто-то наткнется на эту ветку, вот еще одно решение. В 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 и сказать, что это лучший вариант, но я провел много времени, анализируя существующие решения, и их решение действительно многообещающее.

Другие вопросы по теме