adexweb 0 Denunciar post Postado Dezembro 9, 2009 Olá pessoal. Peço inicialmente desculpas por postar este tópico visto que na internet já há vários, mas nenhum deles conseguiu resolver minha dúvida, pois não sou programador PHP experiente. O problema é o seguinte. Quero colocar a previsão do tempo em meu site coletando apenas os dados de outro site sem aqueles ícones já prontos, ou seja, fazer o layout da previsão do meu jeito com as minhas imagens. Pelos inúmeros posts na internet falam em usar a função file_get_contents() ou a função que trabalha com XML. Porém quando uso isto aparece uma mensagem de erro no PHP. Pesquisei na net e li algo como alguns provedores de hospedagem bloqueiam o uso destas funções por motivos de segurança. Eu tentei recuperar os dados do Clima Tempo: http://selos.climate...?CODCIDADE=2174 <selos> <video urlprev="http-~~-//videos.climatempo.com.br/selos/video.swf" urlmkt="http-~~-//videos.climatempo.com.br/mkt/video1.swf"/> <parametro qtd="4" video="ne"/> <cidade nome="BA - Paripiranga" data="09/12 Qua" low="21" high="32" prob="0" mm="0" ico="2" frase="Sol com algumas nuvens. Não chove."/> <cidade nome="BA - Paripiranga" data="10/12 Qui" low="20" high="33" prob="0" mm="0" ico="2" frase="Sol com algumas nuvens. Não chove."/> <cidade nome="BA - Paripiranga" data="11/12 ---" low="21" high="32" prob="0" mm="0" ico="2" frase="Sol com algumas nuvens. Não chove."/> <cidade nome="BA - Paripiranga" data="12/12 Sáb" low="20" high="32" prob="0" mm="0" ico="2" frase="Sol com algumas nuvens. Não chove."/> </selos> O que posso fazer para solucionar este problema? É isto mesmo, o provedor bloqueou o uso destas funções? Abraços. Compartilhar este post Link para o post Compartilhar em outros sites
hgb7 3 Denunciar post Postado Dezembro 9, 2009 http://www.mxstudio.com.br/forum/index.php?showtopic=58924 Esta dúvida é sua? Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Dezembro 9, 2009 Pesquisei na net e li algo como alguns provedores de hospedagem bloqueiam o uso destas funções por motivos de segurança. O que posso fazer para solucionar este problema? É isto mesmo, o provedor bloqueou o uso destas funções? Você deve utilizar cURL nesse caso, para facilitar escrevi uma função para fazer o trabalho: /** * Faz uma requisição HTTP utilizando cURL * @param string $url A URL que será recuperada * @param string $method O método HTTP que será utilizado para recuperar (GET, POST, etc...) * @param array $data Matriz contendo os campos que serão enviados com a requisição * @param array $headers Matriz contendo cabeçalhos HTTP * @return string O conteúdo recuperado */ function curl_get_contents( $url , array $data = array() , $method = 'GET' , array $headers = array() ){ $ret = null; if ( function_exists( 'curl_init' ) ){ if ( ( $curl = curl_init() ) !== false ){ curl_setopt( $curl , CURLOPT_HEADER , false ); curl_setopt( $curl , CURLOPT_FOLLOWLOCATION , true ); curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ); curl_setopt( $curl , CURLOPT_HTTPHEADER , $headers ); curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $method ); if ( count( $data ) ){ if ( strtoupper( $method ) == 'POST' ) curl_setopt( $curl , CURLOPT_POSTFIELDS , $data ); elseif ( count( $data ) ) $url = sprintf( '%s?%s' , $url , http_build_query( $data ) ); } curl_setopt( $curl , CURLOPT_URL , $url ); $ret = curl_exec( $curl ); $err = curl_error( $curl ); $ern = curl_errno( $curl ); curl_close( $curl ); if ( $ern ) trigger_error( sprintf( 'cURL[ %d ]: %s' , $ern , $err ) , E_USER_ERROR ); } else trigger_error( 'cURL: Não foi possível iniciar cURL' , E_USER_ERROR ); } else trigger_error( 'É necessário ter cURL instalada.' , E_USER_ERROR ); return $ret; } Para usar: $xml = curl_get_contents( 'http-~~-//selos.climatempo.com.br/selos/selo.php' , array( 'CODCIDADE' => 2174 ) ); Você também pode passar a URL completa, assim: $xml = curl_get_contents( 'http-~~-//selos.climatempo.com.br/selos/selo.php?CODCIDADE=2174' ); Nos dois casos, a variável $xml conterá o XML do climatempo, com isso é só tratar os dados conforme sua necessidade. ;) PS: A primeira forma é a recomendada caso você tenha muitas variáveis ou alguma informação que precise ser codificada para ser enviada na URL ou se você precisar enviar os dados via POST. Compartilhar este post Link para o post Compartilhar em outros sites
adexweb 0 Denunciar post Postado Dezembro 9, 2009 Opa!! Já respondeu!!!!! Valeu ai pelo post pessoal, vou testar o script qualquer coisa eu passo aqui!! Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
adexweb 0 Denunciar post Postado Dezembro 10, 2009 Oi eu de novo! João Batista Neto tentei usar o script cara e nãio deu certo, apareceu um erro nesta linha: curl_setopt( $curl , CURLOPT_FOLLOWLOCATION , true ); A mensagem é esta: Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /home/c97842/public_html/tempo.php on line 26 Será que tem haver com bloqueio no servidor tb. Valeu Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Dezembro 10, 2009 Será que tem haver com bloqueio no servidor tb. Sim, basta remover essa linha que deverá funcionar. Compartilhar este post Link para o post Compartilhar em outros sites
adexweb 0 Denunciar post Postado Dezembro 10, 2009 Brother não funcionou não. Acho q não vai dar certo mesmo. Agora num aparece é nada. brigado Aguem pode me ajudar. Já procurei de tudo na net, os codigos dão erro. Será que o problema é no climatempo. Alguem sabe fazer isto com outro site de clima... Valeu Compartilhar este post Link para o post Compartilhar em outros sites
Unferth 0 Denunciar post Postado Novembro 2, 2011 Olá, eu também estava com essa dúvida e consegui fazer funcionar unindo algumas explicações, abaixo segue o resultado: São necessários apenas 3 arquivos, eu utilizei a função indicada pelo amigo João Batista Neto. ClimaTempoMap.class.php <?php /** * Faz uma requisição HTTP utilizando cURL * @param string $url A URL que será recuperada * @param string $method O método HTTP que será utilizado para recuperar (GET, POST, etc...) * @param array $data Matriz contendo os campos que serão enviados com a requisição * @param array $headers Matriz contendo cabeçalhos HTTP * @return string O conteúdo recuperado */ function curl_get_contents( $url , array $data = array() , $method = 'GET' , array $headers = array() ){ $ret = null; if ( function_exists( 'curl_init' ) ){ if ( ( $curl = curl_init() ) !== false ){ curl_setopt( $curl , CURLOPT_HEADER , false ); curl_setopt( $curl , CURLOPT_FOLLOWLOCATION , true ); curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ); curl_setopt( $curl , CURLOPT_HTTPHEADER , $headers ); curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $method ); if ( count( $data ) ){ if ( strtoupper( $method ) == 'POST' ) curl_setopt( $curl , CURLOPT_POSTFIELDS , $data ); elseif ( count( $data ) ) $url = sprintf( '%s?%s' , $url , http_build_query( $data ) ); } curl_setopt( $curl , CURLOPT_URL , $url ); $ret = curl_exec( $curl ); $err = curl_error( $curl ); $ern = curl_errno( $curl ); curl_close( $curl ); if ( $ern ) trigger_error( sprintf( 'cURL[ %d ]: %s' , $ern , $err ) , E_USER_ERROR ); } else trigger_error( 'cURL: Não foi possível iniciar cURL' , E_USER_ERROR ); } else trigger_error( 'É necessário ter cURL instalada.' , E_USER_ERROR ); return $ret; } /** * @package com.google.code.components.climatempo. * * Classe que realiza o mapeamento da URL do site climatempo.com.br que retorna * um arquivo XML dinamico contendo informações sobre a temperatura de uma determinada * cidade que é informada pelo parametro da URL (CODCIDADE). * O acesso aos dados finais é feita por apenas um método publico da classe, o * metodo getTemperaturas. * * @author Carlos Alberto Junior. * */ class ClimaTempoMap { private $id_cidade; private $url; private $temperaturas; function ClimaTempoMap($id_cidade){ $this->id_cidade = $id_cidade; $this->url = "http://selos.climatempo.com.br/selos/selo.php?CODCIDADE="; $this->temperaturas = array(); // Prepara os dados. $this->mapDataFromXML(); } /** * Formata os dados que estão contidos no arquivo XML gerado pela URL do site * climatempo. * * @return void */ private function mapDataFromXML(){ $this->temperaturas = array(); if($this->id_cidade == ''){ $this->temperaturas = 'CHAVE_DA_CIDADE_EM_BRANCO'; echo $this->temperaturas; } if(is_double($this->id_cidade)){ $this->temperaturas = 'CHAVE_DA_CIDADE_INVALIDA'; echo $this->temperaturas; } try { // Carrega o arquivo XML renderizado para uma variavel local. // e instancia um novo objeto SimleXMLElement para permitir o acesso // a arvore de tags e atributos. $conteudo = utf8_decode(curl_get_contents($this->getUrl().$this->getIdCidade())); $xml = new SimpleXMLElement($conteudo); if($xml == null){ return 'CIDADE_NAO_ENCONTRADA'; echo $this->temperaturas; } else { // Percorre os nós das tags de elementos da cidade buscando cada um // dos seus atributos e populando objetos ClimaTempo para coloca-los // em um Array. foreach ($xml->xpath('//cidade') as $cidade) { $c = new ClimaTempo(); $c->setCidade (utf8_decode($cidade['nome'])); $c->setData (utf8_decode($cidade['data'])); $c->setMinima (utf8_decode($cidade['low'])); $c->setMaxima (utf8_decode($cidade['high'])); $c->setComentario (utf8_decode($cidade['frase'])); $c->setProbabilidade(utf8_decode($cidade['prob'])); $c->setIcone (utf8_decode($cidade['ico'])); $c->setQtdeChuva ($cidade['mm']); $c->setId ($this->getIdCidade()); $this->addElement($c); } } } catch(Exception $e) { // TODO : Auto generated $e->getMessage(); } return $this->getTemperaturas(); } /** * Retorna a validade de um determinado valor String como sendo um numero ou * não. * * @return Boolean true caso o numero seja realmente um numero valido. */ private function isNumber(){ return is_integer($this->getIdCidade()); } /** * Método getter que retorna um Array de objetos ClimaTempo após o mesmo ter * sido carregado com objetos ClimaTempo que foram convertidos da URL que * continha o XML. * * @return Array<ClimaTempo> temperaturas com todos os objetos encontrados * dentro do arquivo XML. */ public function getTemperaturas(){ return $this->temperaturas; } /** * Retorna a URL do site climatempo * * @return String url */ private function getUrl(){ return $this->url; } /** * Retorna o id da cidade a ser carregada os dados para o XML. * * @return Integer id_cidade */ private function getIdCidade(){ return $this->id_cidade; } /** * Adiciona um objeto ClimaTempo dentro do Array<ClimaTempo> * * @param ClimaTempo $c */ private function addElement(ClimaTempo $c){ $this->temperaturas[] = $c; } } ?> ClimaTempo.class.php <?php /** * @package com.google.code.components.climatempo. * * Classe bean para representar os atributos referentes ao XML do site * climatempo.com.br. Permite uma maior flexibilidade na manipulação dos dados * obtidos do site. * * @author Carlos Alberto Junior. * */ class ClimaTempo{ private $id; private $minima; private $maxima; private $cidade; private $data; private $probabilidade; private $comentario; private $qtdeChuva; private $icone; function ClimaTempo(){ } public function getId(){ return $this->id;} public function getMinima(){ return $this->minima;} public function getMaxima(){return $this->maxima;} public function getCidade(){ return $this->cidade;} public function getData(){ return $this->data;} public function getProbabilidade(){ return $this->probabilidade;} public function getComentario(){ return $this->comentario;} public function getQtdeChuva(){ return $this->qtdeChuva;} public function getIcone(){ return $this->icone;} public function setId($i){ $this->id = $i;} public function setMinima($m){$this->minima = $m;} public function setMaxima($m){$this->maxima = $m;} public function setCidade($c){$this->cidade = $c;} public function setData($d){$this->data = $d;} public function setProbabilidade($p){$this->probabilidade = $p;} public function setComentario($c){$this->comentario = $c;} public function setQtdeChuva($c){$this->qtdeChuva = $c;} public function setIcone($p){$this->icone = $p;} public function __toString(){ return "<br />Dados:".$this->getData()." - ".$this->getCidade()." - ".$this->getMaxima()." - ".$this->getMinima()." - ".$this->getComentario()." - ".$this->getIcone(); } } ?> index.php <?php try { require_once("ClimaTempo.class.php"); require_once("ClimaTempoMap.class.php"); // id da cidade...pode ser consultado no site www.climatempo.com.br $map = new ClimaTempoMap(1454); $dados = $map->getTemperaturas(); if(is_array($dados)) { foreach($dados as $c) { echo $c."<br>"; } } else { echo $dados; } } catch (Exception $e){ echo "Uma exceção ocorreu: ".$e->getMessage().""; } ?> Bom os créditos da classe original que faz todo serviço são do Carlos Alberto Junior, e a função que habilita do curl é João Batista Neto. Espero que funcione! o que eu fiz foi adaptar as duas, coisa simples, alterei apenas essa linha no arquivo ClimaTempoMap.class.php: $conteudo = utf8_decode(curl_get_contents($this->getUrl().$this->getIdCidade())); Abraços! Compartilhar este post Link para o post Compartilhar em outros sites
Unferth 0 Denunciar post Postado Novembro 2, 2011 Olá, eu também estava com essa dúvida e consegui fazer funcionar unindo algumas explicações, abaixo segue o resultado: São necessários apenas 3 arquivos, eu utilizei a função indicada pelo amigo João Batista Neto. ClimaTempoMap.class.php <?php /** * Faz uma requisição HTTP utilizando cURL * @param string $url A URL que será recuperada * @param string $method O método HTTP que será utilizado para recuperar (GET, POST, etc...) * @param array $data Matriz contendo os campos que serão enviados com a requisição * @param array $headers Matriz contendo cabeçalhos HTTP * @return string O conteúdo recuperado */ function curl_get_contents( $url , array $data = array() , $method = 'GET' , array $headers = array() ){ $ret = null; if ( function_exists( 'curl_init' ) ){ if ( ( $curl = curl_init() ) !== false ){ curl_setopt( $curl , CURLOPT_HEADER , false ); curl_setopt( $curl , CURLOPT_FOLLOWLOCATION , true ); curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ); curl_setopt( $curl , CURLOPT_HTTPHEADER , $headers ); curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $method ); if ( count( $data ) ){ if ( strtoupper( $method ) == 'POST' ) curl_setopt( $curl , CURLOPT_POSTFIELDS , $data ); elseif ( count( $data ) ) $url = sprintf( '%s?%s' , $url , http_build_query( $data ) ); } curl_setopt( $curl , CURLOPT_URL , $url ); $ret = curl_exec( $curl ); $err = curl_error( $curl ); $ern = curl_errno( $curl ); curl_close( $curl ); if ( $ern ) trigger_error( sprintf( 'cURL[ %d ]: %s' , $ern , $err ) , E_USER_ERROR ); } else trigger_error( 'cURL: Não foi possível iniciar cURL' , E_USER_ERROR ); } else trigger_error( 'É necessário ter cURL instalada.' , E_USER_ERROR ); return $ret; } /** * @package com.google.code.components.climatempo. * * Classe que realiza o mapeamento da URL do site climatempo.com.br que retorna * um arquivo XML dinamico contendo informações sobre a temperatura de uma determinada * cidade que é informada pelo parametro da URL (CODCIDADE). * O acesso aos dados finais é feita por apenas um método publico da classe, o * metodo getTemperaturas. * * @author Carlos Alberto Junior. * */ class ClimaTempoMap { private $id_cidade; private $url; private $temperaturas; function ClimaTempoMap($id_cidade){ $this->id_cidade = $id_cidade; $this->url = "http://selos.climatempo.com.br/selos/selo.php?CODCIDADE="; $this->temperaturas = array(); // Prepara os dados. $this->mapDataFromXML(); } /** * Formata os dados que estão contidos no arquivo XML gerado pela URL do site * climatempo. * * @return void */ private function mapDataFromXML(){ $this->temperaturas = array(); if($this->id_cidade == ''){ $this->temperaturas = 'CHAVE_DA_CIDADE_EM_BRANCO'; echo $this->temperaturas; } if(is_double($this->id_cidade)){ $this->temperaturas = 'CHAVE_DA_CIDADE_INVALIDA'; echo $this->temperaturas; } try { // Carrega o arquivo XML renderizado para uma variavel local. // e instancia um novo objeto SimleXMLElement para permitir o acesso // a arvore de tags e atributos. $conteudo = utf8_decode(curl_get_contents($this->getUrl().$this->getIdCidade())); $xml = new SimpleXMLElement($conteudo); if($xml == null){ return 'CIDADE_NAO_ENCONTRADA'; echo $this->temperaturas; } else { // Percorre os nós das tags de elementos da cidade buscando cada um // dos seus atributos e populando objetos ClimaTempo para coloca-los // em um Array. foreach ($xml->xpath('//cidade') as $cidade) { $c = new ClimaTempo(); $c->setCidade (utf8_decode($cidade['nome'])); $c->setData (utf8_decode($cidade['data'])); $c->setMinima (utf8_decode($cidade['low'])); $c->setMaxima (utf8_decode($cidade['high'])); $c->setComentario (utf8_decode($cidade['frase'])); $c->setProbabilidade(utf8_decode($cidade['prob'])); $c->setIcone (utf8_decode($cidade['ico'])); $c->setQtdeChuva ($cidade['mm']); $c->setId ($this->getIdCidade()); $this->addElement($c); } } } catch(Exception $e) { // TODO : Auto generated $e->getMessage(); } return $this->getTemperaturas(); } /** * Retorna a validade de um determinado valor String como sendo um numero ou * não. * * @return Boolean true caso o numero seja realmente um numero valido. */ private function isNumber(){ return is_integer($this->getIdCidade()); } /** * Método getter que retorna um Array de objetos ClimaTempo após o mesmo ter * sido carregado com objetos ClimaTempo que foram convertidos da URL que * continha o XML. * * @return Array<ClimaTempo> temperaturas com todos os objetos encontrados * dentro do arquivo XML. */ public function getTemperaturas(){ return $this->temperaturas; } /** * Retorna a URL do site climatempo * * @return String url */ private function getUrl(){ return $this->url; } /** * Retorna o id da cidade a ser carregada os dados para o XML. * * @return Integer id_cidade */ private function getIdCidade(){ return $this->id_cidade; } /** * Adiciona um objeto ClimaTempo dentro do Array<ClimaTempo> * * @param ClimaTempo $c */ private function addElement(ClimaTempo $c){ $this->temperaturas[] = $c; } } ?> ClimaTempo.class.php <?php /** * @package com.google.code.components.climatempo. * * Classe bean para representar os atributos referentes ao XML do site * climatempo.com.br. Permite uma maior flexibilidade na manipulação dos dados * obtidos do site. * * @author Carlos Alberto Junior. * */ class ClimaTempo{ private $id; private $minima; private $maxima; private $cidade; private $data; private $probabilidade; private $comentario; private $qtdeChuva; private $icone; function ClimaTempo(){ } public function getId(){ return $this->id;} public function getMinima(){ return $this->minima;} public function getMaxima(){return $this->maxima;} public function getCidade(){ return $this->cidade;} public function getData(){ return $this->data;} public function getProbabilidade(){ return $this->probabilidade;} public function getComentario(){ return $this->comentario;} public function getQtdeChuva(){ return $this->qtdeChuva;} public function getIcone(){ return $this->icone;} public function setId($i){ $this->id = $i;} public function setMinima($m){$this->minima = $m;} public function setMaxima($m){$this->maxima = $m;} public function setCidade($c){$this->cidade = $c;} public function setData($d){$this->data = $d;} public function setProbabilidade($p){$this->probabilidade = $p;} public function setComentario($c){$this->comentario = $c;} public function setQtdeChuva($c){$this->qtdeChuva = $c;} public function setIcone($p){$this->icone = $p;} public function __toString(){ return "<br />Dados:".$this->getData()." - ".$this->getCidade()." - ".$this->getMaxima()." - ".$this->getMinima()." - ".$this->getComentario()." - ".$this->getIcone(); } } ?> index.php <?php try { require_once("ClimaTempo.class.php"); require_once("ClimaTempoMap.class.php"); // id da cidade...pode ser consultado no site www.climatempo.com.br $map = new ClimaTempoMap(1454); $dados = $map->getTemperaturas(); if(is_array($dados)) { foreach($dados as $c) { echo $c."<br>"; } } else { echo $dados; } } catch (Exception $e){ echo "Uma exceção ocorreu: ".$e->getMessage().""; } ?> Bom os créditos da classe original que faz todo serviço são do Carlos Alberto Junior, e a função que habilita do curl é João Batista Neto. Espero que funcione! o que eu fiz foi adaptar as duas, coisa simples, alterei apenas essa linha no arquivo ClimaTempoMap.class.php: $conteudo = utf8_decode(curl_get_contents($this->getUrl().$this->getIdCidade())); Abraços! Compartilhar este post Link para o post Compartilhar em outros sites
Menino Homem 0 Denunciar post Postado Maio 8, 2012 Conforme contato com o João Batista Neto, peguei os scripts aqui postado pelo Daniel Costa e inseri dados de minha cidade, porem ainda falta algo, algum detalhe pra obter o resultado desejado. Segue os scrits ClimaTempo.Class.php <?php /** * @package com.google.code.components.climatempo. * * Classe bean para representar os atributos referentes ao XML do site * climatempo.com.br. Permite uma maior flexibilidade na manipulação dos dados * obtidos do site. * * @author Carlos Alberto Junior. * */ class ClimaTempo{ private $id; private $minima; private $maxima; private $cidade; private $data; private $probabilidade; private $comentario; private $qtdeChuva; private $icone; function ClimaTempo(){ } public function getId(){ return $this->id;} public function getMinima(){ return $this->minima;} public function getMaxima(){return $this->maxima;} public function getCidade(){ return $this->cidade;} public function getData(){ return $this->data;} public function getProbabilidade(){ return $this->probabilidade;} public function getComentario(){ return $this->comentario;} public function getQtdeChuva(){ return $this->qtdeChuva;} public function getIcone(){ return $this->icone;} public function setId($i){ $this->id = $i;} public function setMinima($m){$this->minima = $m;} public function setMaxima($m){$this->maxima = $m;} public function setCidade($c){$this->cidade = $c;} public function setData($d){$this->data = $d;} public function setProbabilidade($p){$this->probabilidade = $p;} public function setComentario($c){$this->comentario = $c;} public function setQtdeChuva($c){$this->qtdeChuva = $c;} public function setIcone($p){$this->icone = $p;} public function __toString(){ return "<br />Dados:".$this->getData()." - ".$this->getCidade()." - ".$this->getMaxima()." - ".$this->getMinima()." - ".$this->getComentario()." - ".$this->getIcone(); } } ?> O segundo Script ClimaTempoMap.Class.php <?php /** * Faz uma requisição HTTP utilizando cURL * @param string $url A URL que será recuperada * @param string $method O método HTTP que será utilizado para recuperar (GET, POST, etc...) * @param array $data Matriz contendo os campos que serão enviados com a requisição * @param array $headers Matriz contendo cabeçalhos HTTP * @return string O conteúdo recuperado */ function curl_get_contents( $url , array $data = array() , $method = 'GET' , array $headers = array() ){ $ret = null; if ( function_exists( 'curl_init' ) ){ if ( ( $curl = curl_init() ) !== false ){ curl_setopt( $curl , CURLOPT_HEADER , false ); curl_setopt( $curl , CURLOPT_FOLLOWLOCATION , true ); curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ); curl_setopt( $curl , CURLOPT_HTTPHEADER , $headers ); curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $method ); if ( count( $data ) ){ if ( strtoupper( $method ) == 'POST' ) curl_setopt( $curl , CURLOPT_POSTFIELDS , $data ); elseif ( count( $data ) ) $url = sprintf( '%s?%s' , $url , http_build_query( $data ) ); } curl_setopt( $curl , CURLOPT_URL , $url ); $ret = curl_exec( $curl ); $err = curl_error( $curl ); $ern = curl_errno( $curl ); curl_close( $curl ); if ( $ern ) trigger_error( sprintf( 'cURL[ %d ]: %s' , $ern , $err ) , E_USER_ERROR ); } else trigger_error( 'cURL: Não foi possível iniciar cURL' , E_USER_ERROR ); } else trigger_error( 'É necessário ter cURL instalada.' , E_USER_ERROR ); return $ret; } /** * @package com.google.code.components.climatempo. * * Classe que realiza o mapeamento da URL do site climatempo.com.br que retorna * um arquivo XML dinamico contendo informações sobre a temperatura de uma determinada * cidade que é informada pelo parametro da URL (CODCIDADE). * O acesso aos dados finais é feita por apenas um método publico da classe, o * metodo getTemperaturas. * * @author Carlos Alberto Junior. * */ class ClimaTempoMap { private $id_cidade; private $url; private $temperaturas; function ClimaTempoMap($id_cidade){ $this->id_cidade = $id_cidade; $this->url = "http://selos.climatempo.com.br/selos/MostraSelo.php?CODCIDADE=2504"; $this->temperaturas = array(); // Prepara os dados. $this->mapDataFromXML(); } /** * Formata os dados que estão contidos no arquivo XML gerado pela URL do site * climatempo. * * @return void */ private function mapDataFromXML(){ $this->temperaturas = array(); if($this->id_cidade == ''){ $this->temperaturas = 'CHAVE_DA_CIDADE_EM_BRANCO'; echo $this->temperaturas; } if(is_double($this->id_cidade)){ $this->temperaturas = 'CHAVE_DA_CIDADE_INVALIDA'; echo $this->temperaturas; } try { // Carrega o arquivo XML renderizado para uma variavel local. // e instancia um novo objeto SimleXMLElement para permitir o acesso // a arvore de tags e atributos. $conteudo = utf8_decode(curl_get_contents($this->getUrl().$this->getIdCidade())); $xml = new SimpleXMLElement($conteudo); if($xml == null){ return 'CIDADE_NAO_ENCONTRADA'; echo $this->temperaturas; } else { // Percorre os nós das tags de elementos da cidade buscando cada um // dos seus atributos e populando objetos ClimaTempo para coloca-los // em um Array. foreach ($xml->xpath('//cidade') as $cidade) { $c = new ClimaTempo(); $c->setCidade (utf8_decode($cidade['nome'])); $c->setData (utf8_decode($cidade['data'])); $c->setMinima (utf8_decode($cidade['low'])); $c->setMaxima (utf8_decode($cidade['high'])); $c->setComentario (utf8_decode($cidade['frase'])); $c->setProbabilidade (utf8_decode($cidade['prob'])); $c->setIcone (utf8_decode($cidade['ico'])); $c->setQtdeChuva ($cidade['mm']); $c->setId ($this->getIdCidade()); $this->addElement($c); } } } catch(Exception $e) { // TODO : Auto generated $e->getMessage(); } return $this->getTemperaturas(); } /** * Retorna a validade de um determinado valor String como sendo um numero ou * não. * * @return Boolean true caso o numero seja realmente um numero valido. */ private function isNumber(){ return is_integer($this->getIdCidade()); } /** * Método getter que retorna um Array de objetos ClimaTempo após o mesmo ter * sido carregado com objetos ClimaTempo que foram convertidos da URL que * continha o XML. * * @return Array<ClimaTempo> temperaturas com todos os objetos encontrados * dentro do arquivo XML. */ public function getTemperaturas(){ return $this->temperaturas; } /** * Retorna a URL do site climatempo * * @return String url */ private function getUrl(){ return $this->url; } /** * Retorna o id da cidade a ser carregada os dados para o XML. * * @return Integer id_cidade */ private function getIdCidade(){ return $this->id_cidade; } /** * Adiciona um objeto ClimaTempo dentro do Array<ClimaTempo> * * @param ClimaTempo $c */ private function addElement(ClimaTempo $c){ $this->temperaturas[] = $c; } } ?> e por fim o Idex.php <?php try { require_once("ClimaTempo.class.php"); require_once("ClimaTempoMap.class.php"); // id da cidade...pode ser consultado no site www.climatempo.com.br $map = new ClimaTempoMap(2504); $dados = $map->getTemperaturas(); if(is_array($dados)) { foreach($dados as $c) { echo $c."<br>"; } } else { echo $dados; } } catch (Exception $e){ echo "Uma exceção ocorreu: ".$e->getMessage().""; } ?> ----------------------------------- Compartilhar este post Link para o post Compartilhar em outros sites