Tutorial: Cómo hacer un simple geolocalizador para detectar países y ciudades en PHP

  • Autor Autor Alan98
  • Fecha de inicio Fecha de inicio
A

Alan98

Beta
Social Media
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola usuarios de Forobeta.

Tenía ganas de hacer algún aporte a esta comunidad que me ha dado mucho, y como es el único lugar por el que ando (por suerte), es exclusiva acá en forobeta porque no la he publicado en ningún lugar más 🙂

PHP:
<?php

/*
 *
 * Script de geolocalización
 * @author Alan98 (http://forobeta.com/member.php?u=35459)
 *
 */

// Primero obtenemos la IP real del visitante
$realip = (!empty($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']));
// Comprobamos si está disponible cURL, que es más rápido que file_get_contents
if(function_exists('curl_init')){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9) Gecko/2008052906 Firefox/3.0');
    curl_setopt($ch, CURLOPT_URL, 'http://api.codehelper.io/ips/?php&ip='.$realip);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);
} else {
    $data = file_get_contents('http://api.codehelper.io/ips/?php&ip='.$realip);
}

// Parseamos la respuesta JSON
$data = json_decode($data, 1);
// Imprimimos la información al cliente
echo 'Tu pa&iacute;s: <b>',$data['CountryName'],'</b>, tu c&oacute;digo de pa&iacute;s: <b>',$data['Country'],'</b>, tu regi&oacute;n: <b>',$data['RegionName'],'</b>, tu ciudad: <b>',$data['CityName'],'</b>.';

Ahí tienen, si quieren utilizarla para redireccionarla por ejemplo a alguna URL del país de su web comprobando que el país esté disponible en el array pueden hacer así:

PHP:
// Países disponibles
$ava = array('AR', 'MX', 'ES');
// En caso de estar entre el array, realizamos redirección
if(in_array($data['Country'], $ava)) die(header('Location: http://tuweb.com/'.strtolower($data['Country'])));

Ahí comprobará si el país desde el que el cliente ingresa está dentro del array (en este caso Argentina, México y España) será redireccionado a una carpeta de su web que tenga ese código de país en minúsculas. Si tienen alguna duda déjenme un comentario o un MP y los ayudaré a aclararla. Si quieren utilizarla sólo para la información sin imprimir la información, sólo borran el echo y hacen un include así:
PHP:
require 'geoip.php';
y accederán a los datos con la misma variable


Demo: http://clanpirata.com.ar/geoip.php

Descarga: https://www.mediafire.com/?03u58dt2n0v1e0x



Un saludo :encouragement:
 
Aportazo, muchas gracias :star2:
Cada vez que veo aportes así de buenos me recuerdo que también debo aprender a programar.
 
Gracias buen aporte, solo es cuestión de creatividad para que de resultado de imagen mostrando la bandera.
 
Gracias buen aporte, solo es cuestión de creatividad para que de resultado de imagen mostrando la bandera.

Eso es fácil, sólo sería cuestión de cambiar el echo por este:
PHP:
echo 'Tu pa&iacute;s: <b>',$data['CountryName'],'</b> <img src="http://geoiptool.com/flags/',strtolower($data['Country']),'.gif" />, tu c&oacute;digo de pa&iacute;s: <b>',$data['Country'],'</b>, tu regi&oacute;n: <b>',$data['RegionName'],'</b>, tu ciudad: <b>',$data['CityName'],'</b>.';
 
El demo me manda a otro lado 😕 pero igual buen aporte.
 
El demo me manda a otro lado 😕 pero igual buen aporte.

Estaba probando lo del código de redirección y olvidé quitarlo 😕 prueba ahora :topsy_turvy:
 
Gracias por el aporte, andaba en busca de esto 🙂
 
Si me funciona pero no me sale la ciudad ¿Sabes por qué?
 
Si funciona pero me sale otra ciudad, igual buen aporte estaba necesitando esto para una redireccion por pais! Muchas Gracias!!! A favoritos!
 
Donde puedo ver la lista de los códigos de países? Necesito hacer un condicional y no sé si la lista de los códigos de países será la misma.

- AR = Argentina?
- MX = México?
- UY = Uruguay?
- CL = Chile?
- PA = Panamá?
- EC = Ecuador?

Podrías confirmarme si esta bien?

Aún así voy a intentar, ya que me haz salvado de una muy grande jeje :encouragement:
 
Son correctos :encouragement:
Códigos ISO países
Desde ahí podés ver el listado de códigos ISO de países
Sólo pones
PHP:
if($data['Country'] === 'AR') { *do* }
y ya está, o sino utilizando un array para poner varios países como expliqué en el tema 🙂
 

Conoces Google?
Let me google that for you

----------------------------
Muy bueno el tutorial, pero igual me sale una ciudad diferente.
 
Conoces Google?
Let me google that for you

----------------------------
Muy bueno el tutorial, pero igual me sale una ciudad diferente.

No sé mucho sobre el tema, pero es por la ip que tienes.

Por ejemplo, yo estoy en tijuana, pero en mi lap tengo la ip o la puerta de enlace de Mexicali, y en el demo que deja el compañero, dice que mi localización es MEXICALI, siendo que estoy en tijuana.

De hecho, muy buen aporte.

Gracias
 
Lo de las ciudades nunca es 100% correcto, varía según el proveedor de servicios, creo que ni el geolocalizador del mismo google detecta la ciudad correctamente en todos los proveedores 😕
 
Se agradece el aporte, muy bueno :encouragement:
 
Es necesario depender del sitio codehelper.io?


Recuerdo hace tiempo que existía una base de datos en la que se comparaban las IP, y obtenías estos datos sin tener que recurrir a peticiones de sitios con dudosa reputación (Con su respectivo Overhead).
 
En septiembre publiqué una respuesta donde también se utilizaba ese sitio para lo mismo, y por lo visto aún sigue funcionando. Hay un enlace en la respuesta donde se puede ver las diferentes formas de utilizar la API (JavaScript, PHP, etc). Es algo sencillo y fácil de hacer, pero cada cual lo puede hacer a su manera.

Yo lo he utilizado más para las zonas horarias, pues aunque la ciudad pueda variar dependiendo del proveedor de Internet, la zona horaria suele ser la correcta al ser la misma en varias ciudades.

Por mi parte agradecer a Alan98 que lo haya compartido 🙂
 
Última edición:
Igual es un buen aporte amigo :encouragement:
Lo de las ciudades nunca es 100% correcto, varía según el proveedor de servicios, creo que ni el geolocalizador del mismo google detecta la ciudad correctamente en todos los proveedores 😕