• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

kingless

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

20 mensagens neste tópico

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  :D

Download:

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

Source code:

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

<?php
         /////////////////////////////////////////////////////|
        ///////      Localização através do IP       //////// |			    
       //////             by kingless     	     ///////  |	  		     
      /////          <blastelf@gmail.com>             ///// S////////////////////////   
     ///////////////////////////////////////////////////// G/  Caso ocorra algum  //
    //// Este script detecta o país, cidade, estado  //// U/  erro no script     //
   /// caixa postal (só de alguns paí­ses), isp,      /// B/  envie-me um email  //
  // imagem da bandeira do país... 		     /// / <blastelf@gmail.com>//
///////////////////////////////////////////////////////////////////////////////

$ip = new ip();

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

echo implode( "\r\n<br />", $msg );

class ip {

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( 'pais' => 'IP country', 'estado' => 'IP state', 'cidade' => 'IP city', 'caixa_postal' => 'IP postcode', 'latitude' => 'latitude', 'longitude' => 'longitude', 'isp' => 'isp', 'org' => 'organization' );


function ip() {

	$data = $this->getData();

	if(empty( $data )) {
		return false;
	}

	$data = $this->parse_data( $data );

	$this->setVars( $data );

	return true;
}

function getData() {

	$fp = fsockopen( 'www.ip-adress.com', 80, $errno, $errstr, 5 );

	if(!$fp) {
	        return false;
	}

	$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";

	fwrite($fp, $out);

	$data = '';

	while (!feof($fp)) {
	        $data .= fgets($fp, 13422);
	}

	fclose( $fp );

	return $data;
}

function parse_data( $data ) {

	foreach( $this->vars as $set => $var ) {
		if($exp = explode( '<font face="verdana" size="2">'. $var .':</font></th>', $data )) {
			if(!empty( $exp[1] )) {
				$exp = explode( '<td bgcolor="#FFFFCC"><font face="verdana" size="2">', $exp[1]  );
				$res[$set] = explode( '</font></td>', $exp[1] );
			}
		}

		if($set == "pais") {
			$exp = explode( '<font face="verdana" size="2">'. $var .':</font></th>', $data );
			$exp = explode( '<td bgcolor="#FFFFCC">', $exp[1] );
			$exp = explode( '<font face="verdana" size="2">', $exp[1] );

			preg_match( '<img src="(.*?)">', $exp[1], $img );

			$exp = explode( '<img src="'. $img[1] .'">', $exp[1] );

			$res["img"] = "http://www.ip-adress.com". $img[1];
			$res[$set] = explode( '</font>', $exp[1] );
		}
	}
	return $res;
}

function setVars( $data ) {
	foreach( $this->vars as $var => $valor ) {
		if(!empty( $data[$var][0] )) {
			$this->$var = trim($data[$var][0]);
		}			
	}
	$this->img = $data['img'];
	$this->ip = $_SERVER['REMOTE_ADDR'];
}
}
?>

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes tentar resolver isso, no topo do site eles tem uma form onde podes por o teu ip e ele faz o lookup tenta perceber como trabalha a form e como podes por isso a trabalhar pelos sockets.

Acho que não é muito difícil deves ter de definir os headers :D

Tenta e diz como correu.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yaps, pega no ip do utilizador e envia-o usando o curl por exemplo.

Este é outro bom exemplo de quao fixe é parsar html :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alterei os headers  para

                $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";

mas não funcionou (era suposto funcionar) acho que não funcionou porque o site retorna um erro de código 500 "internal server error" agora vou fazer o que o pedrotuga disse vou usar curl para "tentar" enviar o ip do utilizador, depois digo alguma coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tentei utilizar CURL e não deu :/ O servidor do site retorna um erro coloquei o erro no meu servidor para verem..

http://www.kingless.net/erro.html

<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://www.ip-address.com/");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5 );
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "iq=72.14.207.99&submit=". urlencode( "lookup any ip" ));
curl_setopt($ch, CURLOPT_TIMEOUT, 5 );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch);

curl_close($ch);

echo $data;

?>

Acho que não se pode fazer mais nada  :bored:, mas é sempre bom programar for fun  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
                $var = "iq=".$_SERVER['REMOTE_ADDR']."&submit=lookup+any+ip";
                $out  = "POST / HTTP/1.1\r\n"."Host: www.ip-adress.com\r\n"."User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1\r\n"."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"."Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3\r\n"."Accept-Encoding: gzip,deflate\r\n"."Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"."Keep-Alive: 300\r\n"."Connection: keep-alive\r\n"."Referer: http://www.ip-adress.com/\r\n"."Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ". strlen( $var ) ."\r\n\r\n";
                $out .= "$var\r\n"; // se não der troca esta linha por: $out .= "$var".chr(0);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estavas a lixar a configuração de virtual host do server porque no header devias usar Host: www.ip-adress.com e não Host: localhost :D

E o urlencode() estava a transformar "lookup any ip" em lookup%20any%20ip o que às vezes não dá mt jeito.

Ele também podia estar a implicar com a falta do Referer.

Ah e no cURL, estavas a postar no http://www.ipaddress.com :)

Está aqui um gajo doente e vocês andam mais distraídos que eu. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estavas a lixar a configuração de virtual host do server porque no header devias usar Host: www.ip-adress.com e não Host: localhost :)

E o urlencode() estava a transformar "lookup any ip" em lookup%20any%20ip o que às vezes não dá mt jeito.

Ele também podia estar a implicar com a falta do Referer.

Ah e no cURL, estavas a postar no http://www.ipaddress.com :)

Está aqui um gajo doente e vocês andam mais distraídos que eu. :D

Nem reparei que estava a usar localhost :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parece que já esta a funcionar bem :) Modifiquei POST /  HTTP/1.1 para POST / HTTP/1.0 para os dados serem recebidos mais rápido :D

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

$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";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ganda cena!

Eu já tinha escrito um script que fazia o mesmo, mas não tinha tantas funcionalidades.

Vou utilizar o teu nuns projectos que ando a  desenvolver.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a mim dá-me que estou em évora... neste momento estou a menos de 3 km de lisboa...

Meu IP: 62.169.119.181

País: Portugal Portugal

Estado/Provincia: Evora

Cidade: Falcoeiras

Caixa Postal:

Latitude: 38.483299

Longitude: -7.583300

ISP: Optimus

Organização: Telecomunicagues S.A.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a mim dá-me que estou em évora... neste momento estou a menos de 3 km de lisboa...

Meu IP: 62.169.119.181

País: Portugal Portugal

Estado/Provincia: Evora

Cidade: Falcoeiras

Caixa Postal:

Latitude: 38.483299

Longitude: -7.583300

ISP: Optimus

Organização: Telecomunicagues S.A.

Ele dá-te a localização da central do provedor, ou seja, para kangurus e afins, a localização nunca é certa :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom trabalho, detectou a minha localização perfeitamente.

O próximo trabalho é incluir o Google Maps com a localização fornecida por este script. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas de lisboa a évora ainda é um bocadito afastado...

E? Blame Optimus. Eles não podem ligar-se à rede em todas as antenas que têm, é impossível. A alternativa é retransmitir pelas várias antenas o sinal e depois injectá-la na rede. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom trabalho, detectou a minha localização perfeitamente.

O próximo trabalho é incluir o Google Maps com a localização fornecida por este script. :P

isso é o que menos trabalho dá... tenho uma situação parecida num fórum em que pertenço... só que tem os dados em xml em vez de os ir buscar em php, mas a mudança é simples, até porque só mostrava uma localização... a unica questão é que não apareceria a nossa posição mas a que fosse identificada pelo sistema... neste momento, já me está a identificar como estando em carnaxide (se bem que esteja junto a odivelas)...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Adicionado à: [wiki=PHP:Código/Localização IP]Wiki[/wiki]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora