Cotação do Dólar e outras moedas

Publicado por Fábio Berbert de Paula (última atualização em 02/12/2015)

[ Hits: 15.688 ]

Homepage: https://www.instagram.com/alexabolada/

Download class.UOLCotacoes.php

Download 1445974778.class.UOLCotacoes.php (versão 2)

Download cotacao.html (versão 3)




Criei esta classe PHP para extrair as cotações das principais moedas usando como fonte de consulta o site de Economia da UOL.

Exemplo de uso:

<?
//importar a classe
require("class.UOLCotacoes.php");

$uol = new UOLCotacoes(); // criar uma instancia da classe

//receber os valores
list($dolarComercialCompra, $dolarComercialVenda, $dolarTurismoCompra, $dolarTurismoVenda, $euroCompra, $euroVenda, $libraCompra, $libraVenda, $pesosCompra, $pesosVenda) = $uol->pegaValores();
?>

A partir do código acima você já tem os valores de câmbio do Dólar, Euro, Libra e Pesos Argentino.

  



Versões atualizadas deste script

Versão 2 - Enviado por Jailson em 27/10/2015

Changelog: Removido a função split() que retornava aviso no PHP.

Download 1445974778.class.UOLCotacoes.php


Versão 3 - Enviado por Fábio Berbert de Paula em 02/12/2015

Changelog: Nova versão, mas desta vez usando somente jQuery.

Download cotacao.html


Esconder código-fonte

<?
/*
   class.uolCotacoes.php - classe usada para extrair as cotações de moedas 
   do dia junto ao site de Economia da UOL - economia.uol.com.br/cotacoes/

   Autor: Fábio Berbert de Paula <fberbert@gmail.com>
   http://www.vivaolinux.com.br/~fabio

   17/01/2013
   Versão: 1.0
*/

class UOLCotacoes {

   public function pegaValores() {

      // o fopen também funciona para arquivos da rede, uau!
      if(!$fp=fopen("http://economia.uol.com.br/cotacoes/" ,"r" )) { 
         echo "Erro ao abrir a página de cotação" ; 
         return(0);
      } 

      //variáveis de classe
      $arrayValores = array();

      //inicio do processamento - ler página
      $uolHTML = "";
      while(!feof($fp)) { // leia o conteúdo da página, uma linha por vez, armazene na variável uolHTML
         $uolHTML .= fgets($fp); 
      }
      fclose($fp);

      /* o bloco do código HTML referente a cotação é assim:

      <td class="pg-color4"><a href="http://economia.uol.com.br/cotacoes/cambio/dolar-comercial-estados-unidos/">Dólar com.</a></td>
      <td>2,0435</td>
      <td>2,0442</td>

      Então o que farei é extrair os valores 2,0435 (compra) e 2,0442 (venda)
      O mesmo conceito se repete para as demais cotações
      */

      //array contendo as expressoes regulares que indicam cada moeda
      $patterns = array(
         "dolarComercial" => "/pg-color4.*dolar-comercial-estados-unidos/",
         "dolarTurismo"   => "/pg-color4.*dolar-turismo-estados-unidos/",
         "euro"  => "/pg-color4.*euro-uniao-europeia/",
         "libra" => "/pg-color4.*libra-esterlina/",
         "pesos" => "/pg-color4.*peso-argentina/",
      );


      $uolHTML = preg_replace("/.*div id=.cambio.>/", "", $uolHTML); 
      $uolHTML = preg_replace("/<tr>/", "\n<tr>", $uolHTML); //acrescentar quebra de linha
      $uolHTML = preg_replace("/<td/", "\n<td", $uolHTML); //acrescentar quebra de linha

      $arrayHTML = split("\n", $uolHTML);


      //loop para cada moeda
      while( list($moeda, $pattern) = each($patterns) ) {

         $arrayHTML = split("\n", $uolHTML);

         //loop por cada linha da pagina HTML
         while ( list($indice, $linha) = each($arrayHTML) ) {

            //se bloco HTML casa com a pattern da moeda do looping atual...
            if (preg_match($pattern, $linha)) {

               //print "Encontrei '$pattern' em: $linha\n\n";

               //ler proxima linha
               $linha = $arrayHTML[++$indice]; 

               //pegar cotacao compra
               preg_match("/<td>(.*)<\/td>/", $linha, $valor);
               $compra = $valor[1];

               //ler proxima linha
               $linha = $arrayHTML[++$indice]; 

               //pegar cotacao venda
               preg_match("/<td>(.*)<\/td>/", $linha, $valor);
               $venda = $valor[1];

               //atribuindo valores ao array de retorno
               array_push($arrayValores, $compra, $venda);
            }

         } // fim while

      } // fim while

      return($arrayValores);

   } //fim function pegaValores

} //fim classe
?> 

Scripts recomendados

Função que identifica acentos em palavras (strings)

Função Retira Acentos php

Validar CPF ou CNPJ na mesma função

Formata número em Moeda

Data PHP em extenso em português (pt-br)


  

Comentários
[1] Comentário enviado por guilhermemuller em 22/10/2014 - 11:01h

Como faço para exibir estes dados?

[2] Comentário enviado por fabio em 22/10/2014 - 13:23h

Guilherme,

Dê uma lida na descrição do script. Lá tem um trecho de código que exemplifica como usar a classe.

[]'s

[3] Comentário enviado por Nilmaicon em 06/07/2015 - 19:55h

Parabéns Fábio, muito bom!!!

[4] Comentário enviado por thiagopm em 02/12/2015 - 08:38h


Galera, eu olhei a classe na versão 2, porém não consegui, de forma alguma, buscar o valor da variação da moeda.
O valor da variação da moeda está na mesma linha que os valores de cotação. Alguém poderia me dar um auxilio nisso?
Agradeço desde já.

[5] Comentário enviado por fabio em 02/12/2015 - 12:06h


[4] Comentário enviado por thiagopm em 02/12/2015 - 08:38h


Galera, eu olhei a classe na versão 2, porém não consegui, de forma alguma, buscar o valor da variação da moeda.
O valor da variação da moeda está na mesma linha que os valores de cotação. Alguém poderia me dar um auxilio nisso?
Agradeço desde já.


Neste caso é necessário atualizar a regexp prevendo o conteúdo em apenas uma linha. Esse é o problema, toda vez que o site muda temos que atualizar a regexp. O ideal seria você se aprofundar em expressões regulares para conseguir fazer manutenção no script.

P.S.: Acabei de subir uma versão atualizada usando jQuery (JavaScript), dê uma olhada aqui.

[6] Comentário enviado por thiagopm em 02/12/2015 - 14:32h

Eu já pesquisei bastante sobre expressões regulares, porém, a dificuldade que encontrei foi conseguir buscar o sinal ( + ou -) da variação do preço da moeda. Eu consigo buscar o valor, sem problemas, porém esse sinal tá me dando trabalho.
Você teria alguma dica para estar buscando a variação? Acredito que não deva ser tão complicado, considerando que esta tudo na mesma linha do valor das cotações, e a classe na versão 2 esta funcionando perfeitamente.

[7] Comentário enviado por eumanito em 09/04/2016 - 10:46h

Estou com um problema, utilizando um servidor da Kinghost a função fopen("http://economia.uol.com.br/cotacoes/","r") está retornando um html diferente do correto.

Testei em outro servidor e funciona, vem certinho o conteúdo. O que parece é que o UOL detecta como um dispositivo mobile e lista o conteúdo adaptado, outro HTML, então a classe de cotações não encontra os dados.

Alguém tem alguma ideia?

[8] Comentário enviado por fabio em 11/04/2016 - 08:39h


[7] Comentário enviado por eumanito em 09/04/2016 - 10:46h

Estou com um problema, utilizando um servidor da Kinghost a função fopen("http://economia.uol.com.br/cotacoes/","r") está retornando um html diferente do correto.

Testei em outro servidor e funciona, vem certinho o conteúdo. O que parece é que o UOL detecta como um dispositivo mobile e lista o conteúdo adaptado, outro HTML, então a classe de cotações não encontra os dados.

Alguém tem alguma ideia?


Você pode tentar forçar um user-agent para o fopen. Tente colocar este código no início do script:

ini_set('user_agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1) Gecko/20090615 Firefox/3.5');


[9] Comentário enviado por eumanito em 12/04/2016 - 09:46h

Funcionou , Fábio. Obrigado.

[10] Comentário enviado por paraander em 07/03/2017 - 02:35h

Esse extrai da infomoney, tbm no mesmo esquema de extração que o Fábio fez, https://blog.invettor.com.br/script-cotacao-dolar-infomoney/

[11] Comentário enviado por jbwestphal em 13/07/2017 - 15:05h

Olá! Estou usando o código e percebi que tem um delay grande de atualização dos valores das cotações. O que poderia ser, algum tipo de cache?
Estou apenas imprimindo os valores na tela, como teste, e comparei os valores no site da uol.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts