2008-08-04 21 views
56

¿Alguien sabe de una manera simple de recuperar el país para una dirección IP dada? Preferiblemente en formato ISO_3166-1?¿Cómo obtener el país según una determinada IP?

+8

No confíe demasiado en el IP que le indica el país donde está sentado el usuario: porque trabajo para una empresa escandinava, sigo viendo anuncios en sueco, aunque nuestra oficina se encuentra en Escocia ... – AAT

+0

Exactamente - si tú lo piensas. Hay muchos casos en los que puede parecer que proviene de algún lugar, pero en realidad provienen de otro lugar. Todo se debe al hecho de que la topología de red no tiene que confirmarse a fronteras políticas o geológicas. F.ex. VPN's, inalámbricos, satelitales, etc. – Phluks

Respuesta

35

Una gran cantidad de personas (incluyendo a mi compañía) parecen utilizar MaxMind GeoIP.

Tienen una versión gratuita GeoLite que no es tan precisa como la versión de pago, pero si buscas algo simple, puede ser suficiente.

+2

El enlace GeoLite de arriba da como resultado un 404 cuando revisé hoy. –

+0

enlace de trabajo es http://dev.maxmind.com/geoip/geoip2/geolite2/ – Manoj

+0

Nuestra aplicación de ubicación geográfica también funcionará bien: https: // ip-api.io –

5

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

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

+0

Im en el Reino Unido y dijo que estaba en Río, Brasil :) – Mike

38

Hay dos enfoques: usar un servicio de Internet y usar algún tipo de lista local (tal vez envuelto en una biblioteca). Lo que quieras dependerá de lo que estás construyendo.

Para servicios:

Para listas:

+1

Una de las respuestas más útiles en general que he visto en SO. ¡Gracias! – tzot

+0

¿Sabes quizás si los RIR también tienen información más detallada, como geopipcity db de maxmind, disponible como datos abiertos? Lo busqué, pero no pude encontrarlo – Jevado

2

La más precisa es Digital Elements NetAcuity ... no es libre, pero se obtiene lo que paga la mayor parte del tiempo .... Digital Element

8

ipinfodb proporciona una base de datos y API gratuita para IP a país y viceversa. Usan datos gratuitos de MaxMind. Los datos se actualizan todos los meses, y es una gran alternativa gratuita con una precisión decente.

+0

Mucho mejor que mantener tu propia base de datos. Acabo de probarlo en un lugar realmente oscuro (Uthai Thani, Tailandia) y fue perfecto. Gran hallazgo, gracias! –

2

google's vuelve clientlocation (my example)

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

Se pueden utilizar la solución prevista this question.

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

2

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];?> 
1

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

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

Puede use mi servicio, http://ipinfo.io, para esto. La API devuelve un montón de diferentes detalles de 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 sólo después de que el código de país sólo tiene que añadir/país a la URL:

$ curl ipinfo.io/8.8.8.8/country 
US 

Aquí hay una PHP función genérica que puede 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 utilizado el IP 8.8.8.8 en estos ejemplos, pero si quieres detalles de IP del usuario sólo tiene que pasar en $_SERVER['REMOTE_ADDR'] lugar. Más detalles están disponibles en http://ipinfo.io/developers

0

Ver ipdata.co que le da 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> 800M llamadas diarias.

Aquí hay un ejemplo de curl;

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 
    } 
}⏎ 
0

Puede probar el libre IP2Location LITE database

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 el 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); 
} 
} 
?> 
Cuestiones relacionadas