Как вы определяете страну посетителя сайта (в частности, США или нет)? - PullRequest
33 голосов
/ 28 января 2010

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

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

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

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

Ответы [ 8 ]

48 голосов
/ 28 января 2010

Существуют некоторые бесплатные сервисы, которые позволяют вам осуществлять геолокализацию по стране и ip со стороны клиента.

Я использовал бесплатный 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); 
});

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

6 голосов
/ 28 января 2010

Лучшим индикатором, вероятно, является заголовок 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 голосов
/ 28 января 2010

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

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

1 голос
/ 18 октября 2016

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

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

   $region = "Canada";

}
1 голос
/ 23 апреля 2014

@ Ростислава

или используя 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 голос
/ 23 сентября 2013

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 голос
/ 08 июля 2010

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

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

http://unmissabletokyo.com/country-detector

0 голосов
/ 07 января 2015

Просто мы можем использовать 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

...