Inicio Apuntes FPApuntes DAMLocalizar una IP con el servicio ip-api y un poco de PHP

Localizar una IP con el servicio ip-api y un poco de PHP

Un servicio gratuito

Publicado por entreunosyceros

AVISO: Esta entrada tiene más de dos años desde su publicación. Es posible que el contenido esté desactualizado.

Una vez más aquí. Hoy vengo a dejar un pequeño código que un usuari@ me ha pedido estos días. Se trata de un pequeño código con el que cualquier interesado podra localizar la ubicación de una IP utilizando un servicio online. Para este pequeño ejercicio vamos a utilizar el servicio ip-api, que no sé si será el mismo que este usuari@ quería, pero vamos, la función es la misma. Además, est@ usuari@, tan solo me dijo necesitaba conseguirlo usando PHP … vaya usted a saber por qué …

Bueno, pues el caso es que como digo, haciendo uso del servicio de ip-api y de Leaflet, además de un poco de PHP, cURL, jQuery, HTML y CSS, vamos a crear un pequeño formulario en el que si el interesado escribe una IP, el servicio nos devolverá cierta información sobre esta IP. Además de que la ubicarla en un mapa.

Ni que decir tiene, que la ubicación no nos va a llevar hasta la casa del usuario que utiliza la IP, ya que para eso sería necesario disponer de ciertos recursos que con los que conseguir algunos datos, que los recursos gratuitos no ofrecen. Además de que ubicar en un domicilio una IP, posiblemente sea ilegal en la mayoría de los países (al menos sin la orden de un juez).

Por si alguien no lo sabe, hay que decir la biblioteca con la que vamos a generar el mapa, llamada Leaflet, es una biblioteca JavaScript para desarrollar aplicaciones de mapas interactivos. Esta ofrece un conjunto de herramientas para crear mapas personalizados, marcadores, polígonos, líneas, pop-ups, entre otras características. Es fácil de usar y se integra con otras bibliotecas y servicios de mapas como OpenStreetMap, Mapbox y Google Maps. Además, es gratis y de código abierto.

El código para localizar una IP

localizar una IP en OpenStreetMaps

Una vez que tenemos todo lo anterior claro, ya podemos empezar a ver el código del proyecto. Este proyecto lo vamos a recudir a 2 archivos. El primero será un archivo index.php y el segundo será un archivo al que llamaremos ip.php.

Archivo index.php

Este archivo incluye una página HTML que contiene un formulario para ingresar una dirección IP y un botón de «Consultar«. Cuando se envía el formulario, se realiza una petición AJAX a un archivo «ip.php» pasando la dirección IP ingresada como parámetro. El archivo ip.php procesa la petición y devuelve una respuesta, que es insertada en un elemento HTML con id «result-data». Luego se abre una ventana modal (utilizando la librería jQuery modal) mostrando la respuesta obtenida.

formulario de consulta IP

En este archivo, también se incluyen varios enlaces a hojas de estilo y scripts externos. Se carga la librería de javascript leaflet, la cual permite crear mapas interactivos, también se carga la librería jQuery y jQuery Modal para manejar el modal.

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.1/jquery.modal.min.css" />
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css" integrity="sha256-kLaT2GOSpHechhsozzB+flnD+zUyjE2LlfWPgU04xyI=" crossorigin="" />
    <title>Consulta de ubicación de una IP</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.1/jquery.modal.min.js"></script>
    <script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js" integrity="sha256-WBkoXOwTeyKclOHuWtc+i2uENFpDZ9YPdf5Hf+D7ewM=" crossorigin=""></script>
</head>
<body>
    <h1>Consulta de ubicación de una dirección IP</h1>
    <form method="POST" action="" id="form-ip">
        <label for="ip">Escribe aquí la dirección IP:</label>
        <input type="text" name="ip" id="ip" required>
        <input type="submit" value="Consultar">
    </form>
    <div id="result"></div>
    <!-- Modal -->
    <div class="modal fade" id="modalResult" tabindex="-1" role="dialog" aria-labelledby="modalResultLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h4 class="modal-title" id="modalResultLabel">Resultado de la consulta</h4>
                </div>
                <div class="modal-body">
                    <div id="result-data"></div>
                </div>
            </div>
        </div>
    </div>
    <script>
        $(document).ready(function(){
            $('#form-ip').submit(function(e){
                e.preventDefault();
                //Obtener los datos del formulario y enviar la petición ajax
                var ip = $('#ip').val();
                $.ajax({
                    url: 'ip.php',
                    type: 'POST',
                    data: {ip: ip},
                    success: function(response){
                        //Mostrar los datos en la ventana modal
                        $('#result-data').html(response);
                        //Abrir la ventana modal
                        $('#modalResult').modal();
                    }
                });
            });
        });
    </script>
</body>
</html>

El archivo ip.php

El código que vamos a ver en este archivo, es un script de PHP. Este se encarga de recibir una dirección IP en un formulario y luego utiliza cURL para hacer una petición HTTP a la API «ip-api.com». El objetivo de esta petición es obtener información geográfica sobre la dirección IP especificada por el usuario.

Una vez obtenida la respuesta, se decodifica el contenido en formato JSON y se extraen los datos relevantes para mostrar al usuario. Por último, si se reciben datos válidos de latitud y longitud, se utiliza la librería «Leaflet» para mostrar un mapa en el navegador con la ubicación de la dirección IP especificada.

<?php
if(isset($_POST['ip'])){
    $ip = $_POST['ip'];
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => "http://ip-api.com/json/{$ip}",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);
    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        $data = json_decode($response, true);
        echo "La IP: <b>".$ip."</b> se puede situar en: <br/>";
        echo "<p><ul>";
        echo "<li>País: ".$data['country'] . "</li><br/>";
        echo "<li>Región: ".$data['regionName'] . "</li><br/>";
        echo "<li>Ciudad: ".$data['city'] . "</li><br/>";
        echo "<li>Código Postal: ".$data['zip'] . "</li><br/>";
        echo "<li>Latitud: ".$data['lat'] . "</li><br/>";
        echo "<li>Logintud: ".$data['lon'] . "</li><br/>";
        echo "</ul></p>";
        echo "<hr/>";
        $lat = $data['lat'];
        $lon = $data['lon'];
        if (!empty($lat) && !empty($lon)) {
        echo "<div id='map' style='width: 100%; height: 400px;'></div>";
        echo "<script>";
        echo "var map = L.map('map').setView([".$lat.", ".$lon."], 10);";
        echo "L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {";
        echo "attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'";
        echo "}).addTo(map);";
        echo "var marker = L.marker([".$lat.", ".$lon."]);";
        echo "marker.addTo(map);";
        echo "L.DomEvent.on(window, 'resize', function() {";
        echo "map.invalidateSize();";
        echo "});";
        echo "</script>";
        }
    }
    
}
?>

Y bueno, una vez guardados los archivos, solo queda ejecutar el archivo index.php en nuestro servidor para ver los resultados. Se puede ver este ejemplo funcionando en el siguiente enlace.

También te puede interesar ...

Deja un comentario

* Al utilizar este formulario, aceptas que este sitio web almacene y maneje tus datos.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Resumen de privacidad
cookies entreunosyceros

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible.

La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudarnos a comprender qué secciones de la web encuentras más interesantes y útiles.

Nunca almacenamos información personal de ningún tipo.

Tienes toda la información sobre privacidad, derechos legales y cookies en nuestra página sobre la política de privacidad o en la página sobre nuestra política de cookies.

Cookies necesarias

Las cookies estrictamente necesarias tiene que activarse siempre para que podamos guardar tus preferencias de ajustes de cookies.

Cookies de terceros

Esta web utiliza las siguientes cookies adicionales:

- Mailchimp: Recordar si ya estás suscrito al boletín de noticias y sino ofrecértelo al salir.

- Accesibilidad: Para saber tus ajustes de accesibilidad en cada visita.

- Comentarios: Saber si has leído y aceptado nuestra política de privacidad a la hora de dejar un comentario en la web.

- Google Analytics: Localización para recopilar información anónima tal como el número de visitantes del sitio, o las páginas más populares.

- Goggle Adsense: Anuncios personalizados según tu geolocalización y preferencias.

Dejar estas cookies activadas nos permite mejorar nuestra web.

Adblock Detectado!!

Ayúdanos deshabilitando la extensión AdBlocker de tu navegador para visitar esta web.
Si no sabes hacerlo en Chrome, consulta el siguiente enlace. Si utilizas Firefox, puedes consultar este otro enlace.
Esto mejorará tu experiencia en este sitio web.