Cotação do Dólar e outras moedas

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

[ Hits: 15.905 ]

Homepage: https://fabio.automatizando.dev

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

Validar CPF ou CNPJ na mesma função

Quebrando nomes compostos

Formatação de Moeda

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

Expressão Regular para detectar o domínio em uma URL


  

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