web-dev-qa-db-ja.com

Webサイトの訪問者の国(具体的には、米国かどうか)をどのように検出しますか?

私のサイトへの米国と米国以外の訪問者に異なるリンクを表示する必要があります。これは便宜上のものであるため、私は超高精度を探していません。セキュリティやスプーフィングは問題ではありません。

地域ターゲティングサービスとリストがあることは知っていますが、その人が米国にいるかどうかを(大まかに)判断するだけでよいので、これはやり過ぎのようです。

JavaScriptを使用してユーザーのタイムゾーンを取得することを考えていましたが、これはオフセットを与えるだけのように思われるため、カナダ、メキシコ、南アメリカのユーザーは米国のユーザーと同じ値になります。

これを決定するために、IPアドレスを取得してルックアップを行う以外に、JavaScriptまたはPHPで利用可能なその他の情報はありますか?

34
David Smith

クライアント側から国や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>

または、jQueryのようにJSONPをサポートするフレームワークを使用する場合は、次のことができます。

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

実行中の上記のスニペット here を確認してください。

48
CMS

最良の指標は、おそらく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'];
?>
6
Taylor Leese

地域ターゲティングは、リモートで信頼できる唯一の方法だと思います。しかし、まったく役に立たない場合もあります。私の会社のバックボーンがあり、すべてのインターネットトラフィックが通過するため、フランスにいると思うサイトにアクセスし続けます。

HTTP Acceptヘッダーは、ユーザーロケールを決定するには不十分です。これは、ユーザーが言語として何を選択したかを示すだけであり、ユーザーがどこにいるかとは関係がない場合があります。これについての詳細 ここ

3
Farinha

区別したい国に応じて、タイムゾーンは非常に簡単に達成できる方法です。ほとんどの人はコンピューターの時計を正しく設定しているため、非常に信頼できると思います。 (もちろん、このテクニックを使用して区別できない多くの国があります)。

これを行う方法の非常に単純な例を次に示します。

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

または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

私の解決策、簡単で小さい、この例では、言語fr-CA or en-CAからカナダ地域をテストします

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

   $region = "Canada";

}
1

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

0
sameeuor