Pregunta

¿Alguien conoce una forma sencilla de recuperar el país de una dirección IP determinada?¿Preferiblemente en formato ISO_3166-1?

¿Fue útil?

Solución

Mucha gente (incluida mi empresa) parece utilizar MaxMind GeoIP.

Tienen una versión gratuita. geolite que no es tan precisa como la versión paga, pero si solo buscas algo simple, puede ser suficiente.

Otros consejos

Hay dos enfoques:usando un servicio de Internet y usando algún tipo de lista local (quizás envuelta en una biblioteca).Lo que quieras dependerá de lo que estés construyendo.

Para servicios:

Para listas:

Aquí hay un buen servicio gratuito con una API pública:http://www.hostip.info/use.html

ipinfodb proporciona una base de datos gratuita y API para IP a país y viceversa.Utilizan datos gratuitos de MaxMind.Los datos se actualizan cada mes y es una excelente alternativa gratuita con una precisión decente.

No sé qué tan preciso es ese sitio hostip.info.Acabo de visitar ese sitio y me informó que mi país es Canadá.Estoy en los EE. UU. y el ISP que utiliza mi oficina solo opera desde los EE. UU.Le permite corregir sus suposiciones, pero si está utilizando este servicio para rastrear a los visitantes del sitio web por país, no tendrá forma de saber si los datos son correctos.Por supuesto, soy sólo un dato.Descargué la base de datos GeoLite Country, que es solo un archivo .csv, y mi dirección IP se identificó correctamente como EE. UU.

Otro beneficio de la línea de productos MaxMind (de pago o gratuitos) es que usted tiene los datos, no incurre en el impacto de rendimiento que supone realizar una llamada de servicio web a otro sistema.

El más preciso es Digital Elements NetAcuity... no es gratuito, pero obtienes lo que pagas la mayor parte del tiempo...Elemento digital

google devuelve la ubicación del cliente (mi ejemplo)

latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;

Puede utilizar la solución proporcionada para esta pregunta.

Pero devuelve un código de país de 2 dígitos.

Prueba este código php

  <?php  $ip = $_SERVER['REMOTE_ADDR'];
    $json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
    $json = json_decode($json,true);
    $timezone = $json[localTimeZone];?>

Puedes utilizar mi servicio, http://ipinfo.io, para esto.La API devuelve una gran cantidad de detalles diferentes sobre una dirección IP:

$ curl ipinfo.io/8.8.8.8
{
  "ip": "8.8.8.8",
  "hostname": "google-public-dns-a.google.com",
  "loc": "37.385999999999996,-122.0838",
  "org": "AS15169 Google Inc.",
  "city": "Mountain View",
  "region": "CA",
  "country": "US",
  "phone": 650
}

Si solo busca el código de país, solo necesita agregar /país a la URL:

$ curl ipinfo.io/8.8.8.8/country
US

Aquí hay una función PHP genérica que podrías usar:

function ip_details($ip) {
    $json = file_get_contents("http://ipinfo.io/{$ip}");
    $details = json_decode($json);
    return $details;
}

$details = ip_details("8.8.8.8");

echo $details->city;     // => Mountain View
echo $details->country;  // => US
echo $details->org;      // => AS15169 Google Inc.
echo $details->hostname; // => google-public-dns-a.google.com

He usado la IP 8.8.8.8 en estos ejemplos, pero si desea detalles sobre la IP del usuario, simplemente páselos. $_SERVER['REMOTE_ADDR'] en cambio.Más detalles están disponibles en http://ipinfo.io/developers

puede utilizar API de servicios web que hacen este trabajo como:

see example of service: http://ip-api.com and usage: http://whatmyip.info

Ver ipdata.co lo que le proporciona varios puntos de datos de una dirección IP.

La API es bastante rápida, con 10 puntos finales globales, cada uno capaz de manejar >800 millones de llamadas diarias.

Aquí hay un ejemplo de rizo;

curl https://api.ipdata.co/78.8.53.5
{
    "ip": "78.8.53.5",
    "city": "G\u0142og\u00f3w",
    "region": "Lower Silesia",
    "region_code": "DS",
    "country_name": "Poland",
    "country_code": "PL",
    "continent_name": "Europe",
    "continent_code": "EU",
    "latitude": 51.6461,
    "longitude": 16.1678,
    "asn": "AS12741",
    "organisation": "Netia SA",
    "postal": "67-200",
    "currency": "PLN",
    "currency_symbol": "z\u0142",
    "calling_code": "48",
    "flag": "https://ipdata.co/flags/pl.png",
    "emoji_flag": "\ud83c\uddf5\ud83c\uddf1",
    "time_zone": "Europe/Warsaw",
    "is_eu": true,
    "suspicious_factors": {
        "is_tor": false
    }
}⏎  

Puedes probar gratis Base de datos IP2Location LITE

Para crear la tabla en MySQL

CREATE DATABASE ip2location;
USE ip2location;
CREATE TABLE `ip2location_db1`(
    `ip_from` INT(10) UNSIGNED,
    `ip_to` INT(10) UNSIGNED,
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    INDEX `idx_ip_to` (`ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Para importar los datos

LOAD DATA LOCAL
    INFILE 'IP2LOCATION-LITE-DB1.CSV'
INTO TABLE
    `ip2location_db1`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES;

Código PHP para consultar MySQL

<?php
// Replace this MYSQL server variables with actual configuration
$mysql_server = "mysql_server.com";
$mysql_user_name = "UserName";
$mysql_user_pass = "Password";

// Retrieve visitor IP address from server variable REMOTE_ADDR
$ipaddress = $_SERVER["REMOTE_ADDR"];

// Convert IP address to IP number for querying database
$ipno = Dot2LongIP($ipaddress);

// Connect to the database server
$link = mysql_connect($mysql_server, $mysql_user_name, $mysql_user_pass) or die("Could not connect to MySQL database");

// Connect to the IP2Location database
mysql_select_db("ip2location") or die("Could not select database");

// SQL query string to match the recordset that the IP number fall between the valid range
$query = "SELECT * FROM ip2location_db1 WHERE $ipno <= ip_to LIMIT 1";

// Execute SQL query
$result = mysql_query($query) or die("IP2Location Query Failed");

// Retrieve the recordset (only one)
$row = mysql_fetch_object($result);

// Keep the country information into two different variables
$country_code = $row->country_code;
$country_name = $row->country_name;

echo "Country_code: " . $country_code . "<br/>";
echo "Country_name: " . $country_name . "<br />";

// Free recordset and close database connection
mysql_free_result($result);
mysql_close($link);

// Function to convert IP address (xxx.xxx.xxx.xxx) to IP number (0 to 256^4-1)
function Dot2LongIP ($IPaddr) {
 if ($IPaddr == "")
 {
   return 0;
 } else {
   $ips = explode(".", $IPaddr);
   return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256);
 }
}
?>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top