Obtenga información geográfica desde una dirección IP de forma gratuita | Programar Plus

Supongamos que necesita saber de qué país es alguien que visita su sitio web, porque tiene un sitio internacionalizado y muestra diferentes cosas según ese país. Podrías preguntarle al usuario. Es posible que desee tener esa funcionalidad de todos modos para asegurarse de que sus visitantes tengan el control, pero seguramente apreciarán que sea correcto desde el principio, lo mejor que pueda.

No existen tecnologías web nativas que tengan esta información. JavaScript tiene geolocalización, pero los usuarios tendrían que aprobarlo, e incluso entonces tendrías que usar alguna biblioteca para convertir las coordenadas en un país más utilizable. Incluso los lenguajes de back-end, que tienen acceso a la dirección IP de una manera que JavaScript no lo hace, no solo conocen automáticamente el país de origen.

CANADÁ. SOLO QUIERO SABER SI SON DE CANADÁ O NO.

Tienes que pedir algún tipo de servicio que lo sepa. La API de geolocalización de IP es ese servicio y es gratis.

Realizas un GET contra la API. Puede hacerlo directamente en el navegador si desea probarlo:

https://api.ipgeolocationapi.com/geolocate/184.149.48.32

Pero no solo obtienes el país. Obtienes una gran cantidad de información que quizás necesites usar. Sucede que estoy sentado en Canadá y esto es lo que obtengo por mi IP:

{ 
   "continent":"North America",
   "address_format":"{{recipient}}n{{street}}n{{city}} {{region_short}} {{postalcode}}n{{country}}",
   "alpha2":"CA",
   "alpha3":"CAN",
   "country_code":"1",
   "international_prefix":"011",
   "ioc":"CAN",
   "gec":"CA",
   "name":"Canada",
   "national_destination_code_lengths":[ 
      3
   ],
   "national_number_lengths":[ 
      10
   ],
   "national_prefix":"1",
   "number":"124",
   "region":"Americas",
   "subregion":"Northern America",
   "world_region":"AMER",
   "un_locode":"CA",
   "nationality":"Canadian",
   "postal_code":true,
   "unofficial_names":[ 
      "Canada",
      "Kanada",
      "Canadá",
      "カナダ"
   ],
   "languages_official":[ 
      "en",
      "fr"
   ],
   "languages_spoken":[ 
      "en",
      "fr"
   ],
   "geo":{ 
      "latitude":56.130366,
      "latitude_dec":"62.832908630371094",
      "longitude":-106.346771,
      "longitude_dec":"-95.91332244873047",
      "max_latitude":83.6381,
      "max_longitude":-50.9766,
      "min_latitude":41.6765559,
      "min_longitude":-141.00187,
      "bounds":{ 
         "northeast":{ 
            "lat":83.6381,
            "lng":-50.9766
         },
         "southwest":{ 
            "lat":41.6765559,
            "lng":-141.00187
         }
      }
   },
   "currency_code":"CAD",
   "start_of_week":"sunday"
}

Con esa información, fácilmente podría decidir redireccionar a la versión canadiense de mi sitio web, si tengo uno, o mostrar los precios en CAD, u ofrecer una traducción al francés, o cualquier otra cosa que se me ocurra.

Digamos que estaba en PHP. Podrías obtener la IP como …

function getUserIpAddr() {
  if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
  } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } else {
    $ip = $_SERVER['REMOTE_ADDR'];
  }
  return $ip;
}

El cURL para obtener la información:

$url = "https://api.ipgeolocationapi.com/geolocate/184.149.48.32"; 
$ch = curl_init();  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_URL, $url); 
$result = curl_exec($ch); 

Vuelve como JSON, entonces:

$json = json_decode($result);

Y luego $json->{'name'}; será “Canadá” si estoy en Canadá.

Entonces puedo hacer como:

if ($json->{'name'} == "Canada") {
  // serve index-ca.php
} else {
  // server index.php
}