どのようにして、ウェブサイトの訪問者の国(具体的には、米国やない)を検出するのですか?
-
23-09-2019 - |
質問
私は自分のサイトへの米国及び米国外の訪問者のための別のリンクを表示する必要があります。これは私が精度の超高度を捜しているわけではないし、セキュリティやなりすましが問題ではありませんので、単に便宜のためである。
私は、地域ターゲティングサービスとリストがある知っているが、人は米国にあるかどう私は(約)を決定する必要があるので、これはやり過ぎのように思える。
カナダ、メキシコ、南米のユーザーが米国の人々と同じ値を持っているでしょうので。この、私は、ユーザーのタイムゾーンを取得するにはJavaScriptを使用して考えていたが、これが表示されるだけでオフセットを与えること
のJavaScript、またはPHPで、短いIPアドレスをつかんで検索を行うための、これを決定するためのいずれかの利用可能な情報の他のビットはありますか?
解決
あなたは、クライアント側から国およびIPベースのgeolocalizationを作ってみよう。
そこにいくつかの無料サービスがあります。私は 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);
});
ここを実行している上記のスニペットを確認します。
他のヒント
最良の指標は、おそらく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'];
?>
私はgeotargettingもリモートで信頼できる唯一の方法であると言うでしょう。しかし、それはまったく助けにはならない場合もあります。私は私の会社のバックボーンがあり、すべてのインターネットトラフィックがそれを通過するので、私はフランスでだと思うサイトに得続けるます。
HTTPヘッダーは、ユーザーのロケールを決定するのに十分ではありません同意します。それだけで、ユーザーは、彼らがどこにあるかとは何の関係もないかもしれない彼らの言語として選択かを表示します。これについてはここを。
は区別したい国によっては、タイムゾーンは、それを達成するための非常に簡単な方法することができます - と私はほとんどの人が自分のコンピュータ上のクロックが右に設定されますよう、それは非常に信頼性がありますと仮定します。 (ただし、もちろん、あなたがこの技術を用いて識別することができない多くの国があります)。
ここでそれを行う方法の本当に簡単な例です。
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;
}
}
?>
@rostislav
やカールを使用します:
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);
}
言語からこの例Iのテストカナダの地域で、簡単かつ小型の私のソリューション、fr-CA or en-CA
if( preg_match( "/^[a-z]{2}\-(ca)/i", $_SERVER[ "HTTP_ACCEPT_LANGUAGE" ] ) ){
$region = "Canada";
}
単に我々が使用することができます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する