Pregunta

necesito para mostrar diferentes enlaces para los visitantes de mi sitio de Estados Unidos y fuera de Estados Unidos. Esto es sólo por conveniencia, por lo que no busco a un grado de super-alta de la precisión y la seguridad o la suplantación de identidad no son una preocupación.

Sé que hay geoTargeting servicios y listas, pero esto parece un exceso ya que sólo tienen que determinar (más o menos) si la persona se encuentra en los EE.UU. o no.

Estaba pensando en el uso de JavaScript para obtener la zona horaria del usuario, pero esto parece sólo dan el desplazamiento, por lo que los usuarios de Canadá, México y América del Sur tendría el mismo valor que las personas en los EE.UU..

¿Hay otros bits de información disponibles ya sea en JavaScript, PHP o, a falta de acaparamiento de la dirección IP y haciendo una búsqueda, para determinar esto?

¿Fue útil?

Solución

Hay algunos servicios gratuitos por ahí que le permiten hacer país y la geolocalización basada en IP desde el lado del cliente.

He utilizado el wipmania servicio JSONP libre, que es muy fácil de usar:

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

O si utiliza un marco que soporta JSONP, como jQuery se puede:

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

Compruebe el código anterior se ejecuta aquí .

Otros consejos

El mejor indicador es probablemente la cabecera HTTP Accept-Language. Se verá algo como la siguiente en la petición 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

Debería ser capaz de recuperar esto en PHP usando la siguiente:

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

Yo diría que geotargetting es el único método que es ni remotamente confiable. Pero también hay casos en los que no ayuda en absoluto. Sigo recibiendo a los sitios que creo que estoy en Francia porque la columna vertebral de mi compañía está ahí y todo el tráfico de Internet pasa a través de él.

El encabezado HTTP Accept no es suficiente para determinar la configuración regional del usuario. Sólo se le dice lo que el usuario ha seleccionado como su idioma, que puede tener nada que ver con el lugar donde se encuentren. Más información sobre este aquí .

En función de qué países desea distinguir, zonas de tiempo puede ser una manera muy fácil de lograr - y supongo que es bastante fiable como la mayoría de las personas tendrán los relojes en sus ordenadores ubicados justo. (Aunque, por supuesto, hay muchos países que no se puede distinguir el uso de esta técnica).

Aquí hay un ejemplo muy simple de cómo hacerlo:

http://unmissabletokyo.com/country-detector

Wipmania.com Y 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

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

Mi solución, fácil y pequeños, en esta prueba el ejemplo I región de Canadá, del lenguaje fr-CA or en-CA

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

   $region = "Canada";

}

Simplemente podemos utilizar 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";} ?>

Todos los códigos de país son aquí .. http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top