web-dev-qa-db-fra.com

Comment détectez-vous le pays d'un visiteur de site Web (spécifiquement, les États-Unis ou non)?

J'ai besoin d'afficher différents liens pour les visiteurs américains et non américains de mon site. C'est uniquement pour des raisons de commodité, donc je ne recherche pas 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 ciblage géographique, mais cela semble exagéré, car je n'ai qu'à déterminer (à peu près) si la personne est aux États-Unis ou non.

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

Existe-t-il d'autres informations disponibles en JavaScript ou PHP, à moins de saisir l'adresse IP et de faire une recherche, pour le déterminer?

34
David Smith

Il existe des services gratuits qui vous permettent de faire de la géolocalisation par pays et sur IP du côté client.

J'ai utilisé wipmania le service JSONP gratuit, c'est vraiment 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 prend en charge JSONP, comme jQuery, vous pouvez:

// 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'extrait ci-dessus en cours d'exécution ici .

48
CMS

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 pouvoir récupérer ceci dans PHP en utilisant ce qui suit:

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

Je dirais que le géo-ciblage est la seule méthode qui soit même fiable à distance. Mais il y a aussi des cas où cela n'aide pas du tout. Je continue à accéder à des sites qui pensent que je suis en France parce que la dorsale de mon entreprise est là et que tout le trafic Internet y passe.

L'en-tête d'acceptation HTTP n'est pas suffisant pour déterminer les paramètres régionaux de l'utilisateur. Il vous indique uniquement ce que l'utilisateur a sélectionné comme langue, ce qui n'a peut-être rien à voir avec l'endroit où il se trouve. Plus à ce sujet ici .

3
Farinha

Selon les pays que vous souhaitez distinguer, les fuseaux horaires peuvent être un moyen très facile de le réaliser - et je suppose que c'est assez fiable car la plupart des gens auront les horloges de leur ordinateur réglées correctement. (Bien sûr, il existe de nombreux pays que vous ne pouvez pas distinguer en utilisant cette technique).

Voici un exemple très simple de la façon de procéder:

http://unmissabletokyo.com/country-detector

1
Mike

Wipmania.com & 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;
    }
}
?>
1
Rostislav Levkovic

@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);
}
1
TD_Nijboer

Ma solution, simple et petite, dans cet exemple, je teste la région du Canada à partir de la langue fr-CA or en-CA

if( preg_match( "/^[a-z]{2}\-(ca)/i", $_SERVER[ "HTTP_ACCEPT_LANGUAGE" ] ) ){

   $region = "Canada";

}
1
Leonardo Ciaccio

Nous pouvons simplement utiliser l'API Hostip

<?php $country_code = file_get_contents("http://api.hostip.info/country.php"); <br/>if($country_code == "US"){ echo "You Are USA"; } <br/>else{ echo "You Are Not USA";} ?>

Tous les codes de pays sont ici .. http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

0
sameeuor