Pesquisa personalizada

2005/08/07

Na falta de um webservice: Como obter a última cotação do dólar diretamente do BACEN.

No website do SIBPROvider eu necessito obter o valor da última cotação do dólar comercial, pois devido ao preço do SIBPROvider estar em Dólar eu preciso convertê-lo para Real. Para obter a cotação, eu utilizo uma página do Banco Central que a fornece. A questão é que a página está em html e como vocês devem saber o ideal é que a cotação fosse fornecida por meio de um webservice. Até onde eu sei, o BACEN não fornece um serviço do tipo. Antes de criar a solução que relato, eu pesquisei se não haveria um webservice gratuito e confiável que fornecesse a cotação. Também, não encontrei. Encontrei, sim, serviços pagos. Em decorrência, optei por usar a cotação da página do BACEN. É esta a solução que repasso a seguir.

A solução que proponho é bem simples. Basicamente o que se deve fazer é realizar um requisição do tipo GET por meio do protocolo HTTP ao website do BACEN solicitando a página que fornece a cotação, ou seja, a grosso modo deve-se fazer o que um browser faria para obter a página. O endereço da página é: http://www.bacen.gov.br/htms/infecon/taxas/taxas.htm

No caso do website do SIBPROvider eu fiz essa tarefa em uma página ASP usando VBScript, mas a mesma lógica pode ser usada em .NET, Java, Delphi, Visual Basic, C/C++, Perl, PHP e em qualquer linguagem\tecnologia que seja possível realizar uma requisição HTTP.

Solução usando ASP & VBScript

Para realizar o acesso à página de cotação do dólar do BACEN, eu optei por usar o componente Msxml2.ServerXMLHttp. Este é um componente auxiliar que é fornecido juntamente com o pacote de componentes do SDK XML da Microsoft. Este componente já está instalado em máquina com Internet Explorer 5 (ou superior) e também em plataformas Windows 2000 (ou superiores). A vantagem deste componente é que ele torna fácil o acesso a HTTP. Por exemplo, no VBScript abaixo estamos solicitando a página de cotação do dólar no website do BACEN. Veja:

'O código abaixo obtém a página com a cotação do dólar no BACEN

'Endereço da página que desejamos acessar
const URL "http://www.bacen.gov.br/htms/infecon/taxas/taxas.htm"
dim xmlhttp

'Obtemos uma instância do objeto XMLHTTP
'Com ele se acessa a página
set xmlhttp CreateObject("Msxml2.ServerXMLHttp")

'Abrimos uma conexão com o servidor da URL
xmlhttp.Open "GET"URLfalse
'Enviamos o pedido
xmlhttp.Send

'Obtemos a resposta com a página HTML da URL
MsgBox xmlhttp.ResponseText

'Finalizamos o objeto
set xmlhttp nothing

Se desejar, você pode baixar este script.

De posse da página HTML com a cotação, devemos extrair dela os dados que nos interessam. No caso, o valor e a data dessa cotação. Optei por fazer isso utilizando expressões regulares, mas acredito que você possa fazer isso simplesmente fazendo uma busca no texto da página. A vantagem das expressões regulares é que ela torna mais fácil esse processo de extração de dados. Vejam o código VBScript anterior modificado para extrair o valor e a data da cotação do resultado do pedido:

'O código abaixo obtém a página com a cotação do dólar no BACEN

'Endereço da página que desejamos acessar
const URL "http://www.bacen.gov.br/htms/infecon/taxas/taxas.htm"
'Expressão regular para se obter o dia da cotação
const REGEXDIA " no dia (([0-9][0-9]{0,1}).([0-9][0-9]{0,1}).([0-9]{4}))"
'Expressão regular para se obter o valor da cotação
const REGEXVALOR "2"">([0-9]{1,12},{0,1}[0-9]{0,12})</td></tr></table>"

dim xmlhttprgexpMatchesDolarDiahtml

'Obtemos uma instância do objeto XMLHTTP
'Com ele se acessa a página
set xmlhttp CreateObject("Msxml2.ServerXMLHttp")
'Abrimos uma conexão com o servidor da URL
xmlhttp.Open "GET"URLfalse
'Enviamos o pedido
xmlhttp.Send
'Obtemos a resposta com a página HTML da URL
html xmlhttp.ResponseText
'Finalizamos o objeto
set xmlhttp nothing

'Instânciamos o objeto de expressões regulares
set rgexp new RegExp

'Inicializamos o objeto
rgexp.Pattern REGEXDIA
'Buscamos as expressões regulares
set Matches rgexp.Executehtml )
'Montamos a data da última cotação
Dia DateSerialMatches(0).SubMatches(3), Matches(0).SubMatches(2), Matches(0).SubMatches(1) )

'Inicializamos o objeto
rgexp.Pattern REGEXVALOR
'Buscamos as expressões regulares
set Matches rgexp.Executehtml )
'Obtemos o valor na forma de texto
Dolar Matches(0).SubMatches(0)

'Convertemos a string com o valor
'para um valor numerico.
'Se o seu SO for inglês, desrenomei a linha abaixo.
'Dolar = Replace( Dolar, ",", "." )
Dolar cCurDolar )

'Finalizamos o objeto
set rgexp nothing

MsgBox "Data última cotação " Dia &  vbCrLf & _
       
"Valor R$ " Dolar

Feito isso, já temos nosso script que obtém a data e valor da última cotação do dólar. Basta agora que adaptemos esse código a página ASP. Abaixo segue este o código do script acima adaptado para uma página ASP. Se você desejar, faça o download deste código ASP.

<html>
<
head>
<
title>Última Cotação Válida do Dólar</title>
</
head>
<
body>

<%
'O código abaixo obtém a página com a cotação do dólar no BACEN

'Endereço da página que desejamos acessar
const URL "http://www.bacen.gov.br/htms/infecon/taxas/taxas.htm"
'Expressão regular para se obter o dia da cotação
const REGEXDIA " no dia (([0-9][0-9]{0,1}).([0-9][0-9]{0,1}).([0-9]{4}))"
'Expressão regular para se obter o valor da cotação
const REGEXVALOR "2"">([0-9]{1,12},{0,1}[0-9]{0,12})</td></tr></table>"

dim xmlhttprgexpMatchesDolarDiahtml

'Obtemos uma instância do objeto XMLHTTP
'Com ele se acessa a página
set xmlhttp CreateObject("Msxml2.ServerXMLHttp")
'Abrimos uma conexão com o servidor da URL
xmlhttp.Open "GET"URLfalse
'Enviamos o pedido
xmlhttp.Send
'Obtemos a resposta com a página HTML da URL
html xmlhttp.ResponseText
'Finalizamos o objeto
set xmlhttp nothing

'Instânciamos o objeto de expressões regulares
set rgexp new RegExp

'Inicializamos o objeto
rgexp.Pattern REGEXDIA
'Buscamos as expressões regulares
set Matches rgexp.Executehtml )
'Montamos a data da última cotação
Dia DateSerialMatches(0).SubMatches(3), Matches(0).SubMatches(2), Matches(0).SubMatches(1) )

'Inicializamos o objeto
rgexp.Pattern REGEXVALOR
'Buscamos as expressões regulares
set Matches rgexp.Executehtml )
'Obtemos o valor na forma de texto
Dolar Matches(0).SubMatches(0)

'Convertemos a string com o valor
'para um valor numerico.
'Se o seu SO for inglês, desrenomei a linha abaixo.
'Dolar = Replace( Dolar, ",", "." )
Dolar cCurDolar )

'Finalizamos o objeto
set rgexp nothing

%>

Abaixoestão os dados da última cotação do dólar.
Data: <%=Dia%><br>
Valor R$: <%=Dolar%>

</
body>
</
html>

Labels: