كيف تكتشف بلد زائر موقع الويب (على وجه التحديد ، الولايات المتحدة أم لا)؟

StackOverflow https://stackoverflow.com/questions/2156231

سؤال

أحتاج إلى إظهار روابط مختلفة لنا ولزوار غير أمريكيين لموقعي. هذا من أجل الراحة فقط ، لذلك أنا لا أبحث عن درجة عالية من الدقة ، والأمن أو الخداع ليسوا مصدر قلق.

أعلم أن هناك خدمات وقوائم الاستهداف الجيولوجي ، لكن هذا يبدو وكأنه مبالغة لأنني بحاجة فقط إلى تحديد (تقريبًا) إذا كان الشخص في الولايات المتحدة أم لا.

كنت أفكر في استخدام JavaScript للحصول على المنطقة الزمنية للمستخدم ، ولكن يبدو أن هذا يعطي فقط الإزاحة ، لذلك سيكون لدى المستخدمين في كندا والمكسيك وأمريكا الجنوبية نفس قيمة الأشخاص في الولايات المتحدة.

هل هناك أي أجزاء أخرى من المعلومات متوفرة إما في JavaScript ، أو PHP ، أقل من الاستيلاء على عنوان IP والبحث ، لتحديد ذلك؟

هل كانت مفيدة؟

المحلول

هناك بعض الخدمات المجانية التي تتيح لك جعل التنقيط الجغرافي القائم على البلاد و IP من جانب العميل.

لقد استخدمت ويبانيا خدمة 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 قبول اللغة. سيبدو شيئًا ما أدناه في طلب 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'];
?>

أود أن أقول أن الاستهداف الجيولوجي هو الطريقة الوحيدة التي يمكن الاعتماد عليها عن بعد. ولكن هناك أيضًا حالات لا تساعد فيها على الإطلاق. أستمر في الوصول إلى المواقع التي تعتقد أنني في فرنسا لأن العمود الفقري لشركتي موجود وجميع حركة المرور على الإنترنت تمر بها.

رأس قبول HTTP لا يكفي لتحديد لغة المستخدم. إنه يخبرك فقط بما يختاره المستخدم كلغة ، والتي قد لا علاقة لها بالمكان. المزيد عن هذا هنا.

اعتمادًا على البلدان التي تريد التمييز بينها ، يمكن أن تكون المناطق الزمنية وسيلة سهلة للغاية لتحقيق ذلك - وأفترض أنها موثوقة تمامًا لأن معظم الناس سيحصلون على الساعات على أجهزة الكمبيوتر الخاصة بهم بشكل صحيح. (على الرغم من أن هناك العديد من البلدان التي لا يمكنك التمييز بينها باستخدام هذه التقنية).

إليك مثال بسيط حقًا على كيفية القيام بذلك:

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

أو باستخدام حليقة:

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

الحل الخاص بي ، سهل وصغير ، في هذا المثال أختبر منطقة كندا من اللغة fr-CA or en-CA

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

   $region = "Canada";

}

ببساطة يمكننا استخدام API Hostip

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top