Подтвердить что ты не робот

Как вы определяете страну посетителя веб-сайта (в частности, США или нет)?

Мне нужно показать разные ссылки для американских и неамериканских посетителей на моем сайте. Это только для удобства, поэтому я не ищу сверхвысокую степень точности, и безопасность или спуфинг не являются проблемой.

Я знаю, что есть сервисы и списки геотаргетинга, но это похоже на излишний, поскольку мне нужно только определить (грубо), если человек находится в США или нет.

Я думал об использовании JavaScript для получения пользовательского часового пояса, но это, похоже, дает только смещение, поэтому пользователи в Канаде, Мексике и Южной Америке будут иметь такую ​​же ценность, как и люди в США.

Существуют ли какие-либо другие биты информации, доступные либо в JavaScript, либо в PHP, чтобы не хватать IP-адрес и выполнять поиск, чтобы определить это?

4b9b3361

Ответ 1

Есть несколько бесплатных сервисов, которые позволяют вам делать геолокализацию страны и ip-based с клиентской стороны.

Я использовал wipmania бесплатный сервис JSONP, он очень прост в использовании:

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

Или, если вы используете фреймворк, поддерживающий JSONP, например jQuery, вы можете:

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

Проверьте приведенный выше фрагмент здесь.

Ответ 2

Лучшим индикатором является, вероятно, заголовок HTTP-Accept-Language. В 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

Вы можете получить это на PHP, используя следующее:

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

Ответ 3

Я бы сказал, что геотаргетинг - единственный метод, который даже отдаленно надежен. Но есть также случаи, когда это вообще не помогает. Я продолжаю посещать сайты, которые думают, что я нахожусь во Франции, потому что у меня есть магистральная сеть, и через нее проходит весь интернет-трафик.

Заголовок HTTP Accept недостаточно для определения пользовательской локали. Он сообщает вам только то, что пользователь выбрал в качестве своего языка, что может не иметь никакого отношения к тому, где они есть. Подробнее об этом здесь.

Ответ 4

В зависимости от того, какие страны вы хотите отличить, часовые пояса могут быть очень легким способом его достижения - и я считаю, что он достаточно надежный, поскольку большинство людей будут иметь часы на своих компьютерах правильно. (Хотя, конечно, есть много стран, которые вы не можете отличить, используя эту технику).

Вот действительно простой пример того, как это сделать:

http://unmissabletokyo.com/country-detector

Ответ 5

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

Ответ 6

@rostislav

или используя 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);
}

Ответ 7

Просто мы можем использовать Hostip API

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

Все коды стран здесь.. http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

Ответ 8

Мое решение, легкое и маленькое, в этом примере я тестирую область Канады из языка fr-CA or en-CA

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

   $region = "Canada";

}