37 votes

Comment détecter le pays du visiteur d'un site Web (plus précisément, les États-Unis ou non) ?

J'ai besoin d'afficher des liens différents pour les visiteurs américains et non américains de mon site. Il s'agit uniquement d'une question de commodité, je ne cherche donc pas à obtenir un degré de précision très élevé, et la sécurité ou l'usurpation d'identité ne sont pas un problème.

Je sais qu'il existe des services et des listes de géociblage, mais cela me semble excessif puisque je n'ai besoin que de déterminer (approximativement) si la personne se trouve aux États-Unis ou non.

Je pensais utiliser JavaScript pour obtenir le fuseau horaire de l'utilisateur, mais il semble que cela ne donne que le décalage, donc les utilisateurs du Canada, du Mexique et de l'Amérique du Sud auraient la même valeur que ceux des États-Unis.

Existe-t-il d'autres informations disponibles en JavaScript ou en PHP, autres que l'adresse IP et la recherche, pour déterminer cela ?

51voto

CMS Points 315406

Il existe des services gratuits qui vous permettent d'effectuer une géolocalisation par pays et par adresse IP du côté client.

J'ai utilisé le wipmania service JSONP gratuit, il est très simple à utiliser :

<script type="text/javascript">
  // plain JavaScript example
  function jsonpCallback(data) { 
    alert('Latitude: ' + data.latitude + 
          '\nLongitude: ' + data.longitude + 
          '\nCountry: ' + data.address.country); 
  }
</script>
<script src="http://api.wipmania.com/jsonp?callback=jsonpCallback"
        type="text/javascript"></script>

Ou si vous utilisez un framework qui supporte JSONP, comme jQuery, vous pouvez le faire :

// jQuery example
$.getJSON('http://api.wipmania.com/jsonp?callback=?', function (data) { 
  alert('Latitude: ' + data.latitude + 
        '\nLongitude: ' + data.longitude + 
        '\nCountry: ' + data.address.country); 
});

Vérifiez l'exécution du snippet ci-dessus aquí .

8voto

Taylor Leese Points 18895

Le meilleur indicateur est probablement l'en-tête HTTP Accept-Language. Il ressemblera à quelque chose comme ci-dessous dans la requête HTTP :

GET / HTTP/1.1
Accept: */*
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; MDDC; OfficeLiveConnector.1.4; OfficeLivePatch.0.0; .NET CLR 3.0.30729)
Accept-Encoding: gzip, deflate
Host: www.google.com
Connection: Keep-Alive

Vous devriez être en mesure de le récupérer en PHP en utilisant la commande suivante :

<?php
echo $_SERVER['HTTP_ACCEPT_LANGUAGE'];
?>

5voto

Farinha Points 5518

Je dirais que le géociblage est la seule méthode qui soit un tant soit peu fiable. Mais il y a aussi des cas où elle n'est d'aucune utilité. Je continue d'accéder à des sites qui pensent que je suis en France parce que le backbone de mon entreprise se trouve là-bas et que tout le trafic Internet y passe.

L'en-tête HTTP Accept n'est pas suffisant pour déterminer la locale de l'utilisateur. Elle vous indique seulement ce que l'utilisateur a choisi comme langue, ce qui peut n'avoir aucun rapport avec l'endroit où il se trouve. Pour en savoir plus aquí .

1voto

Wipmania.com et PHP

<?php
$site_name = "www.your-site-name.com";

function getUserCountry() {
    $fp = fsockopen("api.wipmania.com", 80, $errno, $errstr, 5);
    if (!$fp) {
        // API is currently down, return as "Unknown" :(
        return "XX";
    } else {
        $out = "GET /".$_SERVER['REMOTE_ADDR']."?".$site_name." HTTP/1.1\r\n";
        $out .= "Host: api.wipmania.com\r\n";
        $out .= "Typ: php\r\n";
        $out .= "Ver: 1.0\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            $country = fgets($fp, 3);
        }
        fclose($fp);
        return $country;
    }
}
?>

1voto

TD_Nijboer Points 182

@rostislav

ou en utilisant cURL :

public function __construct($site_name) {
    // create a new cURL resource
    $ch = curl_init();

    // set URL and other appropriate options
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
    curl_setopt($ch, CURLOPT_URL, "http://api.wipmania.com".$_SERVER['REMOTE_ADDR']."?".$site_name);
    curl_setopt($ch, CURLOPT_HEADER, 0);

    // grab URL and pass it to the browser
    $response = curl_exec($ch);
    $info = curl_getinfo($ch,CURLINFO_HTTP_CODE);

    if (($response === false) || ($info !== 200)) {
        throw new Exception('HTTP Error calling Wipmania API - HTTP Status: ' . $info . ' - cURL Erorr: ' . curl_error($ch));
    } elseif (curl_errno($ch) > 0) {
        throw new Exception('HTTP Error calling Wipmania API - cURL Error: ' . curl_error($ch));
    }

    $this->country = $response;

    // close cURL resource, and free up system resources
    curl_close($ch);
}

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