GeoLocation em PHP (Geolocalização)

Opa!

Semana passada estava testando um plugin do wordpress que tem as estatísticas do blog, acontece que sempre que alguém da minha cidade conectava, ela colocava como Passo Fundo, só que moro em Lajeado. Então fui analisar o código e ver como a brincadeira é feita.

Descobri se tratar de um sistema de Geolocalização, através do IP da pessoa conetada ao site, ele consegue “obter” a sua localização. Funciona da seguinte forma: um servidor oferece um webservice, acessado por url, que retorna essa informações, eles tem uma grande base de dados, onde comparam o IP passado com a relação deles, montar essa base que não é tarefa simples.

Mas não precisamos monta-la existem muitos serviços prontos na internet que nos oferecem esse trabalho.

Então vamos aprender como conectar a um servidor, usando php puro.

Digamos que saímos no google a procura de um serviço gratuito.

Achamos nosso servidor, sua url: http://www.geoplugin.net/php.gp?ip=192.168.100.100 , onde este número o IP do qual queremos obter a localização.

Obs.: Existem muitas formas de saber o seu ip, este site é uma delas http://meuip.datahouse.com.br/.
No php para pegar o ip do visitante:

$ip = $_SERVER['REMOTE_ADDR'];

Você pode abrir esse endereço em um url que verá o resultado serializado, continuamos então:

No php fizemos um file_get_contents dessa url, isso faz com que o php conecte nesse servidor e obtem a string com o que o site retornar.

$response = file_get_contents('http://www.geoplugin.net/php.gp?ip=192.168.100.100');

Temos no $response o que é mostrado pelo navegador, percebemos ser uma string serializada. Deserializamos o conteúdo, transformando-o em código php, então fizemos um exportação para a variável array;

$array = var_export( unserialize ( $response  ), 1);

Então fizemos um eval, que executa o código php, note que isso PODE ser uma falha de segurança, permitindo que código arbitrário seja executado sem nossa requisisção, mas não nos preocupemos com isso agora.

eval( '$array = '. $array .';');

Criamos um objeto simples:

$data  = new stdClass();

E passamos o conteúdo de nosso array para ele:

$data->city   = $array['geoplugin_city'];
$data->region = $array['geoplugin_region'];
$data->country     = $array['geoplugin_countryName'];
$data->countrycode = $array['geoplugin_countryCode'];
$data->long        = $array['geoplugin_longitude'];
$data->lat         = $array['geoplugin_latitude'];

Criamos esse objeto para mostrar como acessar o resultado do vetor, dessa forma temos a localização da nosso visitante.

Ainda, podemos fazer todo o processo em uma única linha:

$data =  unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip=192.168.100.100'));

Segue anexado ao post, um código mais completo que conecta em mais uns 5 servidores diferentes.

http://trialforce.googlecode.com/svn/trunk/php/getLocation.php

Boa semana a todos.

Tagged , . Bookmark the permalink.

13 Responses to GeoLocation em PHP (Geolocalização)

  1. Guilherme says:

    Buenas camarada !
    Post realmente interessante , grato.

  2. Dá para fazer isto em uma linha sem utilizar o perigoso eval. Segue:

    $data = unserialize(file_get_contents(‘http://www.geoplugin.net/php.gp?ip=192.168.100.100′));

  3. trialforce says:

    Realmente!

    Fiz um teste e seu código realmente funciona, mas estranhamente o site não estava mais retornando a minha cidade.

    Obrigado pela atenção Angelo.

  4. Ricardo says:

    Já testei vários e nunca deu certo. Minha cidade nunca é a mesma e sempre aparece em outros estados do brasil. Por aqui apareceu como cidade vizinha a minha, que foi o mais próximo que eu encontrei. Alguém pode me explicar isto? Isto é apenas aproximado ou deveria ser real a localização?

  5. trialforce says:

    Olá Ricardo!

    Essa técnica de geolocalização é baseada no seu número de IP, eles tem uma base com registros do mundo inteiro, relacionados com cidades, ocorre que nenhum dos casos é 100% perfeito, ainda mais considerando que são serviços montados em outros países que tendem a não dar muita importância pro terceiro mundo.

    Sem contar o fato de que seu IP realmente pode ser de outra cidade/estado, dependendo do seu contrato com a prestadora de serviços.

    Como possíveis soluções:
    1. Acredito que o sistema do google funcione perfeitamente, ele não foi cobrido nesse artigo, mas não deve ser difícil de implementar.
    2. Colocar uma condição específica (if) para um range de IP da sua cidade, não deve ser muito complicado de executar também.
    3. Optar por um serviço pago, eles tendem a ser bem mais precisos, mas acredito que essa não seja uma boa opção não é??

    Se tiver mais alguma dúvida, fique a vontade para perguntar!!

    Dentro do possível responderei!

    Abraço a todos!

  6. Bom, para entender melhor o sistema de geoLocalização é preciso entender o traçado de sua rede, a rota que os seus dados fazem, e verá que realmente, muitas vezes o seu IP não é da sua cidade, e sim da central da operadora mais próxima, ou por onde passa seu provedor.

    Para isso, entender, vou ensinar como funciona o sistema realmente por dentro:
    Entenda o comando TRACERT do DOS

    vá em EXECUTAR ou RUN, digite TRACERT http://www.globo.com

    o servidor da globo está no Brasil, você vai ver toda a rota que os seus dados fazem para chegar até a central da globo.
    Cada IP desse que aparece, é FIXO de alguma central, a ANATEL com certeza tem uma lista com as COORDENADAS de cada IP desses.

    Como não são todas as cidades que tem centrais, é quase impossível saber a sua cidade exatamente. ;)

  7. Eu também estava procurando WP Plugins para realizar essa tarefa e incluir anúncios personalizados em meus sites.
    Coisa de blogueiro profissional (que vive disso).
    Muito obrigado pela dica.

  8. JAIR FORO says:

    Cara muito bom o post!!! Estva procurando essa funcionalidade para implantação em alguns sistemas de Relatórios Vai funcionar melhor do que o esperado.

    Vlw muito Obrigado!

  9. Romario says:

    Se não tiverem php usem este codigo para mostar o IP em javascript:

    <script type="text/javascript" src="http://meuip.mmosgame.com/ipjs.php"></script&gt;

    Basta colar onde deve aparecer o IP, dentro do código HTML.

  10. Eder says:

    Olá boa tarde,

    Estou tentado usar esse código mas está dando erro.
    Quando rodo o script em um server local roda numa boa, só que se eu rodar o script online dá esse problema:

    Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/storage/c/df/06/pedeviagens1/public_html/new/tools/geoLocation.php on line 128

    Warning: file_get_contents(http://www.geoplugin.net/php.gp?ip=189.7.203.60) [function.file-get-contents]: failed to open stream: no suitable wrapper could be found in /home/storage/c/df/06/pedeviagens1/public_html/new/tools/geoLocation.php on line 128

    Alguém poderia de dar um help ?

    Valeu

  11. Quem já conseguiu poderia me fazer um orçãmento? says:

    Tentei entrar em contato com os webmaster do forum mas nao consegui.
    Se algum de vocÊs conseguiu este tipo de solução eu me envie um orçamento no email cadastrado! grato

  12. Leonardo Bolsoni says:

    Eder,

    certifique-se se a função file_get_contents() está ativa no seu servidor de hospedagem.

  13. Wagner Quedi says:

    vc pode substituir o

    file_get_contents(http://www.geoplugin.net/php.gp?ip=189.7.203.60);

    por

    $soket=curl_init();
    curl_setopt($soket,CURLOPT_URL,’http://www.geoplugin.net/php.gp?ip=189.7.203.60′);
    curl_setopt($soket,CURLOPT_RETURNTRANSFER,1);
    curl_exec($soket);
    $response=curl_exec($soket);

    usei aqui e funcionar

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>