← Tutoriais

[PHP] Localização através do ip

Lida 17035 vezes

Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Acabei de criar um script que detecta o ip, país, cidade, estado, caixa postal, imagem da bandeira do páis, entre outros... aqui fica o código  :)

Download:
http://www.kingless.net/download.php?filename=ip.php

Source code:
http://www.kingless.net/download.php?filename=ip.php;source

Código: [Seleccione]

<?php
         
/////////////////////////////////////////////////////|
        ///////      Localização através do IP       //////// | Base de dados em            
       //////             by kingless                ///////  | http&#58;//www.ip-adress.com/              
      /////          <blastelf@gmail.com>             ///// S////////////////////////   
     ///////////////////////////////////////////////////// G/  Caso ocorra algum  //
    //// Este script detecta o país, cidade, estado  //// U/  erro no script     //
   /// caixa postal &#40;só de alguns paí­ses&#41;, isp,      /// B/  envie-me um email  //
  // imagem da bandeira do país...                  /// <blastelf@gmail.com>   //
 ///////////////////////////////////////////////////////////////////////////////

class ip &#123;

    
var $timeout 5;
    var 
$ip '';
    var 
$pais '';
    var 
$cidade '';
    var 
$estado '';
    var 
$isp '';  
    var 
$img '';
    var 
$org '';
    var 
$caixa_postal '';
    var 
$latitude '';
    var 
$longitude '';
    var 
$vars = array&#40; 'pais' => 'IP country', 'estado' => 'IP state', 'cidade' => 'IP city', 'caixa_postal' => 'IP postcode', 'latitude' => 'latitude', 'longitude' => 'longitude', 'isp' => 'isp', 'org' => 'organization' &#41;;


    
function ip&#40;&#41; &#123;
        
        
$data $this->getData&#40;&#41;;

        
if&#40;empty&#40; $data &#41;&#41; &#123;
            
return false;
        &
#125;
        
        
$data $this->parse_data&#40; $data &#41;;

        
$this->setVars&#40; $data &#41;;

        
return true;
    &
#125;

    
function getData&#40;&#41; &#123;

        
$fp fsockopen&#40; 'www.ip-adress.com', 80, $errno, $errstr, 5 &#41;;

        
if&#40;!$fp&#41; &#123;
                
return false;
        &
#125;

        
$query "iq=&#123;$_SERVER['REMOTE_ADDR'&#93;&#125;&submit=lookup+any+ip";
        
$out  "POST / HTTP/1.0\r\n";
        
$out .= "Host&#58; www.ip-adress.com\r\n";
        
$out .= "User-Agent&#58; &#123;$_SERVER['HTTP_USER_AGENT'&#93;&#125;\r\n";
        
$out .= "Accept&#58; text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
        
$out .= "Accept-Language&#58; pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
        
$out .= "Accept-Encoding&#58; gzip,deflate\r\n";
        
$out .= "Accept-Charset&#58; ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
        
$out .= "Keep-Alive&#58; 300\r\n";
        
$out .= "Connection&#58; keep-alive\r\n";
        
$out .= "Referer&#58; http&#58;//www.ip-adress.com/\r\n";
        
$out .= "Content-Type&#58; application/x-www-form-urlencoded\r\n";
        
$out .= "Content-Length&#58; "strlen&#40; $query &#41; ."\r\n\r\n";
        
$out .= "$query\r\n";

        
fwrite&#40;$fp, $out&#41;;

        
$data '';

        while &
#40;!feof&#40;$fp&#41;&#41; &#123;
                
$data .= fgets&#40;$fp, 13422&#41;;
        
&#125;

        
fclose&#40; $fp &#41;;

        
return $data;
    &
#125;

    
function parse_data&#40; $data &#41; &#123;
        
        
foreach&#40; $this->vars as $set => $var &#41; &#123;
            
if&#40;$exp = explode&#40; '<font face="verdana" size="2">'. $var .'&#58;</font></th>', $data &#41;&#41; &#123;
                
if&#40;!empty&#40; $exp[1&#93; &#41;&#41; &#123;
                    
$exp explode&#40; '<td bgcolor="#FFFFCC"><font face="verdana" size="2">', $exp[1&#93;  &#41;;
                    
$res[$set&#93; = explode&#40; '</font></td>', $exp[1&#93; &#41;;
                
&#125;
            
&#125;

            
if&#40;$set == "pais"&#41; &#123;
                
$exp explode&#40; '<font face="verdana" size="2">'. $var .'&#58;</font></th>', $data &#41;;
                
$exp explode&#40; '<td bgcolor="#FFFFCC">', $exp[1&#93; &#41;;
                
$exp explode&#40; '<font face="verdana" size="2">', $exp[1&#93; &#41;;
                
                
preg_match&#40; '<img src="&#40;.*?&#41;">', $exp[1&#93;, $img &#41;;

                
$exp explode&#40; '<img src="'. $img[1&#93; .'">', $exp[1&#93; &#41;;
                
                
$res["img"&#93; = "http&#58;//www.ip-adress.com". $img[1&#93;;
                
$res[$set&#93; = explode&#40; '</font>', $exp[1&#93; &#41;;
            
&#125;
        
&#125;
        
return $res;
    &
#125;

    
function setVars&#40; $data &#41; &#123;
        
foreach&#40; $this->vars as $var => $valor &#41; &#123;
            
if&#40;!empty&#40; $data[$var&#93;[0&#93; &#41;&#41; &#123;
                
$this->$var trim&#40;$data[$var&#93;[0&#93;&#41;;
            
&#125;            
        
&#125;
        
$this->img $data['img'&#93;;
        
$this->ip $_SERVER['REMOTE_ADDR'&#93;;
    
&#125;
&#125;
?>




Exemplo:
Código: [Seleccione]

<?php

include&#40; 'ip.php' &#41;;

$ip = new ip&#40;&#41;;

$msg[&#93; = "<b>Meu IP&#58;</b> $ip->ip";
$msg[&#93; = "<b>País&#58;</b> $ip->pais <img src=\"$ip->img\">";
$msg[&#93; = "<b>Estado/Provincia&#58;</b> $ip->estado";
$msg[&#93; = "<b>Cidade&#58;</b> $ip->cidade";
$msg[&#93; = "<b>Caixa Postal&#58;</b> $ip->caixa_postal";
$msg[&#93; = "<b>Latitude&#58;</b> $ip->latitude";
$msg[&#93; = "<b>Longitude&#58;</b> $ip->longitude";
$msg[&#93; = "<b>ISP&#58;</b> $ip->isp";
$msg[&#93; = "<b>Organização&#58;</b> $ip->org";

echo implode&#40; "\r\n<br />", $msg &#41;;
?>

Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Parece que o script não esta a funcionar como eu esperava  :(, eu pensava que fsockopen fosse buscar o conteúdo ao site com o ip do utilizador e não do servidor  ¬¬ , mas o que interessa é o código  :D

Tentei resolver o problema alterando os headers e até tentei usar a biblioteca CURL do PHP mas não funcionou, vou deixar aqui os códigos que usei para tentar resolver o problema.

Headers que alterei:
Código: [Seleccione]
$var = "iq=ok&submit=". urlencode( "lookup any ip" );
$out  = "POST / HTTP/1.0\r\n";
$out .= "Host: localhost\r\n";
$out .= "User-Agent: {$_SERVER['HTTP_USER_AGENT']}\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ". strlen( $var ) ."\r\n\r\n";
$out .= "$var\r\n";


CURL LIB:
Código: [Seleccione]
<?php
 
$ch 
curl_init&#40;&#41;;
 
curl_setopt&#40;$ch, CURLOPT_URL, "http&#58;//www.ip-address.com/"&#41;;
curl_setopt&#40;$ch, CURLOPT_CONNECTTIMEOUT, 5 &#41;;
curl_setopt&#40;$ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'&#93;&#41;;
curl_setopt&#40;$ch, CURLOPT_POST, true&#41;;
curl_setopt&#40;$ch, CURLOPT_POSTFIELDS, "iq=72.14.207.99&submit=". urlencode&#40; "lookup any ip" &#41;&#41;;
curl_setopt&#40;$ch, CURLOPT_TIMEOUT, 5 &#41;;
curl_setopt&#40;$ch, CURLOPT_FOLLOWLOCATION, true&#41;;
curl_setopt&#40;$ch, CURLOPT_RETURNTRANSFER, true&#41;;
 
$data curl_exec&#40;$ch&#41;;
 
curl_close&#40;$ch&#41;;
 
echo $data;


Acho que não há mais nada que se possa fazer, mas é sempre bom programar "for fun"   :D
Offline

Tomahock 
Membro
Mensagens 317 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Isso só ve o nosso ip ou nós é que inserimos o ip que queremos que ele analise?
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

O problema já foi resolvido :) O script já esta a funcionar muito bem  :D

Demo:
http://www.kingless.net/ip.php

Solução Headers:
Código: [Seleccione]

   $query = "iq={$_SERVER['REMOTE_ADDR']}&submit=lookup+any+ip";
$out  = "POST / HTTP/1.0\r\n";
$out .= "Host: www.ip-adress.com\r\n";
$out .= "User-Agent: {$_SERVER['HTTP_USER_AGENT']}\r\n";
$out .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
$out .= "Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
$out .= "Accept-Encoding: gzip,deflate\r\n";
$out .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
$out .= "Keep-Alive: 300\r\n";
$out .= "Connection: keep-alive\r\n";
$out .= "Referer: http://www.ip-adress.com/\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ". strlen( $query ) ."\r\n\r\n";
$out .= "$query\r\n";

Tenho  que agradecer ao membro "djthyrax" da comunidade Portugal a programar por ter me ajudado a resolver este problema :)
Offline

asturmas 
Administrador
Mensagens 19734 Gostos 50
Feedback +2

Troféus totais: 39
Trófeus: (Ver todos)
Mobile User Windows User Super Combination Combination Topic Starter 100 Poll Votes 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

Isso e a informaçao que o www.ip-adress.com da
Mas nao era ma ideia por o endereço do qual se quer a info
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Citação de: "Tomahock"
Isso só ve o nosso ip ou nós é que inserimos o ip que queremos que ele analise?


Este script é mais para ser utilizado em web sites onde se quer detectar o país, cidade, ip etc... do utilizador que visita o nosso website e também para quem quer fazer tipo estatísticas dos países, ip, etc que visitam o site .

Se quiseres procurar por informações de um certo IP tens uma boa ferramenta => http://www.ip-adress.com/  
 :wink:
Offline

BlueEagle 
Membro
Mensagens 2221 Gostos 1
Troféus totais: 31
Trófeus: (Ver todos)
Windows User Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3

[APAGAR]
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Citação de: "BlueEagle"
Meu IP: 85.241.###.###
País: Portugal
Estado/Provincia: Coimbra
Cidade: Serrazina
Caixa Postal:
Latitude: 40.083302
Longitude: -8.533300
ISP: Telepac - Comunicacoes Interactivas
Organização: SA

Achei graça ao Serrazina nem sei se isso fica em Coimbra  :lol:

Serrazina fica em Coimbra  :P
Offline

Tomahock 
Membro
Mensagens 317 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Meu IP: 85.241.xx.xx
País: Portugal
Estado/Provincia: Guarda
Cidade: Ortigueira
Caixa Postal:
Latitude: 40.500000
Longitude: -7.766800
ISP: Telepac - Comunicacoes Interactivas
Organização: SA

Tirando a parte em que sou de canas de senhorim, viseu e que a guarda so fica do outro lado da serra até é engraçado a parte das coordenadas geográficas!
Offline

asturmas 
Administrador
Mensagens 19734 Gostos 50
Feedback +2

Troféus totais: 39
Trófeus: (Ver todos)
Mobile User Windows User Super Combination Combination Topic Starter 100 Poll Votes 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

O meu da bem

My ip address:    81.193.xxxx
IP country:    Portugal
IP state:    Lisboa
IP city:    Lisbon
latitude:    38.7167
longitude:    -9.1333
isp:    Telepac - Comunicacoes Interactivas, SA
organization:    Telepac - Comunicacoes Interactivas, SA
your speed:    Cable/DSL

PS. Tomahock, isso de guarda deves tar ligado a essa central
Offline

Tomahock 
Membro
Mensagens 317 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

porra! daqui ha guarda sao mais de 100km!
Offline

asturmas 
Administrador
Mensagens 19734 Gostos 50
Feedback +2

Troféus totais: 39
Trófeus: (Ver todos)
Mobile User Windows User Super Combination Combination Topic Starter 100 Poll Votes 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

Ou entao a central pode ter o nome de guarda e nem la tar perto isso e subjectivo
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

O código está bem organizado, o problema é que a funcionalidade disto é muito relativa, se o webmaster resolver alterar o código fonte, lá se vai a detecção. Claro, sempre se pode alterar depois o código php, mas para quem não percebe patavina do que está no código não se safa.
E pronto, eu não estou em LX, estou a 150 Kms de LX...  logo os resultados não são muito fiáveis.
De qualquer modo, é de apreciar o trabalho que fizeste Kingless!
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Citação de: "=IceBurn="
O código está bem organizado!

Para mim isso é uma das coisas mais importantes!!!

Citação de: "=IceBurn="
o problema é que a funcionalidade disto é muito relativa, se o webmaster resolver alterar o código fonte, lá se vai a detecção. Claro, sempre se pode alterar depois o código php, mas para quem não percebe patavina do que está no código não se safa.

Foi por isso que coloquei logo no principio do código o seguinte:

"Caso ocorra algum erro no script envie-me um email <blastelf@gmail.com>"

Logo que eu recebesse o email corrigia o código e publicava :wink:  :P

Citação de: "=IceBurn="

E pronto, eu não estou em LX, estou a 150 Kms de LX...  logo os resultados não são muito fiáveis.

Em quase todos sites (ou mesmo todos) onde podes obter a tua localização geológica através do teu IP o resultado vai ser igual ou muito parecido.  

Citação de: "=IceBurn="

De qualquer modo, é de apreciar o trabalho que fizeste Kingless!

thanks  :)