Obtener la ubicación de una dirección IP


205

Quiero recuperar información como la ciudad, el estado y el país de un visitante de su dirección IP, para poder personalizar mi página web de acuerdo con su ubicación. ¿Hay una manera buena y confiable de hacer esto en PHP? Estoy usando JavaScript para las secuencias de comandos del lado del cliente, PHP para las secuencias de comandos del lado del servidor y MySQL para la base de datos.


Esto es prácticamente un duplicado de stackoverflow.com/questions/348614/… .
Charlie Martin el

Respuestas:


255

Puede descargar una base de datos GeoIP gratuita y buscar la dirección IP localmente, o puede usar un servicio de terceros y realizar una búsqueda remota. Esta es la opción más simple, ya que no requiere configuración, pero introduce latencia adicional.

Un servicio de terceros que podría utilizar es el mío, http://ipinfo.io . Proporcionan nombre de host, geolocalización, propietario de la red e información adicional, por ejemplo:

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

Aquí hay un ejemplo de PHP:

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"

También puede usarlo del lado del cliente. Aquí hay un ejemplo simple de jQuery:

$.get("https://ipinfo.io/json", function (response) {
    $("#ip").html("IP: " + response.ip);
    $("#address").html("Location: " + response.city + ", " + response.region);
    $("#details").html(JSON.stringify(response, null, 4));
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Client side IP geolocation using <a href="http://ipinfo.io">ipinfo.io</a></h3>

<hr/>
<div id="ip"></div>
<div id="address"></div>
<hr/>Full response: <pre id="details"></pre>


1
Es posible que desee asegurarse de agregar un json al final de la URL para asegurarse de recuperar json en lugar de la página web completa. $ detalles = json_decode (file_get_contents (" ipinfo.io {$ ip} / json"));
Doug

1
@Manatax No lo es, porque entonces sería imposible analizar la respuesta del servidor.
Ja͢ck

3
No parece un servicio muy confiable. Estoy nullbuscando el nombre de mi ciudad. No es como una ciudad pequeña o algo así, pero aún así no pudo localizarla. Si no funciona bien dentro de EE. UU., Dudo de la frecuencia con la que también volverá nulo fuera de EE. UU.
Derek 朕 會 功夫

2
el resultado no es exacto .. región, ciudad postal
Mark Gerryl Mirandilla

2
ADVERTENCIA: A partir de enero / 2019, algunas personas informaron que esta url de ipinfo no es segura en virustotal debido a un troyano. Los votos fueron entre 2015 y 2018
Ricardo

55

Pensé que había puesto ya que nadie parece haber dado información acerca de la API en particular, pero su regreso exactamente lo que busco y lo puede conseguir para volver en múltiples formatos, json, xml and csv.

 $location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
 print_r($location);

Esto te dará todas las cosas que podrías desear:

{
      "ip": "77.99.179.98",
      "country_code": "GB",
      "country_name": "United Kingdom",
      "region_code": "H9",
      "region_name": "London, City of",
      "city": "London",
      "zipcode": "",
      "latitude": 51.5142,
      "longitude": -0.0931,
      "metro_code": "",
      "areacode": ""

}

1
Hola, Jamie FreegeoIp.net no funciona. ¿Hay alguna otra manera?
Adi

Lo siento, no por el momento, pero es una pena, ya que ese es el servicio que estoy usando en mis sitios en vivo. Esperemos que vuelvan algún tiempo, así que
Jamie Hutber

2
mayormente deprimido y rara vez da alguna región o ciudad
Rahul aman

2
El servicio de Tony en Azure parece funcionar de manera rápida y confiable: freegeoip2
Gustav

1
Desafortunadamente, este servicio se desconectará el 1 de julio de 2018 según este mensaje: "Este punto final de API está en desuso y dejará de funcionar el 1 de julio de 2018. Para obtener más información, visite: github.com/apilayer/freegeoip#readme \
Julio Bailon

20

Un ejemplo puro de Javascript, utilizando los servicios de https://geolocation-db.com Proporcionan una solución JSON y JSONP-callback.

¡No se requiere jQuery!

<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geolocation-db.com</title>
</head>
<body>
    <div>Country: <span id="country"></span></div>
    <div>State: <span id="state"></span></div>
    <div>City: <span id="city"></span></div>
    <div>Postal: <span id="postal"></span></div>
    <div>Latitude: <span id="latitude"></span></div>
    <div>Longitude: <span id="longitude"></span></div>
    <div>IP address: <span id="ipv4"></span></div>                             
</body>
<script>

    var country = document.getElementById('country');
    var state = document.getElementById('state');
    var city = document.getElementById('city');
    var postal = document.getElementById('postal');
    var latitude = document.getElementById('latitude');
    var longitude = document.getElementById('longitude');
    var ip = document.getElementById('ipv4');

    function callback(data)
    {
        country.innerHTML = data.country_name;
        state.innerHTML = data.state;
        city.innerHTML = data.city;
        postal.innerHTML = data.postal;
        latitude.innerHTML = data.latitude;
        longitude.innerHTML = data.longitude;
        ip.innerHTML = data.IPv4;
    }

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'https://geoilocation-db.com/json/geoip.php?jsonp=callback';
    var h = document.getElementsByTagName('script')[0];
    h.parentNode.insertBefore(script, h);

</script> 
</html>

¿Hay algún límite relacionado con el uso de la https://geoilocation-db.comAPI?
Priyanka Sharma

16

Usando Google APIS:

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>

9
The geolocation functionality in the Loader hasn't been retired, per se. We stopped documenting it several years ago and have recommended the HTML-based solutions due to their improved accuracy, but the functionality itself has not been removed from the Loader at this time. code.google.com/p/google-ajax-apis/issues/detail?id=586
TheFrost

¿Qué pasa con la calidad de esta geolocalización IP APIS de Google? (es, o me equivoco?), en comparación con otros servicios como ipinfo.io ?
Basj

Le pregunté a ~ 30 personas en diferentes ciudades, y la calidad de geolocalización IP de Google APIS es pobre en comparación con ipinfo.io
Basj

1
@Basj API de Google funciona como un encanto mientras ipinfo.io muestra que estoy en Estados Unidos, mientras que estoy realmente en el centro de Europa
patryk

15

Debe utilizar un servicio externo ... como http://www.hostip.info/ si busca en Google "geo-ip" puede obtener más resultados.

La API Host-IP está basada en HTTP, por lo que puede usarla en PHP o JavaScript, según sus necesidades.


66
He estado usando hostip.info durante un año y NO estoy impresionado. Por lo general, volver desconocidos 9/10 cheques
aron

de acuerdo, me dice que vivo en Woking ... Para ser justos, entendió bien el GB ... Pero estoy en Londres.
Jamie Hutber

2
Tenga en cuenta que cualquier servicio solo será tan bueno como la información / datos públicos disponibles. Debido a razones de privacidad, esta información solo puede ser "muy buena". Si su país está bien, y al menos cerca del estado / provincia, lo consideraría un WIN. Si está utilizando esto para buscar información para un ataque de DOS, tenga en cuenta que las IP podrían no ser válidas (no asignadas a nadie o fuera del rango de IP público válido).
eselk

En su sitio web aparece "Ubicación: ... en realidad no tenemos ni idea". Todo lo que necesitaba saber
Bojan Kogoj

15

Escribí un bot usando una API de ipapi.co , así es como puede obtener la ubicación de una dirección IP (por ejemplo 1.2.3.4) en php:

Establecer encabezado:

$opts = array('http'=>array('method'=>"GET", 'header'=>"User-Agent: mybot.v0.7.1"));
$context = stream_context_create($opts);

Obtenga respuesta JSON

echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);

de obtener un campo específico (país, zona horaria, etc.)

echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);

1
@Eoin lo eliminó. Parece que la IP de phpfiddle está restringida.
Jaimes

10

Esta pregunta está protegida, lo que entiendo. Sin embargo, no veo una respuesta aquí, lo que veo es que muchas personas muestran lo que se les ocurrió al tener la misma pregunta.

Actualmente hay cinco Registros Regionales de Internet con diversos grados de funcionalidad que sirven como el primer punto de contacto con respecto a la propiedad de IP. El proceso está en constante cambio, por lo que los diversos servicios aquí funcionan a veces y no en otros.

Sin embargo, Who Is es (obviamente) un antiguo protocolo TCP: la forma en que funcionó originalmente fue mediante la conexión al puerto 43, lo que hace que sea problemático enrutarlo a través de conexiones arrendadas, firewalls ... etc.

En este momento, la mayoría de Who Is se realiza a través de RESTful HTTP y ARIN, RIPE y APNIC tienen servicios RESTful que funcionan. LACNIC devuelve un 503 y AfriNIC aparentemente no tiene tal API. (Sin embargo, todos tienen servicios en línea).

Eso le proporcionará la dirección del propietario registrado de la IP, pero no la ubicación de su cliente, debe obtenerla de ellos y también debe solicitarla. Además, los proxies son la menor de sus preocupaciones al validar la IP que cree que es el creador.

Las personas no aprecian la noción de que están siendo rastreados, así que, según creo, obténgalo de su cliente directamente y con su permiso, y esperan que se resista a la idea.


8

Mire la API de hostip.info: proporciona mucha información.
Ejemplo en PHP:

$data = file_get_contents("http://api.hostip.info/country.php?ip=12.215.42.19");
//$data contains: "US"

$data = file_get_contents("http://api.hostip.info/?ip=12.215.42.19");
//$data contains: XML with country, lat, long, city, etc...

Si confía en hostip.info, parece ser una API muy útil.


1
sin en comparación con otros servicios HostIP es waaaay fuera .. www.ip-adress.com sin embargo, que las uñas
de Scott Evernden

8

El servicio en la respuesta de Ben Dowling ha cambiado, por lo que ahora es más simple. Para encontrar la ubicación, simplemente haga:

// no need to pass ip any longer; ipinfo grabs the ip of the person requesting
$details = json_decode(file_get_contents("http://ipinfo.io/"));
echo $details->city; // city

Las coordenadas regresan en una sola cadena como '31, -80 ', por lo que desde allí simplemente:

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude

44
Tiene razón en que ipinfo.io devolverá los detalles de la IP de la persona que llama de forma predeterminada. Sin embargo, si está ejecutando un sitio web PHP que será la IP de su servidor, en lugar de la IP del usuario. Esa es la razón por la que necesita pasar $ _SERVER ['REMOTE_ADDR']. Si solo desea coordenadas, será más rápido agregar / ubicar a la URL para obtener también ese campo.
Ben Dowling

Ah, eso es verdad! Y no sabía sobre el / loc, lo arreglaré de inmediato en mi propio sitio.
Isaac Askew

7

Suponiendo que desea hacerlo usted mismo y no depender de otros proveedores, IP2Nation proporciona una base de datos MySQL de las asignaciones que se actualizan a medida que los registros regionales cambian las cosas.


Estaba usando un servicio externo y de repente mi sitio web se volvió muy lento. El servicio externo tardó 20 segundos en enviar la información, lo que obviamente es desastroso para los visitantes. Así que decidí hacerlo yo mismo, y esta es una solución perfecta. Muchas gracias.
Williamz902

7

Ejecuto el servicio en IPLocate.io , que puede conectar de forma gratuita con una simple llamada:

<?php
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8');
$res = json_decode($res);

echo $res->country; // United States
echo $res->continent; // North America
echo $res->latitude; // 37.751
echo $res->longitude; // -97.822

var_dump($res);

El $resobjeto contendrá sus campos de geolocalización como country, city, etc.

Consulte los documentos para obtener más información.


7

Me gusta la GeoLite City gratuita de Maxmind, que funciona para la mayoría de las aplicaciones y desde la cual puede actualizar a una versión paga si no es lo suficientemente precisa. Se incluye una API PHP , así como para otros idiomas. Y si está ejecutando Lighttpd como servidor web, incluso puede usar un módulo para obtener la información en la variable SERVER para cada visitante si eso es lo que necesita.

Debo agregar que también hay un Geolite Country gratuito (que sería más rápido si no necesita identificar la ciudad de la que proviene la IP) y Geolite ASN (si desea saber quién posee la IP) y que finalmente todos estos son descargables en su propio servidor, se actualizan todos los meses y son bastante rápidos de buscar con las API proporcionadas, ya que indican "miles de búsquedas por segundo".


1
Puede considerar el IP2Location LITE lite.ip2location.com que es gratuito. Tiene hasta información de código postal que es muy útil.
Michael C.

6

PHP tiene una extensión para eso.

Desde PHP.net:

La extensión GeoIP le permite encontrar la ubicación de una dirección IP. La ciudad, el estado, el país, la longitud, la latitud y otra información, como el ISP y el tipo de conexión, se pueden obtener con la ayuda de GeoIP.

Por ejemplo:

$record = geoip_record_by_name($ip);
echo $record['city'];

3
Este es solo un módulo php para la base de datos MaxMind, que es payware. (Las versiones "lite" gratuitas son muy inexactas). No digo que sea algo malo, pero en realidad solo es útil para fines comerciales.
Alguien

6

Ipdata.co es una API de geolocalización IP rápida y de alta disponibilidad con un rendimiento confiable.

¡Es extremadamente escalable con 10 puntos finales alrededor del mundo, cada uno capaz de manejar> 10,000 solicitudes por segundo!

Esta respuesta utiliza una clave API 'prueba' que es muy limitada y solo está destinada a probar algunas llamadas. Regístrese para obtener su propia clave API gratuita y obtenga hasta 1500 solicitudes diarias de desarrollo.

En php

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->latitude;
37.751

Aquí hay un ejemplo del lado del cliente que muestra cómo obtendría el país, la región y la ciudad;

$.get("https://api.ipdata.co?api-key=test", function (response) {
	$("#response").html(JSON.stringify(response, null, 4));
  $("#country").html('Country: ' + response.country_name);
  $("#region").html('Region ' + response.region);
  $("#city").html('City' + response.city);  
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="country"></div>
<div id="region"></div>
<div id="city"></div>
<pre id="response"></pre>

Descargo de responsabilidad;

Yo construí el servicio.

Para ver ejemplos en varios idiomas, consulte los documentos

Consulte también este análisis detallado de las mejores API de geolocalización IP.


5

En caso de que alguien se tope con este hilo, aquí hay otra solución. En timezoneapi.io puede solicitar una dirección IP y obtener varios objetos a cambio (he creado el servicio). Fue creado porque necesitaba saber en qué zona horaria estaban mis usuarios, en qué parte del mundo y qué hora es actualmente.

En PHP: devuelve ubicación, zona horaria y fecha / hora:

// Get IP address
$ip_address = getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_X_FORWARDED') ?: getenv('HTTP_FORWARDED_FOR') ?: getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR');

// Get JSON object
$jsondata = file_get_contents("http://timezoneapi.io/api/ip/?" . $ip_address);

// Decode
$data = json_decode($jsondata, true);

// Request OK?
if($data['meta']['code'] == '200'){

    // Example: Get the city parameter
    echo "City: " . $data['data']['city'] . "<br>";

    // Example: Get the users time
    echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";

}

Usando jQuery:

// Get JSON object
$.getJSON('https://timezoneapi.io/api/ip', function(data){

    // Request OK?
    if(data.meta.code == '200'){

        // Log
        console.log(data);

        // Example: Get the city parameter
        var city = data.data.city;
        alert(city);

        // Example: Get the users time
        var time = data.data.datetime.date_time_txt;
        alert(time);

    }

});

4

La siguiente es una versión modificada de un fragmento que encontré que usa http://ipinfodb.com/ip_locator.php para obtener su información. Tenga en cuenta que también puede solicitar una clave de API con ellos y usar la API directamente para obtener la información proporcionada como mejor le parezca.

Retazo

function detect_location($ip=NULL, $asArray=FALSE) {
    if (empty($ip)) {
        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']; }
    }
    elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
        $ip = '8.8.8.8';
    }

    $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
    $i = 0; $content; $curl_info;

    while (empty($content) && $i < 5) {
        $ch = curl_init();
        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 1,
            CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
        );
        if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
        curl_setopt_array($ch, $curl_opt);
        $content = curl_exec($ch);
        if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
        curl_close($ch);
    }

    $araResp = array();
    if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
    if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
    if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
    if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
    if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
    if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
    if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
    if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);

    $strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';

    return $asArray ? $araResp : $strResp;
}

Usar

detect_location();
//  returns "CITY, STATE" based on user IP

detect_location('xxx.xxx.xxx.xxx');
//  returns "CITY, STATE" based on IP you provide

detect_location(NULL, TRUE);    //   based on user IP
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

detect_location('xxx.xxx.xxx.xxx', TRUE);   //   based on IP you provide
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

4

Si necesita obtener la ubicación de una dirección IP, puede usar un servicio de geo ip confiable, puede obtener más detalles aquí . Es compatible con IPv6.

Como beneficio adicional, permite verificar si la dirección IP es un nodo tor, proxy público o spammer.

Puede usar javascript o php como se muestra a continuación.

Código Javascript:

$(document).ready(function () {
        $('#btnGetIpDetail').click(function () {
            if ($('#txtIP').val() == '') {
                alert('IP address is reqired');
                return false;
            }
            $.getJSON("http://ip-api.io/json/" + $('#txtIP').val(),
                 function (result) {
                     alert('City Name: ' + result.city)
                     console.log(result);
                 });
        });
    });

Código Php:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);

Salida:

{
"ip": "64.30.228.118",
"country_code": "US",
"country_name": "United States",
"region_code": "FL",
"region_name": "Florida",
"city": "Fort Lauderdale",
"zip_code": "33309",
"time_zone": "America/New_York",
"latitude": 26.1882,
"longitude": -80.1711,
"metro_code": 528,
"suspicious_factors": {
"is_proxy": false,
"is_tor_node": false,
"is_spam": false,
"is_suspicious": false
}

3

He creado un contenedor para ipinfo.io . Puedes instalarlo usando Composer.

Puedes usarlo de esta manera:

$ipInfo = new DavidePastore\Ipinfo\Ipinfo();

//Get all the properties
$host = $ipInfo->getFullIpDetails("8.8.8.8");

//Read all the properties
$city = $host->getCity();
$country = $host->getCountry();
$hostname = $host->getHostname();
$ip = $host->getIp();
$loc = $host->getLoc();
$org = $host->getOrg();
$phone = $host->getPhone();
$region = $host->getRegion();

2

También puede usar el servicio "smart-ip":

$.getJSON("http://smart-ip.net/geoip-json?callback=?",
    function (data) {
        alert(data.countryName);
        alert(data.city);
    }
);

2

He realizado muchas pruebas con los servicios de direcciones IP y aquí hay algunas formas en que lo hago yo mismo. Primero, un montón de enlaces a sitios web útiles que uso:

https://db-ip.com/db Tiene un servicio gratuito de búsqueda de IP y tiene algunos archivos csv gratuitos que puede descargar. Utiliza una clave de API gratuita que se adjunta a su correo electrónico. Limita a 2000 consultas por día.

http://ipinfo.io/ Servicio gratuito de búsqueda de ip sin funciones de PHP de clave API:

//uses http://ipinfo.io/.
function ip_visitor_country($ip){
    $ip_data_in = get_web_page("http://ipinfo.io/".$ip."/json"); //add the ip to the url and retrieve the json data
    $ip_data = json_decode($ip_data_in['content'],true); //json_decode it for php use

    //this ip-lookup service returns 404 if the ip is invalid/not found so return false if this is the case.
    if(empty($ip_data) || $ip_data_in['httpcode'] == 404){
        return false;
    }else{
        return $ip_data; 
    }
}

function get_web_page($url){
    $user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';

    $options = array(
        CURLOPT_CUSTOMREQUEST  =>"GET",        //set request type post or get
        CURLOPT_POST           =>false,        //set to GET
        CURLOPT_USERAGENT      => $user_agent, //set user agent
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    );
    $ch = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    $httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
    curl_close( $ch );  
    $header['errno']   = $err; //curl error code
    $header['errmsg']  = $errmsg; //curl error message
    $header['content'] = $content; //the webpage result (In this case the ip data in json array form)
    $header['httpcode'] = $httpCode; //the webpage response code
    return $header; //return the collected data and response codes
}

Al final obtienes algo como esto:

Array
(
    [ip] => 1.1.1.1
    [hostname] => No Hostname
    [city] => 
    [country] => AU
    [loc] => -27.0000,133.0000
    [org] => AS15169 Google Inc.
)

http://www.geoplugin.com/ Un poco más antiguo, pero este servicio le brinda un montón de información adicional útil, como la moneda del país, el código del continente, la longitud y más.


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Ofrece un montón de archivos descargables con instrucciones para importarlos a su base de datos. Una vez que tenga uno de estos archivos en su base de datos, puede seleccionar los datos con bastante facilidad.

SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to

Use la función php ip2long (); convertir la dirección IP en un valor numérico. Por ejemplo, 1.1.1.1 se convierte en 16843009. Esto le permite buscar los rangos de IP que le proporciona el archivo de base de datos.

Entonces, para saber dónde pertenece 1.1.1.1, todo lo que hacemos es ejecutar esta consulta:

SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;

Esto devuelve estos datos como un ejemplo.

FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809

2

Existen dos enfoques generales para realizar la geolocalización de IP: uno es descargar un conjunto de datos, alojarlo en su infraestructura y mantenerlo actualizado. Esto requiere tiempo y esfuerzo, especialmente si necesita admitir una gran cantidad de solicitudes. Otra solución es utilizar un servicio API existente que gestione todo el trabajo por usted y más.

Existen muchos servicios de geolocalización API: Maxmind, Ip2location, Ipstack, IpInfo, etc. Recientemente, la empresa para la que trabajo se ha cambiado a Ipregistry ( https://ipregistry.co ) y participé en el proceso de decisión e implementación. Estos son algunos elementos que debe considerar al buscar una API de geolocalización IP:

  • ¿El servicio es exacto? ¿Están utilizando una sola fuente de información?
  • ¿Pueden realmente manejar su carga?
  • ¿Proporcionan tiempos de respuesta consistentes y rápidos en todo el mundo (excepto si sus usuarios son específicos del país)?
  • ¿Cuál es su modelo de precios?

Aquí hay un ejemplo para obtener información de geolocalización de IP (pero también datos de amenazas y de agente de usuario mediante una llamada):

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;

Nota: No estoy aquí para promover Ipregistry y decir que es lo mejor, pero pasé mucho tiempo analizando las soluciones existentes y su solución es realmente prometedora.


-1

Si está buscando una base de datos actualizada / precisa, le recomiendo usar esta aquí porque mostraba mi ubicación exacta que no estaba incluida en muchos otros servicios cuando estaba probando.
(Mi ciudad era Rashty mi país tenía Iranesta dirección IP: 2.187.21.235cuando estaba probando).

Recomiendo usar la base de datos en lugar de los métodos API, porque se procesará mucho más rápido localmente.


-1

Ok chicos, gracias por sus sugerencias; Si bien tengo 6k + de IP, algunos servicios fallaron mis solicitudes debido a algunas limitaciones; Por lo tanto, puede usarlos todos en modo de reserva;

Si tenemos un archivo fuente con el siguiente formato:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

de lo que podría usar este simple comando de expansión (PoC) para Yii:

class GeoIPCommand extends CConsoleCommand
{

public function actionIndex($filename = null)
{
    //http://freegeoip.net/json/{$ip} //10k requests per hour
    //http://ipinfo.io/{$ip}/json //1k per day
    //http://ip-api.com/json/{$ip}?fields=country,city,regionName,status //150 per minute

    echo "start".PHP_EOL;

    $handle      = fopen($filename, "r");
    $destination = './good_locations.txt';
    $bad         = './failed_locations.txt';
    $badIP       = [];
    $goodIP      = [];

    $destHandle = fopen($destination, 'a+');
    $badHandle  = fopen($bad, 'a+');

    if ($handle)
    {
        while (($line = fgets($handle)) !== false)
        {
            $result = preg_match('#(\d+)\s+(\d+\.\d+\.\d+\.\d+)#', $line, $id_ip);
            if(!$result) continue;

            $id = $id_ip[1];
            $ip = $id_ip[2];
            $ok = false;

            if(isset($badIP[$ip])) 
            {
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                continue;
            }

            if(isset($goodIP[$ip]))
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]);
                continue;
            }

            $query = @json_decode(file_get_contents('http://freegeoip.net/json/'.$ip));
            $city = property_exists($query, 'region_name')? $query->region_name : '';
            $city .= property_exists($query, 'city') && $query->city && ($query->city != $city) ? ', ' . $query->city : '';

            if($city)
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                $ok = true;
            }

            if(!$ok)
            {
                $query = @json_decode(file_get_contents('http://ip-api.com/json/'. $ip.'?fields=country,city,regionName,status'));
                if($query && $query->status == 'success')
                {
                    $city = property_exists($query, 'regionName')? $query->regionName : '';
                    $city .= property_exists($query, 'city') && $query->city ? ',' . $query->city : '';

                    if($city)
                    {
                        fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                        echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                        $ok = true;
                    }
                }
            }

            if(!$ok)
            {
                $badIP[$ip] = false;
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, 'Unknown');
            }

            if($ok)
            {
                $goodIP[$ip] = $city;
            }
        }

        fclose($handle);
        fclose($badHandle);
        fclose($destHandle);
    }else{
        echo 'Can\'t open file' . PHP_EOL; 
        return;
    }

    return;
}

}

Este es algún tipo de código de mierda, pero funciona. uso:

./yiic geoip index --filename="./source_id_ip_list.txt"

Siéntase libre de usarlo, modificarlo y hacerlo mejor)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.