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", URL, false
'Enviamos o pedido
xmlhttp.Send
'Obtemos a resposta com a página HTML da URL
MsgBox xmlhttp.ResponseText
'Finalizamos o objeto
set xmlhttp = nothing
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 xmlhttp, rgexp, Matches, Dolar, Dia, html
'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", URL, false
'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.Execute( html )
'Montamos a data da última cotação
Dia = DateSerial( Matches(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.Execute( html )
'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 = cCur( Dolar )
'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 xmlhttp, rgexp, Matches, Dolar, Dia, html
'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", URL, false
'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.Execute( html )
'Montamos a data da última cotação
Dia = DateSerial( Matches(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.Execute( html )
'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 = cCur( Dolar )
'Finalizamos o objeto
set rgexp = nothing
%>
Abaixo, estão os dados da última cotação do dólar.
Data: <%=Dia%><br>
Valor R$: <%=Dolar%>
</body>
</html>
Labels: it