Отримання місцезнаходження з IP-адреси


205

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


Це в значній мірі дублікат stackoverflow.com/questions/348614/… .
Чарлі Мартін

Відповіді:


255

Ви можете завантажити безкоштовну базу даних 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>


1
Ви можете переконатися, що ви додали json в кінці URL-адреси, щоб отримати json назад, а не повну веб-сторінку. $ details = json_decode (file_get_contents (" ipinfo.io {$ ip} / json"));
Дуг

1
@Manatax Це не так, оскільки тоді неможливо було б розібрати відповідь сервера.
Як

3
Не здається дуже надійною послугою. Я отримую nullназву свого міста. Це не схоже на маленьке місто чи щось таке, але все одно не вдалося його знайти. Якщо він не працює добре в США, я сумніваюся, як часто він також поверне нуль за межами США.
Дерек 朕 會 功夫

2
результат не точний .. регіон, місто пошта
Марк Герріл Міранділья

2
ПОПЕРЕДЖЕННЯ: Станом на січень / 2019 рік, деякі люди повідомили, що ця URL-адреса ipinfo небезпечна у вірусному періоді через троян. Голосування проходили між 2015 та 2018
Рікардо

55

Думав, що я публікую повідомлення, як, здається, ніхто не давав інформацію про цей конкретний 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": ""

}

1
Ей, Джеймі FreegeoIp.net не працює. Чи є інший спосіб?
Аді

Вибачте на даний момент, але це ганьба, як це послуга, яку я використовую на своїх живих сайтах. Нехай сподівається, що вони повернуться через деякий час су
Джеймі Хатбер

2
здебільшого вниз і рідко дає будь-який регіон чи місто
Рахул-аман

2
Сервіс Тоні в Azure, здається, працює швидко та надійно: freegeoip2
Густав

1
На жаль, ця служба буде відключена 1 липня 2018 року відповідно до цього повідомлення: "Ця кінцева точка API застаріла і припинить роботу 1 липня 2018 року. Для отримання додаткової інформації відвідайте веб-сайт: github.com/apilayer/freegeoip#readme \
Julio Bailon

20

Чистий приклад 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>

Чи є обмеження, пов'язані з використанням https://geoilocation-db.comapi?
Приянка Шарма

16

Використання 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>

9
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/isissue/detail?id=586
TheFrost

Як щодо якості цієї геолокації IP-адреси Google APIS? (це чи я помиляюся?) порівняно з іншими службами, такими як ipinfo.io ?
Бась

Я попросив ~ 30 людей у ​​різних містах. Якість геолокації IP-адреси Google APIS в Google низька порівняно з ipinfo.io
Basj

1
@Basj Google API працює як шарм, а ipinfo.io показує, що я в США, а фактично перебуваю в центральній Європі
patryk

15

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

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


6
Я використовую hostip.info вже рік і я НЕ вражений. Зазвичай він повертає невідомі чеки 9/10
арон

погодився, його розповідаю, що я живу у Вокінгу ... Справедливо кажучи, це все правильно зрозуміло ... Але я в Лондоні.
Джеймі Хатбер

2
Майте на увазі, що будь-яка послуга буде такою ж доброю, як і загальнодоступна інформація / доступні дані. З причини конфіденційності ця інформація може бути лише "такою хорошою". Якщо це визнає вашу країну правом і, принаймні, закрийте штат / провінцію, я вважаю, що ВІН. Якщо ви користуєтеся цією інформацією для пошуку інформації для атаки DOS, пам’ятайте, що IP-адреси можуть бути навіть недійсними (не призначаються нікому, ні поза дійсним загальнодоступним діапазоном IP).
eselk

На їхньому веб-сайті я отримую "Місцезнаходження: ... насправді у нас немає поняття". Все, що мені потрібно було знати
Bojan Kogoj

15

Я написав бота за допомогою 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);

1
@Eoin видалив його. Схоже, IP-адреса phpfiddle обмежена.
Джаймс

10

Це питання захищене, що я розумію. Однак я не бачу відповіді тут, я бачу, що багато людей показують, що вони придумали, що мають те саме запитання.

В даний час є п'ять регіональних Інтернет-реєстрів з різним ступенем функціональності, які служать першою контактною точкою щодо права власності на ІР. Цей процес протікає в потоці, тому різні служби тут працюють іноді, а не в інший час.

Хто є (очевидно) стародавній протокол TCP, однак, як він працював спочатку, був підключення до порту 43, що робить його проблематичним шляхом його маршрутизацію через орендовані з'єднання, через брандмауери ... тощо.

На даний момент - більшість «Хто робиться» через RESTful HTTP та ARIN, RIPE та APNIC мають RESTful сервіси, які працюють. LACNIC повертає 503, а AfriNIC, мабуть, не має такого API. (Однак усі мають онлайн-сервіси.)

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

Люди не цінують уявлення про те, що їх відслідковують, тому, - мої думки, - отримайте це від свого клієнта безпосередньо та з їх дозволу і очікуйте, що багато чого буде балакати.


8

Подивіться на 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.


1
ун. по порівнянні з іншими службами HostIP є Waaaay від .. www.ip-adress.com однак, нігті це
Скотт Evernden

8

Сервіс у відповіді Бена Даулінга змінився, тому тепер простіше. Щоб знайти місце, просто зробіть:

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

4
Ви праві, що ipinfo.io поверне дані за IP-адресою абонента за замовчуванням. Якщо ви користуєтесь веб-сайтом PHP, це буде IP-адреса вашого сервера, а не IP-адреса користувача. Ось чому вам потрібно передати $ _SERVER ['REMOTE_ADDR']. Якщо ви просто хочете координати, буде швидше додати / loc до URL-адреси, щоб отримати і саме це поле.
Бен Даулінг

Ах, це правда! І я не знав про / loc - це негайно виправлю на своєму сайті.
Ісаак Аскеу

7

Припускаючи, що ви хочете зробити це самостійно, а не покладатися на інших провайдерів, IP2Nation забезпечує базу даних MySQL зі відображеннями, які оновлюються, коли регіональні реєстри змінюють зміни.


Я використовував зовнішній сервіс і раптом мій веб-сайт став дуже повільним. Зовнішня служба потребувала 20 секунд, щоб повернути інформацію - що, очевидно, для відвідувачів катастрофічно. Тому вирішив зробити це сам, і це ідеальне рішення. Дуже дякую.
Williamz902

7

Я запускаю службу на 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 і т.д.

Перегляньте документи для отримання додаткової інформації.


7

Мені подобається безкоштовний GeoLite City від Maxmind, який працює для більшості додатків і з якого ви можете оновити до платної версії, якщо вона недостатньо точна. Тут включений API PHP , як і для інших мов. А якщо ви використовуєте Lighttpd як веб-сервер, ви навіть можете використовувати модуль для отримання інформації в змінній SERVER для кожного відвідувача, якщо це те, що вам потрібно.

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


1
Ви можете розглянути IP2Location LITE lite.ip2location.com, який безкоштовний. У ньому є інформація про поштовий індекс, що дуже корисно.
Майкл Ч.

6

PHP має розширення для цього.

З PHP.net:

Розширення GeoIP дозволяє знайти місцезнаходження IP-адреси. Місто, штат, країна, довгота, широта та інша інформація, як усі, такі як Інтернет-провайдер та тип з'єднання, можна отримати за допомогою GeoIP.

Наприклад:

$record = geoip_record_by_name($ip);
echo $record['city'];

3
Це просто модуль php для бази даних MaxMind, який є платним. (Безкоштовні "легкі" версії вкрай неточні.) Не кажучи, що це погана річ, але вона справді корисна лише для комерційних цілей.
Хтось

6

Ipdata.co - це швидкий, доступний API геолокації IP з надійною продуктивністю.

Це надзвичайно масштабується з 10 кінцевими точками по всьому світу, кожна з яких може обробити> 10000 запитів в секунду!

У цій відповіді використовується тестовий ключ API, який дуже обмежений і призначений лише для тестування кількох викликів. Підпишіться на свій власний Безкоштовний ключ API та отримуйте до 1500 запитів щодня на розвиток.

В 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 геолокації.


5

Якщо хтось натрапить на цю нитку, ось ще одне рішення. На 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.log(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);

    }

});

4

Далі йде модифікована версія фрагмента, який я знайшов, який використовує 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" }

4

Якщо вам потрібно отримати розташування від IP - адреси , який ви можете використовувати надійні послуги гео IP, ви можете отримати більш детальну інформацію тут . Він підтримує IPv6.

Як бонус він дозволяє перевірити, чи є ip адреса tor 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.log(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
}

3

Я створив обгортку для ipinfo.io . Ви можете встановити його за допомогою композитора.

Ви можете використовувати його таким чином:

$ipInfo = new DavidePastore\Ipinfo\Ipinfo();

//Get all the properties
$host = $ipInfo->getFullIpDetails("8.8.8.8");

//Read all the properties
$city = $host->getCity();
$country = $host->getCountry();
$hostname = $host->getHostname();
$ip = $host->getIp();
$loc = $host->getLoc();
$org = $host->getOrg();
$phone = $host->getPhone();
$region = $host->getRegion();

2

Ви також можете скористатися послугою "smart-ip":

$.getJSON("http://smart-ip.net/geoip-json?callback=?",
    function (data) {
        alert(data.countryName);
        alert(data.city);
    }
);

2

Я зробив купу тестування за допомогою служб 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

2

Існує 2 широких підходи до геолокації 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 і сказати, що це найкраще, але я витратив тривалий час на аналіз існуючих рішень, і їх рішення справді перспективне.


-1

Якщо ви шукаєте оновлену / точну базу даних, я рекомендую скористатися цією тут, оскільки вона показувала моє точне місце розташування, яке не було включено до багатьох інших служб під час тестування.
(Моє місто було, Rashtі моя країна була Iranз цією ip адресою: 2.187.21.235коли я тестувала.)

Я рекомендую використовувати базу даних, а не API, оскільки вона буде оброблятися набагато швидше на локальному рівні.


-1

Гаразд, хлопці, дякую за ваші пропозиції; Поки у мене є 6k + IP-адрес, деякі сервіси не виконали мої запити через деякі обмеження; Отже, ви могли використовувати їх усі в резервному режимі;

Якщо у нас є вихідний файл у такому форматі:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

ніж ви могли використовувати цю просту команду expample (PoC) для Yii:

class GeoIPCommand extends CConsoleCommand
{

public function actionIndex($filename = null)
{
    //http://freegeoip.net/json/{$ip} //10k requests per hour
    //http://ipinfo.io/{$ip}/json //1k per day
    //http://ip-api.com/json/{$ip}?fields=country,city,regionName,status //150 per minute

    echo "start".PHP_EOL;

    $handle      = fopen($filename, "r");
    $destination = './good_locations.txt';
    $bad         = './failed_locations.txt';
    $badIP       = [];
    $goodIP      = [];

    $destHandle = fopen($destination, 'a+');
    $badHandle  = fopen($bad, 'a+');

    if ($handle)
    {
        while (($line = fgets($handle)) !== false)
        {
            $result = preg_match('#(\d+)\s+(\d+\.\d+\.\d+\.\d+)#', $line, $id_ip);
            if(!$result) continue;

            $id = $id_ip[1];
            $ip = $id_ip[2];
            $ok = false;

            if(isset($badIP[$ip])) 
            {
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                continue;
            }

            if(isset($goodIP[$ip]))
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]);
                continue;
            }

            $query = @json_decode(file_get_contents('http://freegeoip.net/json/'.$ip));
            $city = property_exists($query, 'region_name')? $query->region_name : '';
            $city .= property_exists($query, 'city') && $query->city && ($query->city != $city) ? ', ' . $query->city : '';

            if($city)
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                $ok = true;
            }

            if(!$ok)
            {
                $query = @json_decode(file_get_contents('http://ip-api.com/json/'. $ip.'?fields=country,city,regionName,status'));
                if($query && $query->status == 'success')
                {
                    $city = property_exists($query, 'regionName')? $query->regionName : '';
                    $city .= property_exists($query, 'city') && $query->city ? ',' . $query->city : '';

                    if($city)
                    {
                        fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                        echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                        $ok = true;
                    }
                }
            }

            if(!$ok)
            {
                $badIP[$ip] = false;
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, 'Unknown');
            }

            if($ok)
            {
                $goodIP[$ip] = $city;
            }
        }

        fclose($handle);
        fclose($badHandle);
        fclose($destHandle);
    }else{
        echo 'Can\'t open file' . PHP_EOL; 
        return;
    }

    return;
}

}

Це якийсь лайно-код, але він працює. використання:

./yiic geoip index --filename="./source_id_ip_list.txt"

Не соромтеся користуватися, змінювати та робити це краще)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.