Nasıl (Özellikle, ABD ya da değil) bir web sitesi ziyaretçinin ülkeyi tespit ediyorsunuz?

6 Cevap php

Siteme ABD ve ABD dışındaki ziyaretçiler için farklı bağlantıları göstermek gerekir. Bu sadece kolaylık içindir, bu yüzden doğruluk bir süper-yüksek derecede arıyor değilim, ve güvenlik veya sızdırma bir endişe değildir.

Ben coğrafi hedefleme hizmetleri ve listeleri var biliyorum, ama kişi ABD veya değil ise sadece (kabaca) belirlemek gerekir beri bu overkill gibi görünüyor.

Ben kullanıcının dilimini almak için JavaScript kullanarak düşünüyordum, ama bu Kanada, Meksika ve Güney Amerika'daki kullanıcılar ABD'de insanlar olarak aynı değere sahip olurdu böylece sadece ofset vermek için görünür.

IP adresini kapma ve bu belirlemek için bir arama yapıyor kısa JavaScript veya PHP ya mevcut bilgilerin başka bit, var mı?

6 Cevap

Eğer istemci tarafında ülkeyi ve ip tabanlı geolocalization yapalım orada bazı ücretsiz hizmetler vardır.

Ben gerçekten kullanımı basit, wipmania ücretsiz JSONP hizmeti kullandım:

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

Yoksa siz yapabilirsiniz jQuery gibi JSONP destekleyen bir çerçeve kullanıyorsanız:

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

Yukarıdaki pasajı çalışan kontrol here.

Iyi göstergesi muhtemelen HTTP Accept-Language başlık olduğunu. Bu HTTP isteği aşağıdaki gibi görünecektir:

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

Aşağıdaki PHP kullanarak bu almak gerekir:

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

Ben geotargetting bile uzaktan güvenilir tek yöntem olduğunu söyleyebilirim. Ama hiç yardımcı olmuyor durumlar da vardır. Ben şirketin omurgası olduğunu ve tüm Internet trafiğini içinden geçiyor çünkü Fransa'da olduğumu düşünüyorum sitelere elde tutmak.

HTTP Üstbilgi kullanıcı yerel ayarı belirlemek için yeterli değildir kabul. Sadece ne söyler onlar nerede ile ilgisi olabilir kendi dili olarak seçilen kullanıcı,. Bu konuda daha fazla here.

Eğer ayırt etmek istediğiniz hangi ülkeler bağlı olarak, zaman dilimleri bunu başarmak için çok kolay bir yol olabilir - ve ben çoğu kişi doğru ayarlamak bilgisayarlarında saatleri olacak gibi oldukça güvenilir olduğunu varsayalım. (Tabii ki birçok ülke var olmasına rağmen, bu tekniği kullanarak ayırt edemez).

İşte bunu yapmak için nasıl gerçekten basit bir örnek:

http://unmissabletokyo.com/country-detector

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

veya cURL kullanarak:

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