Para redireccionar a un usuario según sea su pais de procedencia (bueno .. ya sabemos que los servidores desde donde se conectan los usuarios no son 100% fiables .. pero es la unica forma que tenemos de saberlo), utilizamos el api de hostip.info y cargamos el xml que nos dan.
Actualización (2017-06-14): El url api.hostip.info no está devolviendo nada. Buscaré otro api para actualizar el post.
Para ello hemos definido la siguiente función:
function getPaisProcedencia(){
$salida = »;
$IPADDRESS = $_SERVER[«REMOTE_ADDR»];
$archivo_xml = «http://api.hostip.info/get_xml.php?ip=».$IPADDRESS .»»;
$procedencia_xml = get_url_contents ($archivo_xml);
if (empty($procedencia_xml)){
$salida = »;
}else{
preg_match_all(«|<Hostip>(.*)</Hostip>|sU», $procedencia_xml, $items);
$lista_nodos = array();
foreach ($items[1] as $key => $item)
{
//preg_match(«|<gml:name>(.*)</gml:name>|s», $item, $mi_lugar);
//preg_match(«|<countryName>(.*)</countryName>|s», $item, $mi_pais);
preg_match(«|<countryAbbrev>(.*)</countryAbbrev>|s», $item, $mi_sigla);
$salida = $mi_sigla[1];
}
$procedencia_xml = «»;
}
return $salida;
}
En esta función hemos utilizado la función get_url_contents descrita en un post anterior sobre optimizacion de file_get_contents en php.
Podemos sacar mucha información del xml de este API http://api.hostip.info/get_xml.php?ip=200.147.3.156
<HostipLookupResultSet version=»1.0.1″ xsi:noNamespaceSchemaLocation=»http://www.hostip.info/api/hostip-1.0.1.xsd»>
<gml:description>This is the Hostip Lookup Service</gml:description>
<gml:name>hostip</gml:name>
−
<gml:boundedBy>
<gml:Null>inapplicable</gml:Null>
</gml:boundedBy>
−
<gml:featureMember>
−
<Hostip>
<ip>200.147.3.156</ip>
<gml:name>(Unknown city)</gml:name>
<countryName>BRAZIL</countryName>
<countryAbbrev>BR</countryAbbrev>
<!– Co-ordinates are unavailable –>
</Hostip>
</gml:featureMember>
</HostipLookupResultSet>
El nodo sobre el que hemos realizado las comprobaciones es countryAbbrev aunque se podría utilizar countryName, aunque siempre vamos a usar menos recursos si comparamos abreviaturas que cadenas de nombres más largas.
Ojo, esta función no es recomendable utilizarla cada vez que tenemos una hit .. ya que ralentizaría nuestra maquina de manera injustificada. Asi que lo que recomiendo es utilizarla unicamente en la primera visita a nuestra web. Esto lo podemos controlar con sesiones, cookies, referer, etc … nosotros hemos utilizado el referer del usurio aunque otras opciones serían igualmente válidas.
Hola david, estube intentando correr tu funcion pero me da un par de errores, estoy utilizando dreamweaver 8 pero dudo que tenga algo que ver, solucione uno de unas comillas pero ahora me sale este
«Parse error: syntax error, unexpected ‘<' in C:\Users\leo\Documents\Current\unificacion de transporte\wosportable\www\Nuevo Transporte\pais.php on line 23
"
como ves estoy usando el wos, la funcion la puse en en pais.php y luego la inclui en mi pagina principal
esto es lo que dice la linea 23: "preg_match_all(“|(.*)|sU”, $procedencia_xml, $items);»
creo que esta bien, de cualqueir forma el mi objetivo es restringir el paso a mi pagina a aquellos usuarios que no vengan de mi pais (venezuela).. si conoces algun codigo para esto o como arreglar el tuyo me ayudarias mucho :).. de cualquier manera gracias
HOla Leo, cuidado con las comillas, que wordpress pone algunas como dobles cuando son simples y viceversa, y eso es lo que te está fallando.
He dejado una copia de esa funcion en http://blogdavidrodriguez.piensaennaranja.com/otros/paisProcedencia.rar
Espero te sirva.
Un saludo,
DAvid Rodriguez
hola, me gustaria saber como puedo introducir un codigo en la entrada de mi blog que redireccione a otra url segun el pais del visitante, me gustaria saber lo que tengo que poner.
Hla, he probado su archivo pero no me devuelve nada, ejecuto la funcion pero no hay salida…???
Parece ser que el xml del api de hostip.info ya no funciona. Buscaré algún otro api para actualizarlo.