Ottenere i visitatori dal proprio IP


220

Voglio ottenere il Paese dei visitatori tramite il loro IP ... In questo momento sto usando questo ( http://api.hostip.info/country.php?ip= ......)

Ecco il mio codice:

<?php

if (isset($_SERVER['HTTP_CLIENT_IP']))
{
    $real_ip_adress = $_SERVER['HTTP_CLIENT_IP'];
}

if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
    $real_ip_adress = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
    $real_ip_adress = $_SERVER['REMOTE_ADDR'];
}

$cip = $real_ip_adress;
$iptolocation = 'http://api.hostip.info/country.php?ip=' . $cip;
$creatorlocation = file_get_contents($iptolocation);

?>

Bene, funziona correttamente, ma il fatto è che questo restituisce il codice paese come US o CA., e non l'intero nome di paese come Stati Uniti o Canada.

Quindi, c'è qualche buona alternativa a hostip.info offre questo?

So che posso semplicemente scrivere un codice che alla fine trasformerà queste due lettere in nome di tutto il paese, ma sono troppo pigro per scrivere un codice che contiene tutti i paesi ...

PS: Per qualche motivo non voglio usare alcun file CSV già pronto o alcun codice che catturi queste informazioni per me, qualcosa come il codice pronto IP2 e Country CSV.


20
Non essere pigro, non ci sono molti paesi e non è troppo difficile ottenere una tabella di traduzione per i codici di lettere FIPS 2 ai nomi dei paesi.
Chris Henry,

Usa la funzione di geoip di Maxmind. Includerà il nome del paese nei risultati. maxmind.com/app/php
Tchoupi,

Il tuo primo incarico a $real_ip_addressviene sempre ignorato. Ad ogni modo, ricorda che l' X-Forwarded-Forintestazione HTTP può essere estremamente facilmente contraffatta e che esistono proxy come www.hidemyass.com
Walter Tross,

5
IPLocate.io fornisce un'API gratuita: https://www.iplocate.io/api/lookup/8.8.8.8- Dichiarazione di non responsabilità: eseguo questo servizio.
ttarik,

Suggerisco di provare Ipregistry : api.ipregistry.co/… (dichiarazione di non responsabilità: eseguo il servizio).
Laurent,

Risposte:


495

Prova questa semplice funzione PHP.

<?php

function ip_info($ip = NULL, $purpose = "location", $deep_detect = TRUE) {
    $output = NULL;
    if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) {
        $ip = $_SERVER["REMOTE_ADDR"];
        if ($deep_detect) {
            if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_CLIENT_IP'];
        }
    }
    $purpose    = str_replace(array("name", "\n", "\t", " ", "-", "_"), NULL, strtolower(trim($purpose)));
    $support    = array("country", "countrycode", "state", "region", "city", "location", "address");
    $continents = array(
        "AF" => "Africa",
        "AN" => "Antarctica",
        "AS" => "Asia",
        "EU" => "Europe",
        "OC" => "Australia (Oceania)",
        "NA" => "North America",
        "SA" => "South America"
    );
    if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
        $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
            switch ($purpose) {
                case "location":
                    $output = array(
                        "city"           => @$ipdat->geoplugin_city,
                        "state"          => @$ipdat->geoplugin_regionName,
                        "country"        => @$ipdat->geoplugin_countryName,
                        "country_code"   => @$ipdat->geoplugin_countryCode,
                        "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
                        "continent_code" => @$ipdat->geoplugin_continentCode
                    );
                    break;
                case "address":
                    $address = array($ipdat->geoplugin_countryName);
                    if (@strlen($ipdat->geoplugin_regionName) >= 1)
                        $address[] = $ipdat->geoplugin_regionName;
                    if (@strlen($ipdat->geoplugin_city) >= 1)
                        $address[] = $ipdat->geoplugin_city;
                    $output = implode(", ", array_reverse($address));
                    break;
                case "city":
                    $output = @$ipdat->geoplugin_city;
                    break;
                case "state":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "region":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "country":
                    $output = @$ipdat->geoplugin_countryName;
                    break;
                case "countrycode":
                    $output = @$ipdat->geoplugin_countryCode;
                    break;
            }
        }
    }
    return $output;
}

?>

Come usare:

Esempio 1: ottenere i dettagli dell'indirizzo IP del visitatore

<?php

echo ip_info("Visitor", "Country"); // India
echo ip_info("Visitor", "Country Code"); // IN
echo ip_info("Visitor", "State"); // Andhra Pradesh
echo ip_info("Visitor", "City"); // Proddatur
echo ip_info("Visitor", "Address"); // Proddatur, Andhra Pradesh, India

print_r(ip_info("Visitor", "Location")); // Array ( [city] => Proddatur [state] => Andhra Pradesh [country] => India [country_code] => IN [continent] => Asia [continent_code] => AS )

?>

Esempio 2: ottenere i dettagli di qualsiasi indirizzo IP. [Supporto IPV4 e IPV6]

<?php

echo ip_info("173.252.110.27", "Country"); // United States
echo ip_info("173.252.110.27", "Country Code"); // US
echo ip_info("173.252.110.27", "State"); // California
echo ip_info("173.252.110.27", "City"); // Menlo Park
echo ip_info("173.252.110.27", "Address"); // Menlo Park, California, United States

print_r(ip_info("173.252.110.27", "Location")); // Array ( [city] => Menlo Park [state] => California [country] => United States [country_code] => US [continent] => North America [continent_code] => NA )

?>

1
perché sto diventando sconosciuto ogni volta con ogni ip? , usato lo stesso codice.
echo_Me

1
Ottieni "Sconosciuto" probabilmente perché il tuo server non lo consente file_get_contents(). Controlla il tuo file error_log. Soluzione alternativa: vedere la mia risposta.
Kai Noack,

3
inoltre potrebbe essere perché lo controlli localmente (192.168.1.1 / 127.0.0.1 / 10.0.0.1)
Hontoni

1
Ricorda di memorizzare nella cache i risultati per un periodo definito. Inoltre, come nota, non si dovrebbe mai fare affidamento su un altro sito Web per ottenere dati, il sito Web potrebbe andare inattivo, il servizio potrebbe arrestarsi, ecc. E se si ottiene un numero maggiore di visitatori sul proprio sito Web, questo servizio potrebbe vietarvi.
machineaddict,

1
Continua: questo è un problema durante il test di un sito su localhost. Un modo per risolvere a scopo di test? Utilizza l'IP localhost standard 127.0.0.1
Nick

54

È possibile utilizzare una semplice API da http://www.geoplugin.net/

$xml = simplexml_load_file("http://www.geoplugin.net/xml.gp?ip=".getRealIpAddr());
echo $xml->geoplugin_countryName ;


echo "<pre>";
foreach ($xml as $key => $value)
{
    echo $key , "= " , $value ,  " \n" ;
}
echo "</pre>";

Funzione utilizzata

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

Produzione

United States
geoplugin_city= San Antonio
geoplugin_region= TX
geoplugin_areaCode= 210
geoplugin_dmaCode= 641
geoplugin_countryCode= US
geoplugin_countryName= United States
geoplugin_continentCode= NA
geoplugin_latitude= 29.488899230957
geoplugin_longitude= -98.398696899414
geoplugin_regionCode= TX
geoplugin_regionName= Texas
geoplugin_currencyCode= USD
geoplugin_currencySymbol= $
geoplugin_currencyConverter= 1

Ti fa avere così tante opzioni con cui puoi giocare

Grazie

:)


1
È davvero fantastico. Ma durante i test qui non ci sono valori nei seguenti campi "geoplugin_city, geoplugin_region, geoplugin_regionCode, geoplugin_regionName" .. Qual è il motivo? C'è qualche soluzione? Grazie in anticipo
WebDevRon,

31

Ho provato la risposta di Chandra ma la mia configurazione del server non consente file_get_contents ()

PHP Warning: file_get_contents() URL file-access is disabled in the server configuration

Ho modificato il codice di Chandra in modo che funzioni anche per server come quello usando cURL:

function ip_visitor_country()
{

    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];
    $country  = "Unknown";

    if(filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif(filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.geoplugin.net/json.gp?ip=".$ip);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $ip_data_in = curl_exec($ch); // string
    curl_close($ch);

    $ip_data = json_decode($ip_data_in,true);
    $ip_data = str_replace('&quot;', '"', $ip_data); // for PHP 5.2 see stackoverflow.com/questions/3110487/

    if($ip_data && $ip_data['geoplugin_countryName'] != null) {
        $country = $ip_data['geoplugin_countryName'];
    }

    return 'IP: '.$ip.' # Country: '.$country;
}

echo ip_visitor_country(); // output Coutry name

?>

Spero che aiuti ;-)


2
Secondo i documenti sul loro sito: "Se geoplugin.net stava rispondendo perfettamente, poi si è fermato, allora hai superato il limite di ricerca gratuito di 120 richieste al minuto."
Rick Hellewell

Ha funzionato magnificamente. Grazie!
Najeeb


11

Utilizza MaxMind GeoIP (o GeoIPLite se non sei pronto a pagare).

$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE);
$country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);

@Joyce: ho provato a usare Maxmind API e DB, ma non so perché non funzioni per me, in realtà funziona in generale, ma per esempio quando eseguo questo $ _SERVER ['REMOTE_ADDR']; mi mostra questo ip: 10.48.44.43, ma quando lo uso in geoip_country_code_by_addr ($ gi, $ ip), non restituisce nulla, qualche idea?
mOna,

È un indirizzo IP riservato (indirizzo IP interno dalla rete locale). Prova a eseguire il codice su un server remoto.
Joyce Babu,


10

Dai un'occhiata a php-ip-2-country da code.google. Il database che forniscono viene aggiornato quotidianamente, quindi non è necessario connettersi a un server esterno per verificare se si ospita il proprio server SQL. Quindi usando il codice dovresti solo digitare:

<?php
$ip = $_SERVER['REMOTE_ADDR'];

if(!empty($ip)){
        require('./phpip2country.class.php');

        /**
         * Newest data (SQL) avaliable on project website
         * @link http://code.google.com/p/php-ip-2-country/
         */
        $dbConfigArray = array(
                'host' => 'localhost', //example host name
                'port' => 3306, //3306 -default mysql port number
                'dbName' => 'ip_to_country', //example db name
                'dbUserName' => 'ip_to_country', //example user name
                'dbUserPassword' => 'QrDB9Y8CKMdLDH8Q', //example user password
                'tableName' => 'ip_to_country', //example table name
        );

        $phpIp2Country = new phpIp2Country($ip,$dbConfigArray);
        $country = $phpIp2Country->getInfo(IP_COUNTRY_NAME);
        echo $country;
?>

Codice di esempio (dalla risorsa)

<?
require('phpip2country.class.php');

$dbConfigArray = array(
        'host' => 'localhost', //example host name
        'port' => 3306, //3306 -default mysql port number
        'dbName' => 'ip_to_country', //example db name
        'dbUserName' => 'ip_to_country', //example user name
        'dbUserPassword' => 'QrDB9Y8CKMdLDH8Q', //example user password
        'tableName' => 'ip_to_country', //example table name
);

$phpIp2Country = new phpIp2Country('213.180.138.148',$dbConfigArray);

print_r($phpIp2Country->getInfo(IP_INFO));
?>

Produzione

Array
(
    [IP_FROM] => 3585376256
    [IP_TO] => 3585384447
    [REGISTRY] => RIPE
    [ASSIGNED] => 948758400
    [CTRY] => PL
    [CNTRY] => POL
    [COUNTRY] => POLAND
    [IP_STR] => 213.180.138.148
    [IP_VALUE] => 3585378964
    [IP_FROM_STR] => 127.255.255.255
    [IP_TO_STR] => 127.255.255.255
)

4
dobbiamo fornire le informazioni del database per funzionare? non sembra buono.
echo_Me

10

Possiamo usare geobytes.com per ottenere la posizione utilizzando l'indirizzo IP dell'utente

$user_ip = getIP();
$meta_tags = get_meta_tags('http://www.geobytes.com/IPLocator.htm?GetLocation&template=php3.txt&IPAddress=' . $user_ip);
echo '<pre>';
print_r($meta_tags);

restituirà dati come questo

Array(
    [known] => true
    [locationcode] => USCALANG
    [fips104] => US
    [iso2] => US
    [iso3] => USA
    [ison] => 840
    [internet] => US
    [countryid] => 254
    [country] => United States
    [regionid] => 126
    [region] => California
    [regioncode] => CA
    [adm1code] =>     
    [cityid] => 7275
    [city] => Los Angeles
    [latitude] => 34.0452
    [longitude] => -118.2840
    [timezone] => -08:00
    [certainty] => 53
    [mapbytesremaining] => Free
)

Funzione per ottenere l'IP dell'utente

function getIP(){
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
    $pattern = "/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/";
    if(preg_match($pattern, $_SERVER["HTTP_X_FORWARDED_FOR"])){
            $userIP = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }else{
            $userIP = $_SERVER["REMOTE_ADDR"];
    }
}
else{
  $userIP = $_SERVER["REMOTE_ADDR"];
}
return $userIP;
}

Ho provato il tuo codice, questo mi restituisce: Array ([conosciuto] => falso)
mOna

quando provo questo: $ ip = $ _SERVER ["REMOTE_ADDR"]; echo $ ip; lo restituisce: 10.48.44.43, sai qual è il problema ?? Ho usato alspo maxmind geoip, e quando ho usato di nuovo geoip_country_name_by_addr ($ gi, $ ip) non mi ha restituito nulla ...
mOna,

@mOna, restituisce il tuo indirizzo IP. per maggiori dettagli, condividi il tuo codice.
Ram Sharma,

Ho scoperto che il problema è risolto sul mio IP poiché è per la rete privata. poi ho inserito il mio vero IP in ifconfig e l'ho usato nel mio programma. poi ha funzionato :) Ora, la mia domanda è come ottenere l'ip reale nel caso di quegli utenti simili a me? (se utilizzano IP locale) .. Ho scritto il mio codice qui: stackoverflow.com/questions/25958564/...
Mona

9

Prova questo semplice codice a una riga, otterrai il paese e la città dei visitatori dal loro indirizzo IP remoto.

$tags = get_meta_tags('http://www.geobytes.com/IpLocator.htm?GetLocation&template=php3.txt&IpAddress=' . $_SERVER['REMOTE_ADDR']);
echo $tags['country'];
echo $tags['city'];

9

Puoi usare un servizio web di http://ip-api.com
nel tuo codice php, fai come segue:

<?php
$ip = $_REQUEST['REMOTE_ADDR']; // the IP address to query
$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip));
if($query && $query['status'] == 'success') {
  echo 'Hello visitor from '.$query['country'].', '.$query['city'].'!';
} else {
  echo 'Unable to get location';
}
?>

la query ha molte altre informazioni:

array (
  'status'      => 'success',
  'country'     => 'COUNTRY',
  'countryCode' => 'COUNTRY CODE',
  'region'      => 'REGION CODE',
  'regionName'  => 'REGION NAME',
  'city'        => 'CITY',
  'zip'         => ZIP CODE,
  'lat'         => LATITUDE,
  'lon'         => LONGITUDE,
  'timezone'    => 'TIME ZONE',
  'isp'         => 'ISP NAME',
  'org'         => 'ORGANIZATION NAME',
  'as'          => 'AS NUMBER / NAME',
  'query'       => 'IP ADDRESS USED FOR QUERY',
)

Ho usato ip-api.com perché forniscono anche il nome ISP!
Richard Tinkler,

1
Ho usato perché forniscono anche il fuso orario
Roy Shoa,

8

Esiste una versione di file flat ben mantenuta del database ip-> country gestito dalla comunità Perl di CPAN

L'accesso a questi file non richiede un dataserver e i dati stessi sono all'incirca 515k

Higemaru ha scritto un wrapper PHP per parlare con quei dati: php-ip-country-fast


6

Molti modi diversi per farlo ...

Soluzione n. 1:

Un servizio di terze parti che potresti utilizzare è http://ipinfodb.com . Forniscono nome host, geolocalizzazione e informazioni aggiuntive.

Registrati per una chiave API qui: http://ipinfodb.com/register.php . Ciò ti consentirà di recuperare i risultati dal loro server, senza questo non funzionerà.

Copia e incolla il seguente codice PHP:

$ipaddress = $_SERVER['REMOTE_ADDR'];
$api_key = 'YOUR_API_KEY_HERE';

$data = file_get_contents("http://api.ipinfodb.com/v3/ip-city/?key=$api_key&ip=$ipaddress&format=json");
$data = json_decode($data);
$country = $data['Country'];

Svantaggio:

Citando dal loro sito Web:

La nostra API gratuita utilizza la versione IP2Location Lite che offre una precisione inferiore.

Soluzione n. 2:

Questa funzione restituirà il nome del paese utilizzando il servizio http://www.netip.de/ .

$ipaddress = $_SERVER['REMOTE_ADDR'];
function geoCheckIP($ip)
{
    $response=@file_get_contents('http://www.netip.de/search?query='.$ip);

    $patterns=array();
    $patterns["country"] = '#Country: (.*?)&nbsp;#i';

    $ipInfo=array();

    foreach ($patterns as $key => $pattern)
    {
        $ipInfo[$key] = preg_match($pattern,$response,$value) && !empty($value[1]) ? $value[1] : 'not found';
    }

        return $ipInfo;
}

print_r(geoCheckIP($ipaddress));

Produzione:

Array ( [country] => DE - Germany )  // Full Country Name

3
Citando dal loro sito Web: "Sei limitato a 1.000 richieste API al giorno. Se hai bisogno di fare più richieste o hai bisogno del supporto SSL, consulta i nostri piani a pagamento."
Walter Tross,

L'ho usato sul mio sito web personale ed è per questo che l'ho pubblicato. Grazie per le informazioni ... non me ne sono reso conto. Ho messo molto più impegno sul post, quindi per favore vedi il post aggiornato :)
imbondbaby

@imbondbaby: Ciao, ho provato il tuo codice, ma per me restituisce questo: Array ([country] => -), non capisco il problema da quando provo a stamparlo: $ ipaddress = $ _SERVER ['REMOTE_ADDR' ]; mi mostra questo ip: 10.48.44.43, non riesco a capire perché questo ip non funziona! Voglio dire ovunque inserisco questo numero non restituisce nessun paese !!! puoi aiutarmi?
mOna,

5

Il mio servizio ipdata.co fornisce il nome del paese in 5 lingue! Oltre all'organizzazione, alla valuta, al fuso orario, al codice chiamante, alla bandiera, ai dati del gestore di telefonia mobile, ai dati proxy e ai dati sullo stato del nodo di uscita Tor da qualsiasi indirizzo IPv4 o IPv6.

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.

È inoltre estremamente scalabile con 10 regioni in tutto il mondo ciascuna in grado di gestire> 10.000 richieste al secondo!

Le opzioni includono; Inglese (en), tedesco (de), giapponese (ja), francese (fr) e cinese semplificato (za-CH)

$ip = '74.125.230.195';
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
echo $details->country_name;
//United States
echo $details->city;
//Mountain View
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test/zh-CN"));
echo $details->country_name;
//美国

1
Dio ti benedica, amico! Ho più di quello che ho chiesto! Domanda veloce: posso usarlo per prod? Voglio dire, non lo poserai presto, vero?
Detto il

1
Niente affatto :) In effetti sto aggiungendo più regioni e più polacco. Sono contento che tu l'abbia trovato utile :)
Jonathan il

Molto utile, specialmente con i parametri aggiuntivi, ha risolto più di un problema per me!
Detto il

3
Grazie per il feedback positivo! Ho costruito attorno ai casi d'uso più comuni per un tale strumento, l'obiettivo era quello di eliminare la necessità di eseguire ulteriori elaborazioni dopo la geolocalizzazione, felice di vederlo ripagare per gli utenti
Jonathan,

4

Non sono sicuro che si tratti di un nuovo servizio, ma ora (2016) il modo più semplice in php è utilizzare il servizio web php di geoplugin: http://www.geoplugin.net/php.gp :

Utilizzo di base:

// GET IP ADDRESS
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (!empty($_SERVER['REMOTE_ADDR'])) {
    $ip = $_SERVER['REMOTE_ADDR'];
} else {
    $ip = false;
}

// CALL THE WEBSERVICE
$ip_info = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip));

Offrono anche una classe già pronta: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache


Hai usato un elseafter elseche provoca un errore. Cosa hai cercato di prevenire? REMOTE_ADDR dovrebbe essere sempre disponibile?
AlexioVay

@Vaia - Forse dovrebbe essere ma non lo sai mai.
Billynoah,

C'è un caso in cui non è disponibile conosci?
AlexioVay

2
@Vaia - dai documenti di PHP su $_SERVER: "Non vi è alcuna garanzia che ogni server Web fornirà uno di questi; i server possono ometterne alcuni o fornire altri non elencati qui."
Billynoah,

1
Nota che c'è un limite alle richieste; dal loro sito: "Se geoplugin.net stava rispondendo perfettamente, poi si è fermato, allora hai superato il limite di ricerca gratuito di 120 richieste al minuto."
Rick Hellewell

2

Sto usando ipinfodb.comAPI e ottengo esattamente quello che stai cercando.

È completamente gratuito, devi solo registrarti con loro per ottenere la tua chiave API. Puoi includere la loro classe php scaricando dal loro sito Web oppure puoi utilizzare il formato url per recuperare informazioni.

Ecco cosa sto facendo:

Ho incluso la loro classe php nel mio script e usando il codice seguente:

$ipLite = new ip2location_lite;
$ipLite->setKey('your_api_key');
if(!$_COOKIE["visitorCity"]){ //I am using cookie to store information
  $visitorCity = $ipLite->getCity($_SERVER['REMOTE_ADDR']);
  if ($visitorCity['statusCode'] == 'OK') {
    $data = base64_encode(serialize($visitorCity));
    setcookie("visitorCity", $data, time()+3600*24*7); //set cookie for 1 week
  }
}
$visitorCity = unserialize(base64_decode($_COOKIE["visitorCity"]));
echo $visitorCity['countryName'].' Region'.$visitorCity['regionName'];

Questo è tutto.


2

è possibile utilizzare http://ipinfo.io/ per ottenere i dettagli dell'indirizzo IP È facile da usare.

<?php
    function ip_details($ip)
    {
    $json = file_get_contents("http://ipinfo.io/{$ip}");
    $details = json_decode($json);
    return $details;
    }

    $details = ip_details(YoUR IP ADDRESS); 

    echo $details->city;
    echo "<br>".$details->country; 
    echo "<br>".$details->org; 
    echo "<br>".$details->hostname; /

    ?>

2

Sostituisci 127.0.0.1con visitatori IpAddress.

$country = geoip_country_name_by_name('127.0.0.1');

Le istruzioni di installazione sono qui e leggi questo per sapere come ottenere Città, Stato, Paese, Longitudine, Latitudine, ecc ...


Fornisci un codice più effettivo rispetto ai soli collegamenti reali.
Bram Vanroy,

Notizie successive dal link: "A partire dal 2 gennaio 2019 Maxmind ha interrotto i database GeoLite originali che abbiamo utilizzato in tutti questi esempi. Puoi leggere l'annuncio completo qui: support.maxmind.com/geolite-legacy-discontinuation-notice "
Rick Hellewell,


2

Ho una risposta breve che ho usato in un progetto. Nella mia risposta, ritengo che tu abbia l'indirizzo IP del visitatore.

$ip = "202.142.178.220";
$ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
//get ISO2 country code
if(property_exists($ipdat, 'geoplugin_countryCode')) {
    echo $ipdat->geoplugin_countryCode;
}
//get country full name
if(property_exists($ipdat, 'geoplugin_countryName')) {
    echo $ipdat->geoplugin_countryName;
}

1

So che questo è vecchio, ma ho provato alcune altre soluzioni qui e sembrano essere obsoleti o semplicemente restituiscono null. Quindi è così che l'ho fatto.

L'uso del http://www.geoplugin.net/json.gp?ip=quale non richiede alcun tipo di iscrizione o pagamento per il servizio.

function get_client_ip_server() {
  $ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP']))
  $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
  $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
  $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
  $ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
  $ipaddress = $_SERVER['REMOTE_ADDR'];
else
  $ipaddress = 'UNKNOWN';

  return $ipaddress;
}

$ipaddress = get_client_ip_server();

function getCountry($ip){
    $curlSession = curl_init();
    curl_setopt($curlSession, CURLOPT_URL, 'http://www.geoplugin.net/json.gp?ip='.$ip);
    curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

    $jsonData = json_decode(curl_exec($curlSession));
    curl_close($curlSession);

    return $jsonData->geoplugin_countryCode;
}

echo "County: " .getCountry($ipaddress);

E se vuoi ulteriori informazioni a riguardo, questo è un ritorno completo di Json:

{
  "geoplugin_request":"IP_ADDRESS",
  "geoplugin_status":200,
  "geoplugin_delay":"2ms",
  "geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href='http:\/\/www.maxmind.com'>http:\/\/www.maxmind.com<\/a>.",
  "geoplugin_city":"Current City",
  "geoplugin_region":"Region",
  "geoplugin_regionCode":"Region Code",
  "geoplugin_regionName":"Region Name",
  "geoplugin_areaCode":"",
  "geoplugin_dmaCode":"650",
  "geoplugin_countryCode":"US",
  "geoplugin_countryName":"United States",
  "geoplugin_inEU":0,
  "geoplugin_euVATrate":false,
  "geoplugin_continentCode":"NA",
  "geoplugin_continentName":"North America",
  "geoplugin_latitude":"37.5563",
  "geoplugin_longitude":"-99.9413",
  "geoplugin_locationAccuracyRadius":"5",
  "geoplugin_timezone":"America\/Chicago",
  "geoplugin_currencyCode":"USD",
  "geoplugin_currencySymbol":"$",
  "geoplugin_currencySymbol_UTF8":"$",
  "geoplugin_currencyConverter":1
}

1

Ho scritto un corso basato sulla risposta "Chandra Nakka". Speriamo che possa aiutare le persone a salvare le informazioni da Geoplugin a una sessione in modo che il carico sia molto più veloce quando si richiamano le informazioni. Inoltre, salva i valori su un array privato, quindi il richiamo nello stesso codice è il più veloce possibile.

class Geo {
private $_ip = null;
private $_useSession = true;
private $_sessionNameData = 'GEO_SESSION_DATA';
private $_hasError = false;
private $_geoData = [];

const PURPOSE_SUPPORT = [
    "all", "*", "location",
    "request",
    "latitude", 
    "longitude",
    "accuracy",
    "timezonde",
    "currencycode",
    "currencysymbol",
    "currencysymbolutf8",
    "country", 
    "countrycode", 
    "state", "region", 
    "city", 
    "address",
    "continent", 
    "continentcode"
];
const CONTINENTS = [
    "AF" => "Africa",
    "AN" => "Antarctica",
    "AS" => "Asia",
    "EU" => "Europe",
    "OC" => "Australia (Oceania)",
    "NA" => "North America",
    "SA" => "South America"
];

function __construct($ip = null, $deepDetect = true, $useSession = true)
{
    // define the session useage within this class
    $this->_useSession = $useSession;
    $this->_startSession();

    // define a ip as far as possible
    $this->_ip = $this->_defineIP($ip, $deepDetect);

    // check if the ip was set
    if (!$this->_ip) {
        $this->_hasError = true;
        return $this;
    }

    // define the geoData
    $this->_geoData = $this->_fetchGeoData();

    return $this;
}

function get($purpose)
{
    // making sure its lowercase
    $purpose = strtolower($purpose);

    // makeing sure there are no error and the geodata is not empty
    if ($this->_hasError || !count($this->_geoData) && !in_array($purpose, self::PURPOSE_SUPPORT)) {
        return 'error';
    }

    if (in_array($purpose, ['*', 'all', 'location']))  {
        return $this->_geoData;
    }

    if ($purpose === 'state') $purpose = 'region';

    return (isset($this->_geoData[$purpose]) ? $this->_geoData[$purpose] : 'missing: '.$purpose);
}

private function _fetchGeoData()
{
    // check if geo data was set before
    if (count($this->_geoData)) {
        return $this->_geoData;
    }

    // check possible session
    if ($this->_useSession && ($sessionData = $this->_getSession($this->_sessionNameData))) {
        return $sessionData;
    }

    // making sure we have a valid ip
    if (!$this->_ip || $this->_ip === '127.0.0.1') {
        return [];
    }

    // fetch the information from geoplusing
    $ipdata = @json_decode($this->curl("http://www.geoplugin.net/json.gp?ip=" . $this->_ip));

    // check if the data was fetched
    if (!@strlen(trim($ipdata->geoplugin_countryCode)) === 2) {
        return [];
    }

    // make a address array
    $address = [$ipdata->geoplugin_countryName];
    if (@strlen($ipdata->geoplugin_regionName) >= 1)
        $address[] = $ipdata->geoplugin_regionName;
    if (@strlen($ipdata->geoplugin_city) >= 1)
        $address[] = $ipdata->geoplugin_city;

    // makeing sure the continentCode is upper case
    $continentCode = strtoupper(@$ipdata->geoplugin_continentCode);

    $geoData = [
        'request' => @$ipdata->geoplugin_request,
        'latitude' => @$ipdata->geoplugin_latitude,
        'longitude' => @$ipdata->geoplugin_longitude,
        'accuracy' => @$ipdata->geoplugin_locationAccuracyRadius,
        'timezonde' => @$ipdata->geoplugin_timezone,
        'currencycode' => @$ipdata->geoplugin_currencyCode,
        'currencysymbol' => @$ipdata->geoplugin_currencySymbol,
        'currencysymbolutf8' => @$ipdata->geoplugin_currencySymbol_UTF8,
        'city' => @$ipdata->geoplugin_city,
        'region' => @$ipdata->geoplugin_regionName,
        'country' => @$ipdata->geoplugin_countryName,
        'countrycode' => @$ipdata->geoplugin_countryCode,
        'continent' => self::CONTINENTS[$continentCode],
        'continentcode' => $continentCode,
        'address' => implode(", ", array_reverse($address))
    ];

    if ($this->_useSession) {
        $this->_setSession($this->_sessionNameData, $geoData);
    }

    return $geoData;
}

private function _startSession()
{
    // only start a new session when the status is 'none' and the class
    // requires a session
    if ($this->_useSession && session_status() === PHP_SESSION_NONE) {
        session_start();
    }
}

private function _defineIP($ip, $deepDetect)
{
    // check if the ip was set before
    if ($this->_ip) {
        return $this->_ip;
    }

    // check if the ip given is valid
    if (filter_var($ip, FILTER_VALIDATE_IP)) {
        return $ip;
    }

    // try to get the ip from the REMOTE_ADDR
    $ip = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);

    // check if we need to end the search for a IP if the REMOTE_ADDR did not
    // return a valid and the deepDetect is false
    if (!$deepDetect) {
        return $ip;
    }

    // try to get the ip from HTTP_X_FORWARDED_FOR
    if (($ip = filter_input(INPUT_SERVER, 'HTTP_X_FORWARDED_FOR', FILTER_VALIDATE_IP))) {
        return $ip;
    }

    // try to get the ip from the HTTP_CLIENT_IP
    if (($ip = filter_input(INPUT_SERVER, 'HTTP_CLIENT_IP', FILTER_VALIDATE_IP))) {
        return $ip;
    }

    return $ip;
}

private function _hasSession($key, $filter = FILTER_DEFAULT) 
{
    return (isset($_SESSION[$key]) ? (bool)filter_var($_SESSION[$key], $filter) : false);
}

private function _getSession($key, $filter = FILTER_DEFAULT)
{
    if ($this->_hasSession($key, $filter)) {
        $value = filter_var($_SESSION[$key], $filter);

        if (@json_decode($value)) {
            return json_decode($value, true);
        }

        return filter_var($_SESSION[$key], $filter);
    } else {
        return false;
    }
}

private function _setSession($key, $value) 
{
    if (is_array($value)) {
        $value = json_encode($value);
    }

    $_SESSION[$key] = $value;
}

function emptySession($key) {
    if (!$this->_hasSession($key)) {
        return;
    }

    $_SESSION[$key] = null;
    unset($_SESSION[$key]);

}

function curl($url) 
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}
}

Rispondendo alla domanda "op" con questa classe puoi chiamare

$country = (new \Geo())->get('country'); // United Kingdom

E le altre proprietà disponibili sono:

$geo = new \Geo('185.35.50.4');
var_dump($geo->get('*')); // allias all / location
var_dump($geo->get('country'));
var_dump($geo->get('countrycode'));
var_dump($geo->get('state')); // allias region
var_dump($geo->get('city')); 
var_dump($geo->get('address')); 
var_dump($geo->get('continent')); 
var_dump($geo->get('continentcode'));   
var_dump($geo->get('request'));
var_dump($geo->get('latitude'));
var_dump($geo->get('longitude'));
var_dump($geo->get('accuracy'));
var_dump($geo->get('timezonde'));
var_dump($geo->get('currencyCode'));
var_dump($geo->get('currencySymbol'));
var_dump($geo->get('currencySymbolUTF8'));

ritornando

array(15) {
  ["request"]=>
  string(11) "185.35.50.4"
  ["latitude"]=>
  string(7) "51.4439"
  ["longitude"]=>
  string(7) "-0.1854"
  ["accuracy"]=>
  string(2) "50"
  ["timezonde"]=>
  string(13) "Europe/London"
  ["currencycode"]=>
  string(3) "GBP"
  ["currencysymbol"]=>
  string(2) "£"
  ["currencysymbolutf8"]=>
  string(2) "£"
  ["city"]=>
  string(10) "Wandsworth"
  ["region"]=>
  string(10) "Wandsworth"
  ["country"]=>
  string(14) "United Kingdom"
  ["countrycode"]=>
  string(2) "GB"
  ["continent"]=>
  string(6) "Europe"
  ["continentcode"]=>
  string(2) "EU"
  ["address"]=>
  string(38) "Wandsworth, Wandsworth, United Kingdom"
}
string(14) "United Kingdom"
string(2) "GB"
string(10) "Wandsworth"
string(10) "Wandsworth"
string(38) "Wandsworth, Wandsworth, United Kingdom"
string(6) "Europe"
string(2) "EU"
string(11) "185.35.50.4"
string(7) "51.4439"
string(7) "-0.1854"
string(2) "50"
string(13) "Europe/London"
string(3) "GBP"
string(2) "£"
string(2) "£"

0

L' API Paese dell'utente ha esattamente ciò di cui hai bisogno. Ecco un codice di esempio che utilizza file_get_contents () come in origine:

$result = json_decode(file_get_contents('http://usercountry.com/v1.0/json/'.$cip), true);
$result['country']['name']; // this contains what you need

1
Questa API consente 100 chiamate API (gratuite) al giorno.
riformato

0

Puoi ottenere visitatori paese e città utilizzando l'API geo di ipstack. Devi ottenere la tua API ipstack e quindi utilizzare il codice seguente:

<?php
 $ip = $_SERVER['REMOTE_ADDR']; 
 $api_key = "YOUR_API_KEY";
 $freegeoipjson = file_get_contents("http://api.ipstack.com/".$ip."?access_key=".$api_key."");
 $jsondata = json_decode($freegeoipjson);
 $countryfromip = $jsondata->country_name;
 echo "Country: ". $countryfromip ."";
?>

Fonte: ottieni visitatori paese e città in PHP utilizzando l'API ipstack


0

Questa è solo una nota di sicurezza sulla funzionalità get_client_ip()che la maggior parte delle risposte qui sono state incluse nella funzione principale di get_geo_info_for_this_ip().

Non fare troppo affidamento sui dati IP nelle intestazioni della richiesta come Client-IPo X-Forwarded-Forperché possono essere falsificati molto facilmente, tuttavia dovresti fare affidamento sull'IP di origine della connessione TCP che viene effettivamente stabilito tra il nostro server e il client $_SERVER['REMOTE_ADDR']come può " essere falsificato

$_SERVER['HTTP_CLIENT_IP'] // can be spoofed 
$_SERVER['HTTP_X_FORWARDED_FOR'] // can be spoofed 
$_SERVER['REMOTE_ADDR']// can't be spoofed 

Va bene ottenere il paese dell'IP contraffatto, ma tieni presente che l'utilizzo di questo IP in qualsiasi modello di sicurezza (ad esempio: vietare l'IP che invia richieste frequenti) distruggerà l'intero modello di sicurezza. IMHO Preferisco usare l'IP client effettivo anche se è l'IP del server proxy.


0

Provare

  <?php
  //gives you the IP address of the visitors
  if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
      $ip = $_SERVER['HTTP_CLIENT_IP'];}
  else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } else {
      $ip = $_SERVER['REMOTE_ADDR'];
  }

  //return the country code
  $url = "http://api.wipmania.com/$ip";
  $country = file_get_contents($url);
  echo $country;

  ?>

La parte if-else ti fornirà l'indirizzo IP del visitatore e la parte successiva restituirà il prefisso nazionale. Prova a visitare api.wipmania.com e poi api.wipmania.com/[your_IP_address]
Dipanshu Mahla

0

È possibile utilizzare il mio servizio: https://SmartIP.io , che fornisce nomi di paesi completi e nomi di città di qualsiasi indirizzo IP. Esponiamo anche fusi orari, valuta, rilevamento proxy, rilevamento nodi TOR e rilevamento Crypto.

Devi solo registrarti e ottenere una chiave API gratuita che consente 250.000 richieste al mese.

Utilizzando la libreria PHP ufficiale, la chiamata API diventa:

$apiKey = "your API key";
$smartIp = new SmartIP($apiKey);
$response = $smartIp->requestIPData("8.8.8.8");

echo "\nstatus code: " . $response->{"status-code"};
echo "\ncountry name: " . $response->country->{"country-name"};

Controlla la documentazione API per ulteriori informazioni: https://smartip.io/docs


0

A partire dal 2019, il DB paese MaxMind può essere utilizzato come segue:

<?php
require_once 'vendor/autoload.php';
use MaxMind\Db\Reader;
$databaseFile = 'GeoIP2-Country.mmdb';
$reader = new Reader($databaseFile);
$cc = $reader->get($_SERVER['REMOTE_ADDR'])['country']['iso_code'] # US/GB...
$reader->close();

Fonte: https://github.com/maxmind/MaxMind-DB-Reader-php


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.