<?
/*
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
?>
[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.
[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');
[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.