250 votes

Obtenir le pays des visiteurs à partir de leur IP

Je veux obtenir le pays des visiteurs via leur IP... Actuellement, j'utilise ceci ( http://api.hostip.info/country.php?ip= ...... )

Voici mon code :

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

?>

Eh bien, cela fonctionne correctement, mais le problème est que cela renvoie le code du pays comme US ou CA, et non le nom complet du pays comme États-Unis ou Canada.

Alors, y a-t-il une bonne alternative à hostip.info qui propose cela ?

Je sais que je peux écrire un code qui transformera éventuellement ces deux lettres en nom de pays entier, mais je suis trop paresseux pour écrire un code qui contienne tous les pays...

P.S. : Pour une raison quelconque, je ne veux pas utiliser un fichier CSV tout prêt ou un code qui récupère ces informations pour moi, quelque chose comme le code et le CSV tout prêt de ip2country.

25 votes

Ne soyez pas paresseux, il n'y a pas tant de pays que ça, et il n'est pas très difficile d'obtenir une table de traduction des codes de lettres FIPS 2 en noms de pays.

0 votes

Utilisez la fonction geoip de Maxmind. Elle inclura le nom du pays dans les résultats. maxmind.com/app/php

0 votes

Votre première mission à $real_ip_address est toujours ignorée. Quoi qu'il en soit, n'oubliez pas que le X-Forwarded-For peut être très facilement contrefait et qu'il existe des proxies comme www.hidemyass.com.

555voto

Nakka Chandra Points 1

Essayez cette simple fonction 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;
}

?>

Comment l'utiliser :

Exemple1 : Obtenir les détails de l'adresse IP du visiteur

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

?>

Exemple 2 : Obtenir les détails de n'importe quelle adresse IP. [Support IPV4 & 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 )

?>

2 votes

Pourquoi est-ce que je suis toujours inconnue avec chaque IP ? J'ai utilisé le même code.

2 votes

Vous obtenez "Unknown" probablement parce que votre serveur n'autorise pas file_get_contents() . Vérifiez simplement votre fichier error_log. Solution : voir ma réponse.

5 votes

C'est peut-être aussi parce que vous l'avez vérifié localement (192.168.1.1 / 127.0.0.1 / 10.0.0.1).

56voto

Baba Points 49157

Vous pouvez utiliser une API simple à partir de 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>";

Fonction utilisée

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

Sortie

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

Cela vous donne tellement d'options avec lesquelles vous pouvez jouer.

Merci

)

1 votes

C'est vraiment cool. Mais lors du test, il n'y a pas de valeurs dans les champs suivants : "geoplugin_city, geoplugin_region, geoplugin_regionCode, geoplugin_regionName" . Quelle est la raison ? Existe-t-il une solution ? Merci d'avance

0 votes

C'est maintenant en fait geoplugin.com.... qui.... vous pouvez probablement vous référer à l'autre exemple (ci-dessus)

32voto

Echt Einfach TV Points 1091

J'ai essayé la réponse de Chandra mais la configuration de mon serveur n'autorise pas fichier_get_contenu()

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

J'ai modifié le code de Chandra pour qu'il fonctionne également pour les serveurs de ce type utilisant 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

?>

J'espère que cela vous aidera ;-)

3 votes

Selon les docs sur leur site : " Si geoplugin.net répondait parfaitement, puis s'est arrêté, alors vous avez dépassé la limite de consultation gratuite de 120 demandes par minute. "

0 votes

Cela a fonctionné à merveille. Merci !

12voto

Marcus Points 3170

En fait, vous pouvez appeler http://api.hostip.info/?ip=123.125.114.144 pour obtenir les informations, qui sont présentées en XML.

10voto

GBD Points 9139

Utilisez les services suivants

1) http://api.hostip.info/get_html.php?ip=12.215.42.19

2)

$json = file_get_contents('http://freegeoip.appspot.com/json/66.102.13.106');
$expression = json_decode($json);
print_r($expression);

3) http://ipinfodb.com/ip_location_api.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X