11th jul 2009
Mostrando o potencial da JS Calls PHP #5 – geolocalização
Fazia muito tempo que não postava nada sobre a JS Calls PHP – muito trabalho, pouco tempo livre… coisas da vida.
Aproveitei um tempinho livre nesse sábado para integrar uma classe que vi de geolocalização com a biblioteca, possibilitando que sejam retornados dados como cidade e estado relativos a um IP via javascript, requisitando assincronamente uma classe PHP.
Veja aqui uma página de exemplo!
A classe original pode ser baixada aqui, só tive que fazer algumas modificações na mesma, conforme o código abaixo:
<?php
include 'PHP45.XML.php';
class GeoLocalizacao {
// XML document
var $doc = null;
// string describing the host of the geo location service
var $host = "http://api.hostip.info/?ip=<IP>";
// string describing the city
public $city = 'unknown';
// string describing the country
public $country = 'unknown';
// longitude
public $longitude = '0';
// latitude
public $latitude = '0';
public function __construct() {
}
public function geoLocation($ip) {
$this->doc = new PHP45XML();
$this->doc->preserveWhiteSpace = false;
// prepare url of service
$host = str_replace( "<IP>", $ip, $this->host);
$reply = $this->fetch($host);
// decode the reply and make it available
//echo $reply;
//return false;
$this->decode($reply);
return array("city"=>$this->city, "country"=>$this->country, "lng"=>$this->longitute, "lat"=>$this->latitude);
}
function fetch($host) {
$reply = 'error';
// try curl or fopen
if( function_exists('curl_init') ) {
// use curl too fetch site
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL , $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$reply = curl_exec($ch);
curl_close ($ch);
} else {
// fall back on fopen
$reply = file_get_contents($host, 'r');
}
return $reply;
}
function decode($text) {
// load in php version independent manner
$this->doc->loadXML($text);
// use the PHP4/5 XML wrapper to decode the result
$result = $this->doc->xpath("//gml:name");
$this->city = $result['city'];
$this->country = $result['country'];
$this->longitude = $result['lng'];
$this->latitude = $result['lat'];
}
}
?>
Essa classe utiliza a API do site http://api.hostip.info, que passando um endereço IP retorna um XML com as informações. A classe trata esses dados e retorna um array com as chaves/valores para cidade, estado, longitude e latitude.
Depois de expor essa classe no config.php (conforme explicado na documentação oficial) sob o nome geo, o único trabalho foi fazer um html que chama o método geoLocation passando o valor de um input como parâmetro, e no retorno dou um alert exibindo a cidade e o estado.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>IP</title>
<script type="text/javascript" src="../engine.js"></script>
<script type="application/javascript" src="../interface/geo.js"></script>
<script type="application/javascript">
window.onload = function() {
document.getElementById("submit").onclick = function() {
var ip = document.getElementById("ip").value;
geo.geoLocation(ip, function(myIp) {
alert("cidade: " + myIp.city + "\npaís: " + myIp.country);
})
}
}
</script>
</head>
<body>
Digite um endereço de IP para ver qual a cidade e país de origem:
<input type="text" name="ip" id="ip" />
<input type="button" value="checar" id="submit" />
</body>
</html>
Funcionamento simples, como sempre, com a JS Calls PHP!
Faça download da JS Calls PHP aqui

Esta coisa não parece funcionar muito bem nao.
Olhas oque ela apresenta:
cidade: (Unknown City?)
país: (Unknown Country?)
Alex, eu testei com os IPs do UOL (200.221.2.45) e do Terra (200.176.3.142) e funcionou certinho; pro UOL deu São Paulo/Brazil, pro Terra de Porto Alegre/Brazil
Testei agora com o do Google (66.102.1.103) e deu Mountain View,CA/USA
Mas, assim, não posso afirmar que a classe PHP em si está funcionando totalmente, pois como falei no post ela é de terceiros e usa uma outra API; o que quis mostrar, no exemplo, é a integração da JS Calls PHP com classes de terceiros!
[]s!
Eu tinha colocado o meu IP e não deu.