Ottenere la posizione da un indirizzo IP


205

Voglio recuperare informazioni come la città, lo stato e il paese di un visitatore dal loro indirizzo IP, in modo da poter personalizzare la mia pagina Web in base alla loro posizione. Esiste un modo valido e affidabile per farlo in PHP? Sto usando JavaScript per gli script lato client, PHP per gli script lato server e MySQL per il database.


Questo è praticamente un duplicato di stackoverflow.com/questions/348614/… .
Charlie Martin,

Risposte:


255

È possibile scaricare un database GeoIP gratuito e cercare l'indirizzo IP localmente oppure è possibile utilizzare un servizio di terze parti ed eseguire una ricerca remota. Questa è l'opzione più semplice, in quanto non richiede alcuna configurazione, ma introduce ulteriore latenza.

Un servizio di terze parti che potresti utilizzare è il mio, http://ipinfo.io . Forniscono nome host, geolocalizzazione, proprietario della rete e informazioni aggiuntive, ad esempio:

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

Ecco un esempio di PHP:

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

Puoi anche usarlo sul lato client. Ecco un semplice esempio di 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
Puoi assicurarti di aggiungere un json alla fine dell'URL per assicurarti di riaverlo al posto dell'intera pagina web. $ details = json_decode (file_get_contents (" ipinfo.io {$ ip} / json"));
Doug,

1
@Manatax Non lo è, perché sarebbe impossibile analizzare la risposta del server.
Ja͢ck,

3
Non sembra un servizio molto affidabile. Ricevo nullil nome della mia città. Non è come una piccola città o qualcosa del genere, ma non è ancora in grado di individuarlo. Se non funziona bene negli Stati Uniti, dubito di quanto spesso restituirà null al di fuori degli Stati Uniti.
Derek 朕 會 功夫

2
il risultato non è preciso .. regione, città postale
Mark Gerryl Mirandilla,

2
ATTENZIONE: A partire da gennaio 2019, alcune persone hanno riferito che questo URL IPinfo non è sicuro su virustotal, a causa del trojan. I voti sono stati tra il 2015 e il 2018
Ricardo

55

Ho pensato di postare come nessuno sembra aver dato informazioni su questo particolare API, ma il suo ritorno esattamente quello che sto cercando e si può ottenere per tornare in più formati, json, xml and csv.

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

Questo ti darà tutte le cose che potresti desiderare:

{
      "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
Ehi Jamie FreegeoIp.net non funziona. C'è un altro modo?
Adi,

Mi dispiace non al momento, ma è un peccato perché è il servizio che sto usando sui miei siti live. Speriamo che tornino un po 'di tempo
Jamie Hutber il

2
per lo più giù e raramente dà qualsiasi regione o città
Rahul aman

2
Il servizio di Tony in Azure sembra funzionare in modo rapido e affidabile: freegeoip2
Gustav,

1
Sfortunatamente, questo servizio verrà disconnesso dal 1 ° luglio 2018 come da questo messaggio: "Questo endpoint API è obsoleto e smetterà di funzionare il 1 ° luglio 2018. Per ulteriori informazioni, visitare: github.com/apilayer/freegeoip#readme \
Julio Bailon

20

Un puro esempio di Javascript, utilizzando i servizi di https://geolocation-db.com Forniscono una soluzione di callback JSON e JSONP.

Nessun jQuery richiesto!

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

Esistono limiti relativi all'uso di https://geoilocation-db.comapi?
Priyanka Sharma,

16

Utilizzando 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

Che dire della qualità di questa geolocalizzazione IP di Google APIS? (è, o sbaglio?), rispetto ad altri servizi come ipinfo.io ?
Basj,

Ho chiesto a circa 30 persone in diverse città e la qualità della geolocalizzazione IP di Google APIS è scadente rispetto a ipinfo.io
Basj

1
@Basj L'API di Google funziona come un incantesimo mentre ipinfo.io mostra che sono negli Stati Uniti mentre in realtà sono nell'Europa centrale
patryk,

15

Devi utilizzare un servizio esterno ... come http://www.hostip.info/ se si cerca su Google "geo-ip" è possibile ottenere più risultati.

L'API Host-IP è basata su HTTP, quindi puoi usarla in PHP o JavaScript a seconda delle tue esigenze.


6
Uso hostip.info da un anno ormai e NON ne sono impressionato. Di solito tornare sconosciuti 9/10 controlli
Aron

d'accordo, mi sta dicendo che vivo a Woking ... In tutta onestà ha ottenuto il GB giusto ... Ma io sono a Londra.
Jamie Hutber,

2
Tieni presente che qualsiasi servizio sarà buono quanto le informazioni / i dati pubblici disponibili. Per motivi di privacy, queste informazioni possono essere solo "così buone". Se ottiene il tuo paese giusto, e almeno vicino allo stato / provincia, lo considererei una VINCITA. Se ti capita di utilizzarlo per cercare informazioni per un attacco DOS, tieni presente che gli IP potrebbero non essere nemmeno validi (non assegnati a nessuno o al di fuori dell'intervallo IP pubblico valido).
eselk,

Sul loro sito web ottengo "Posizione: ... in realtà non ne abbiamo idea.". Tutto quello che dovevo sapere
Bojan Kogoj,

15

Ho scritto un bot utilizzando un'API da ipapi.co , ecco come ottenere la posizione di un indirizzo IP (ad es. 1.2.3.4) In php:

Imposta intestazione:

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

Ottieni risposta JSON

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

di ottenere un campo specifico (paese, fuso orario ecc.)

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

1
@Eoin Rimosso. Sembra che l'IP di phpfiddle sia limitato.
Jaimes,

10

Questa domanda è protetta, che capisco. Tuttavia, non vedo una risposta qui, quello che vedo è che molte persone mostrano ciò che hanno trovato avendo la stessa domanda.

Esistono attualmente cinque registri Internet regionali con vari gradi di funzionalità che fungono da primo punto di contatto per quanto riguarda la proprietà dell'IP. Il processo è in evoluzione, motivo per cui i vari servizi qui funzionano a volte e non altre volte.

Who Is è (ovviamente) un antico protocollo TCP, tuttavia - il modo in cui funzionava in origine era tramite la connessione alla porta 43, il che rende problematico il suo instradamento attraverso connessioni dedicate, firewall ... ecc.

In questo momento - la maggior parte di Who Is viene eseguita tramite RESTful HTTP e ARIN, RIPE e APNIC hanno servizi RESTful che funzionano. LACNIC's restituisce un 503 e AfriNIC apparentemente non ha tale API. (Tutti hanno servizi online, tuttavia.)

Questo ti porterà - l'indirizzo del proprietario registrato dell'IP, ma - non la posizione del tuo cliente - devi ottenerlo da loro e anche - devi richiederlo. Inoltre, i proxy sono l'ultima delle tue preoccupazioni quando convalidi l'IP che ritieni sia l'originatore.

Le persone non apprezzano l'idea che vengano monitorate, quindi - i miei pensieri sono - ottenerlo direttamente dal tuo cliente e con il suo permesso e si aspettano molto di non pensarci.


8

Guarda l'API da hostip.info: fornisce molte informazioni.
Esempio in 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...

Se ti fidi di hostip.info, sembra essere un'API molto utile.


1
unf. rispetto ad altri servizi, HostIP è già fuori servizio. www.ip-adress.com comunque, inchioda
Scott Evernden

8

Il servizio nella risposta di Ben Dowling è cambiato, quindi ora è più semplice. Per trovare la posizione, fai semplicemente:

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

Le coordinate ritornano in una singola stringa come '31, -80 ', quindi da lì basta:

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

4
Hai ragione sul fatto che ipinfo.io restituirà i dettagli per l'IP del chiamante per impostazione predefinita. Se stai gestendo un sito Web PHP, questo sarà l'IP del tuo server, piuttosto che l'IP dell'utente. Questo è il motivo per cui devi passare $ _SERVER ['REMOTE_ADDR']. Se vuoi solo coordinate, sarà più veloce aggiungere / loc all'URL per ottenere anche quel campo.
Ben Dowling,

Ah, è vero! E non sapevo di / loc - lo aggiusterò immediatamente sul mio sito.
Isaac Askew

7

Supponendo che tu voglia farlo da solo e non fare affidamento su altri provider, IP2Nation fornisce un database MySQL delle mappature che vengono aggiornate quando i registri regionali cambiano le cose.


Stavo usando un servizio esterno e improvvisamente il mio sito web è diventato molto lento. Il servizio esterno impiegava ben 20 secondi per inviare le informazioni, il che è ovviamente disastroso per i visitatori. Così ho deciso di farlo da solo, e questa è una soluzione perfetta. Grazie tante.
Williamz902,

7

Eseguo il servizio su IPLocate.io , a cui puoi collegarti gratuitamente con una semplice chiamata:

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

L' $resoggetto conterrà i vostri campi di geolocalizzazione come country,city e così via

Consulta i documenti per ulteriori informazioni.


7

Mi piace la GeoLite City gratuita di Maxmind che funziona per la maggior parte delle applicazioni e da cui è possibile passare a una versione a pagamento se non è abbastanza preciso. C'è un'API PHP inclusa, così come per altre lingue. E se stai usando Lighttpd come webserver, puoi anche usare un modulo per ottenere le informazioni nella variabile SERVER per ogni visitatore se è quello che ti serve.

Vorrei aggiungere che c'è anche un Geolite Country gratuito (che sarebbe più veloce se non dovessi individuare la città da cui proviene l'IP) e Geolite ASN (se vuoi sapere chi possiede l'IP) e che alla fine tutto ciò è scaricabili sul proprio server, vengono aggiornati ogni mese e sono piuttosto rapidi da cercare con le API fornite in quanto indicano "migliaia di ricerche al secondo".


1
Puoi considerare IP2Location LITE lite.ip2location.com che è gratuito. Ha fino a informazioni sul codice postale che è molto utile.
Michael C.

6

PHP ha un'estensione per questo.

Da PHP.net:

L'estensione GeoIP ti consente di trovare la posizione di un indirizzo IP. Città, Stato, Paese, Longitudine, Latitudine e altre informazioni come tutte, come ISP e tipo di connessione, possono essere ottenute con l'aiuto di GeoIP.

Per esempio:

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

3
Questo è solo un modulo php per il database MaxMind, che è payware. (Le versioni gratuite "lite" sono altamente inaccurate.) Non dire che è una cosa negativa, ma è davvero utile solo per scopi commerciali.
Qualcuno il

6

Ipdata.co è un'API di geolocalizzazione IP veloce e altamente disponibile con prestazioni affidabili.

È estremamente scalabile con 10 endpoint in tutto il mondo, ciascuno in grado di gestire> 10.000 richieste al secondo!

Questa risposta utilizza una chiave API "test" che è molto limitata e pensata solo per testare alcune chiamate. Iscriviti alla tua chiave API gratuita e ricevi fino a 1500 richieste al giorno per lo sviluppo.

Nel 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

Ecco un esempio sul lato client che mostra come ottenere il paese, la regione e la città;

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

Esclusione di responsabilità;

Ho costruito il servizio.

Per esempi in più lingue, consultare Documenti

Vedi anche questa analisi dettagliata delle migliori API di geolocalizzazione IP.


5

Nel caso in cui qualcuno si imbatta in questa discussione, ecco un'altra soluzione. A timezoneapi.io puoi richiedere un indirizzo IP e ottenere diversi oggetti in cambio (ho creato il servizio). È stato creato perché dovevo sapere in quale fuso orario si trovavano i miei utenti, in quale parte del mondo e che ora è attualmente.

In PHP - restituisce posizione, fuso orario e data / ora:

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

}

Utilizzando 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

La seguente è una versione modificata di uno snippet che ho trovato che utilizza http://ipinfodb.com/ip_locator.php per ottenere le sue informazioni. Tieni presente che puoi anche richiedere una chiave API con loro e utilizzare l'API direttamente per ottenere le informazioni fornite come ritieni opportuno.

Frammento

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

Usare

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

Se è necessario ottenere la posizione da un indirizzo IP, è possibile utilizzare un servizio di geo ip affidabile, è possibile ottenere maggiori dettagli qui . Supporta IPv6.

Come bonus consente di verificare se l'indirizzo IP è un nodo tor, proxy pubblico o spammer.

Puoi usare javascript o php come di seguito.

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

Codice php:

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

Produzione:

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

Ho creato un wrapper per ipinfo.io . Puoi installarlo usando il compositore.

Puoi usarlo in questo modo:

$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

Puoi anche usare il servizio "smart-ip":

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

2

Ho fatto un sacco di test con i servizi di indirizzo IP e qui ci sono alcuni modi per farlo da solo. Prima di tutto un sacco di link a siti Web utili che utilizzo:

https://db-ip.com/db Dispone di un servizio di ricerca ip gratuito e di alcuni file CSV gratuiti che è possibile scaricare. Questo utilizza una chiave API gratuita allegata alla tua email. Limita a 2000 query al giorno.

http://ipinfo.io/ Servizio di ricerca ip gratuito senza funzioni PHP api-key:

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

Alla fine ottieni qualcosa del genere:

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/ Leggermente più vecchio, ma questo servizio ti fornisce un sacco di informazioni extra utili come la valuta fuori dal paese, il codice del continente, la longitudine e altro.


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Offre un sacco di file scaricabili con le istruzioni per importarli nel tuo database. Una volta che hai uno di questi file nel tuo database puoi selezionare i dati abbastanza facilmente.

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

Utilizzare la funzione php ip2long (); per trasformare l'indirizzo IP in un valore numerico. Ad esempio 1.1.1.1 diventa 16843009. Ciò consente di cercare gli intervalli ip forniti dal file di database.

Quindi per scoprire dove 1.1.1.1 appartiene a tutto ciò che facciamo è eseguire questa query:

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

Questo restituisce questi dati come esempio.

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

2

Esistono 2 approcci generali per eseguire la geolocalizzazione IP: uno è scaricare un set di dati, ospitarlo sulla propria infrastruttura e mantenerlo aggiornato. Ciò richiede tempo e fatica, soprattutto se è necessario supportare un numero elevato di richieste. Un'altra soluzione è quella di utilizzare un servizio API esistente che gestisce tutto il lavoro per te e altro ancora.

Esistono molti servizi di geolocalizzazione API: Maxmind, Ip2location, Ipstack, IpInfo, ecc. Recentemente, la società per cui lavoro è passata a Ipregistry ( https://ipregistry.co ) e sono stato coinvolto nel processo decisionale e di implementazione. Ecco alcuni elementi da considerare durante la ricerca di un'API di geolocalizzazione IP:

  • Il servizio è accurato? stanno usando un'unica fonte di informazioni?
  • Possono davvero gestire il tuo carico?
  • Forniscono tempi di risposta coerenti e rapidi in tutto il mondo (tranne se i tuoi utenti sono specifici per Paese)?
  • Qual è il loro modello di prezzi?

Ecco un esempio per ottenere informazioni sulla geolocalizzazione IP (ma anche i dati relativi a minacce e agenti utente utilizzando una chiamata):

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

Nota: non sono qui per promuovere Ipregistry e dire che è il migliore, ma ho trascorso molto tempo ad analizzare le soluzioni esistenti e la loro soluzione è davvero promettente.


-1

Se stai cercando un database aggiornato / accurato, ti consiglio di utilizzare questo qui perché mostrava la mia posizione esatta che non era inclusa in molti altri servizi durante il test.
(La mia città era Rashte il mio paese era Irancon questo indirizzo IP: 2.187.21.235quando stavo testando.)

Consiglio di usare il database piuttosto che i metodi API, perché sarà elaborato molto più velocemente localmente.


-1

Ok ragazzi, grazie per i vostri suggerimenti; Mentre ho 6k + di IP, alcuni servizi falliranno le mie richieste a causa di alcune limitazioni; Quindi, potresti usarli tutti in modalità fallback;

Se abbiamo un file sorgente con il seguente formato:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

di quanto potresti usare questo semplice comando expample (PoC) per 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;
}

}

Questo è un tipo di codice di merda, ma funziona. utilizzo:

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

Sentiti libero di usarlo, modificarlo e farlo meglio)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.