Uzyskiwanie lokalizacji z adresu IP


205

Chcę uzyskać informacje o mieście, stanie i kraju użytkownika z jego adresu IP, aby móc dostosować swoją stronę internetową do jej lokalizacji. Czy jest dobry i niezawodny sposób na zrobienie tego w PHP? Używam JavaScript do skryptów po stronie klienta, PHP do skryptów po stronie serwera i MySQL do bazy danych.


Jest to dość dużo duplikat stackoverflow.com/questions/348614/... .
Charlie Martin

Odpowiedzi:


255

Możesz pobrać bezpłatną bazę danych GeoIP i wyszukać adres IP lokalnie lub możesz skorzystać z usługi innej firmy i przeprowadzić zdalne wyszukiwanie. Jest to prostsza opcja, ponieważ nie wymaga konfiguracji, ale wprowadza dodatkowe opóźnienia.

Jedna usługa strony trzeciej, której możesz użyć, to moja, http://ipinfo.io . Podają nazwę hosta, lokalizację geograficzną, właściciela sieci i dodatkowe informacje, np .:

$ 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
}

Oto przykład PHP:

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"

Możesz także użyć go po stronie klienta. Oto prosty przykład 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
Możesz upewnić się, że dodajesz json na końcu adresu URL, aby mieć pewność, że odzyskasz json zamiast pełnej strony internetowej. $ details = json_decode (file_get_contents („ ipinfo.io {$ ip} / json”));
Doug

1
@Manatax Tak nie jest, ponieważ wtedy niemożliwe byłoby przeanalizowanie odpowiedzi serwera.
Ja͢ck

3
Nie wydaje się to bardzo niezawodną usługą. Dostaję nullnazwę mojego miasta. To nie jest jak małe miasto czy coś takiego, ale nadal nie można go zlokalizować. Jeśli to nie działa dobrze w USA, wątpię, jak często zwróci również wartość zerową poza USA.
Derek 朕 會 功夫

2
wynik nie jest dokładny .. region, miasto pocztowe
Mark Gerryl Mirandilla

2
OSTRZEŻENIE: Według stanu na styczeń 2019 r. Niektóre osoby zgłosiły, że ten adres URL ipinfo jest niebezpieczny dla wirusów z powodu trojana. Głosy odbywały się w latach 2015-2018
Ricardo

55

Pomyślałem, że opublikuję, ponieważ wydaje się, że nikt nie podał informacji o tym konkretnym interfejsie API, ale zwraca dokładnie to, czego szukam i możesz go zwrócić w wielu formatach json, xml and csv.

 $location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
 print_r($location);

To da ci wszystko, czego możesz chcieć:

{
      "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
Hej Jamie FreegeoIp.net nie działa. Czy jest jakiś inny sposób?
Adi

Niestety nie w tej chwili, ale szkoda, bo to usługa, z której korzystam w moich witrynach na żywo. Miejmy nadzieję, że wrócą trochę czasu
Jamie Hutber,

2
głównie w dół i rzadko daje do wiadomości region lub miasto
Rahul aman

2
Usługa Tony'ego na platformie
Gustav

1
Niestety ta usługa zostanie odłączona 1 lipca 2018 r. Zgodnie z tą wiadomością: „Ten punkt końcowy interfejsu API jest przestarzały i przestanie działać 1 lipca 2018 r. Więcej informacji można znaleźć na stronie: github.com/apilayer/freegeoip#readme \
Julio Bailon

20

Przykład czystego Javascript, korzystający z usług https://geolocation-db.com. Zapewniają one rozwiązanie JSON i JSONP-callback.

Nie wymaga 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>

Czy jest jakiś limit związany z korzystaniem z https://geoilocation-db.comAPI?
Priyanka Sharma

16

Za pomocą 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/issues/detail?id=586
TheFrost

Co z jakością tej geolokalizacji Google APIS IP? (jest, czy się mylę?), w porównaniu do innych usług, takich jak ipinfo.io ?
Basj 24.04.16

Poprosiłem ~ 30 osób w różnych miastach, a jakość geolokalizacji IP APIS w Google APIS jest niska w porównaniu do ipinfo.io
Basj 24.04.2016

1
@Basj Google API działa jak urok, podczas gdy ipinfo.io pokazuje, że jestem w USA, a tak naprawdę jestem w Europie Środkowej
patryk

15

Musisz skorzystać z usługi zewnętrznej ... takiej jak http://www.hostip.info/ jeśli wyszukujesz w Google hasło „geo-ip”, możesz uzyskać więcej wyników.

Interfejs API Host-IP oparty jest na protokole HTTP, dzięki czemu można go używać w PHP lub JavaScript, w zależności od potrzeb.


6
Używam hostip.info od roku i NIE jestem pod wrażeniem. Zwykle zwraca nieznane czeki 9/10
aron

Zgadzam się, to mówi mi, że mieszkam w Woking ... Szczerze mówiąc, to trochę poprawiło GB ... Ale jestem w Londynie.
Jamie Hutber

2
Pamiętaj, że każda usługa będzie tak dobra, jak publiczna informacja / dostępne dane. Ze względów prywatności informacje te mogą być „tak dobre”. Jeśli uda Ci się uzyskać właściwy kraj i przynajmniej zbliżyć się do stanu / prowincji, uważam to za WYGRANĄ. Jeśli używasz tego do wyszukiwania informacji o ataku DOS, pamiętaj, że adresy IP mogą nawet nie być prawidłowe (nieprzypisane nikomu ani poza prawidłowym publicznym zakresem adresów IP).
eselk

Na ich stronie internetowej pojawia się komunikat „Lokalizacja: ... właściwie nie mamy pojęcia.” Wszystko, co musiałem wiedzieć
Bojan Kogoj

15

Napisałem bota za pomocą interfejsu API z ipapi.co , oto jak możesz uzyskać lokalizację adresu IP (np. 1.2.3.4) W php:

Ustaw nagłówek:

$opts = array('http'=>array('method'=>"GET", 'header'=>"User-Agent: mybot.v0.7.1"));
$context = stream_context_create($opts);

Uzyskaj odpowiedź JSON

echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);

uzyskać określone pole (kraj, strefa czasowa itp.)

echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);

1
@ Eoin Usunął go. Wygląda na to, że adres IP phpfiddle jest ograniczony.
Jaimes

10

To pytanie jest chronione, co rozumiem. Jednak nie widzę tutaj odpowiedzi, widzę, że wiele osób pokazuje, co wymyślili, mając to samo pytanie.

Obecnie istnieje pięć regionalnych rejestrów internetowych o różnym stopniu funkcjonalności, które służą jako pierwszy punkt kontaktowy w zakresie własności intelektualnej. Proces ten przebiega nieustannie, dlatego różne usługi tutaj działają czasami, a innym razem nie.

Who Is jest (oczywiście) starożytnym protokołem TCP - sposób, w jaki działał pierwotnie, polegał na połączeniu z portem 43, co sprawia, że ​​problematyczne jest kierowanie go przez dzierżawione połączenia, zapory ogniowe ... itp.

W tej chwili - większość Who Is jest wykonywana przez RESTful HTTP, a ARIN, RIPE i APNIC mają działające usługi RESTful. LACNIC zwraca 503 i AfriNIC najwyraźniej nie ma takiego API. (Wszystkie mają jednak usługi online.)

To da ci - adres zarejestrowanego właściciela adresu IP, ale - nie lokalizację twojego klienta - musisz go od nich uzyskać, a także - musisz o to poprosić. Ponadto serwery proxy są najmniejszymi zmartwieniami podczas sprawdzania poprawności adresu IP, który Twoim zdaniem jest źródłem.

Ludzie nie doceniają pojęcia, że ​​są śledzeni, więc - moje myśli - zdobądź je od swojego klienta bezpośrednio i za ich zgodą i oczekuj, że wiele się na tym pomyli.


8

Spójrz na interfejs API z hostip.info - zawiera wiele informacji.
Przykład w 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...

Jeśli ufasz hostip.info, wydaje się, że jest to bardzo przydatny interfejs API.


1
unf. w porównaniu z innymi usługami HostIP jest na zawsze .. www.ip-adress.com jednak, przybija gwoździe
Scott Evernden

8

Usługa w odpowiedzi Bena Dowlinga uległa zmianie, więc teraz jest prostsza. Aby znaleźć lokalizację, po prostu wykonaj:

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

Współrzędne wracają w jednym ciągu, np. „31, -80”, więc stamtąd po prostu:

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude

4
Masz rację, że ipinfo.io domyślnie zwróci szczegóły dotyczące adresu IP dzwoniącego. Jeśli prowadzisz witrynę PHP, która będzie adresem IP twojego serwera, a nie adresem IP użytkownika. Dlatego musisz przekazać $ _SERVER ['REMOTE_ADDR']. Jeśli chcesz tylko współrzędnych, szybciej dodasz / loc do adresu URL, aby uzyskać tylko to pole.
Ben Dowling

Ach, to prawda! I nie wiedziałem o / loc - naprawię to natychmiast na mojej stronie.
Izaak Askew

7

Zakładając, że chcesz to zrobić sam, a nie polegać na innych dostawcach, IP2Nation zapewnia bazę danych MySQL mapowań, które są aktualizowane w miarę zmian w rejestrach regionalnych.


Korzystałem z usługi zewnętrznej i nagle moja strona stała się bardzo wolna. Usługa zewnętrzna zajęła dobre 20 sekund na odesłanie informacji - co oczywiście jest katastrofalne dla odwiedzających. Postanowiłem więc zrobić to sam, a to idealne rozwiązanie. Wielkie dzięki.
Williamz902,

7

Prowadzę usługę na IPLocate.io , do której możesz podłączyć się za darmo jednym prostym połączeniem:

<?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);

$resObiekt będzie zawierać swoje pola geolokalizacji jak country,city itp

Sprawdź dokumenty, aby uzyskać więcej informacji.


7

Podoba mi się bezpłatny GeoLite City od Maxmind, który działa dla większości aplikacji i z którego możesz uaktualnić do wersji płatnej, jeśli nie jest wystarczająco precyzyjna. Zawiera PHP API , a także dla innych języków. A jeśli używasz Lighttpd jako serwera WWW, możesz nawet użyć modułu aby uzyskać informacje w zmiennej SERVER dla każdego użytkownika, jeśli tego potrzebujesz.

Powinienem dodać, że jest też bezpłatny Geolite Country (który byłby szybszy, jeśli nie musisz wskazywać miasta, z którego pochodzi IP) i Geolite ASN (jeśli chcesz wiedzieć, kto jest właścicielem IP) i że w końcu wszystkie są do pobrania na własnym serwerze, są aktualizowane co miesiąc i dość szybko można je wyszukać za pomocą dostarczonych interfejsów API, ponieważ określają „tysiące wyszukiwań na sekundę”.


1
Możesz rozważyć IP2Location LITE lite.ip2location.com, który jest bezpłatny. Zawiera informacje o kodzie pocztowym, co jest bardzo przydatne.
Michael C.

6

PHP ma do tego rozszerzenie.

Z PHP.net:

Rozszerzenie GeoIP pozwala znaleźć lokalizację adresu IP. Miasto, stan, kraj, długość geograficzna, szerokość i inne informacje, takie jak ISP i typ połączenia, można uzyskać za pomocą GeoIP.

Na przykład:

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

3
To tylko moduł php dla bazy danych MaxMind, która jest oprogramowaniem płatnym. (Bezpłatne wersje „lite” są bardzo niedokładne.) Nie mówię, że to zła rzecz, ale naprawdę jest użyteczna tylko do celów komercyjnych.
Ktoś

6

Ipdata.co to szybki, wysoce dostępny interfejs API geolokalizacji IP o niezawodnej wydajności.

Jest niezwykle skalowalny dzięki 10 punktom końcowym na całym świecie, z których każdy jest w stanie obsłużyć> 10 000 żądań na sekundę!

Ta odpowiedź wykorzystuje „testowy” klucz API, który jest bardzo ograniczony i przeznaczony tylko do testowania kilku połączeń. Zarejestruj swój bezpłatny klucz API i codziennie otrzymuj do 1500 wniosków o programowanie.

W 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

Oto przykład po stronie klienta pokazujący, w jaki sposób można uzyskać kraj, region i miasto;

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

Zrzeczenie się;

Zbudowałem usługę.

Przykłady w wielu językach można znaleźć w Dokumentach

Zobacz także szczegółową analizę najlepszych interfejsów API geolokalizacji IP.


5

Jeśli ktoś natknie się na ten wątek, oto inne rozwiązanie. W timezoneapi.io możesz poprosić o adres IP i uzyskać w zamian kilka obiektów (utworzyłem usługę). Został stworzony, ponieważ musiałem wiedzieć, w której strefie czasowej byli moi użytkownicy, gdzie na świecie i która jest obecnie.

W PHP - zwraca lokalizację, strefę czasową oraz datę / godzinę:

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

}

Korzystanie z 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

Poniżej znajduje się zmodyfikowana wersja fragmentu, który znalazłem i który używa http://ipinfodb.com/ip_locator.php w celu uzyskania jego informacji. Pamiętaj, że możesz również ubiegać się o klucz API wraz z nim i używać interfejsu API bezpośrednio, aby uzyskać informacje dostarczane według własnego uznania.

Skrawek

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;
}

Używać

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

Jeśli potrzebujesz uzyskać lokalizację z adresu IP, możesz skorzystać z niezawodnej usługi geo ip, możesz uzyskać więcej informacji tutaj . Obsługuje IPv6.

Jako bonus pozwala sprawdzić, czy adres IP jest węzłem tor, publicznym proxy lub spamerem.

Możesz użyć javascript lub php jak poniżej.

Kod 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);
                 });
        });
    });

Kod php:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);

Wynik:

{
"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

Stworzyłem opakowanie dla ipinfo.io . Możesz zainstalować go za pomocą kompozytora.

Możesz użyć tego w następujący sposób:

$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

Możesz także skorzystać z usługi „smart-ip”:

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

2

Zrobiłem wiele testów z usługami adresów IP i oto kilka sposobów, jak to zrobić sam. Najpierw kilka linków do przydatnych stron, z których korzystam:

https://db-ip.com/db Posiada bezpłatną usługę wyszukiwania ip i kilka darmowych plików csv, które można pobrać. Używa to darmowego klucza API dołączonego do wiadomości e-mail. Ogranicza się do 2000 zapytań dziennie.

http://ipinfo.io/ Bezpłatna usługa wyszukiwania ip bez klawiszy 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
}

W końcu dostajesz coś takiego:

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/ Nieco starszy, ale ta usługa zawiera wiele dodatkowych przydatnych informacji, takich jak waluta poza krajem, kod kontynentu, długość geograficzna i inne.


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Oferuje kilka plików do pobrania z instrukcjami importowania ich do bazy danych. Gdy masz już jeden z tych plików w bazie danych, możesz dość łatwo wybrać dane.

SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to

Użyj funkcji php ip2long (); aby zmienić adres IP na wartość liczbową. Na przykład 1.1.1.1 staje się 16843009. Pozwala to skanować w poszukiwaniu zakresów ip podanych przez plik bazy danych.

Aby dowiedzieć się, gdzie należy do 1.1.1.1, uruchom następujące zapytanie:

SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;

Zwraca to dane jako przykład.

FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809

2

Istnieją 2 szerokie podejścia do geolokalizacji IP: jednym z nich jest pobranie zestawu danych, umieszczenie go w infrastrukturze i utrzymanie go na bieżąco. Wymaga to czasu i wysiłku, zwłaszcza jeśli potrzebujesz obsługi dużej liczby żądań. Innym rozwiązaniem jest użycie istniejącej usługi API, która zarządza całą pracą za Ciebie i nie tylko.

Istnieje wiele usług API Geolokalizacji API: Maxmind, Ip2location, Ipstack, IpInfo itp. Ostatnio firma, dla której pracuję, przeszła na Ipregistry ( https://ipregistry.co ) i byłem zaangażowany w proces podejmowania decyzji i wdrażania. Oto kilka elementów, które należy wziąć pod uwagę, szukając interfejsu API geolokalizacji IP:

  • Czy usługa jest dokładna? czy korzystają z jednego źródła informacji?
  • Czy naprawdę potrafią obsłużyć Twój ładunek?
  • Czy zapewniają spójny i szybki czas reakcji na całym świecie (z wyjątkiem sytuacji, gdy Twoi użytkownicy są zależni od kraju)?
  • Jaki jest ich model wyceny?

Oto przykład uzyskania informacji o geolokalizacji IP (ale także danych dotyczących zagrożeń i agenta użytkownika za pomocą jednego połączenia):

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;

Uwaga: nie jestem tutaj, by promować Ipregistry i twierdzę, że jest najlepszy, ale długo analizowałem istniejące rozwiązania, a ich rozwiązania są naprawdę obiecujące.


-1

Jeśli szukasz zaktualizowanej / dokładnej bazy danych, polecam skorzystać z tej tutaj, ponieważ pokazywała ona moją dokładną lokalizację, która nie była uwzględniona w wielu innych usługach podczas testowania.
(Moje miasto było, Rashta mój kraj był Iranz tym adresem ip: 2.187.21.235kiedy testowałem.)

Zalecam stosowanie baz danych zamiast metod API, ponieważ będą one przetwarzane znacznie szybciej lokalnie.


-1

Okej, dzięki za sugestie; Chociaż mam ponad 6 tys. Adresów IP, niektóre usługi nie spełnią moich żądań z powodu pewnych ograniczeń; Możesz więc użyć ich wszystkich w trybie awaryjnym;

Jeśli mamy plik źródłowy w następującym formacie:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

niż można użyć tego prostego polecenia expample (PoC) dla 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;
}

}

To jest jakiś gówniany kod, ale działa. stosowanie:

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

Używaj, modyfikuj i rób to lepiej)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.