No artigo de hoje, vamos demonstrar como consultar a cotação do dólar através de uma API do Banco Central.
Antes de começarmos, esse exemplo foi disponibilizado pelo grande Thiago Andrrade ( LinkedIn ).
O funcionamento é realizado uma busca na API Cotação do Dolar Ptax, que é uma API Oficial do Banco Central ( https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/documentacao ).
Basicamente você monta um FWRest, passa a informação de data atual, e os dados são retornados. Abaixo um print em um MsgInfo:
Abaixo o código fonte feito pelo Thiago:
#include "Totvs.ch"
#Include "Tbiconn.ch"
//=================================================================================
/*/{Protheus.doc} zApiDol
Api | Cotação do Dolar Ptax, Api Oficial do Banco Central
https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/documentacao
Api Dolar Ptax Banco Central x Advpl
@type function
@author Thiago.Andrrade
@since 04/03/2021
@version 1.1
/*/
//=================================================================================
User function zApiDol()
Local aHeader := {}
Local cDataPtx := ''//MM-DD-AAAA
Local oJsObj := JsonObject():New()
Local cJsonRt := ''
Local oRestClient := FWRest():New("https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata")
//Cabeçalho
aadd(aHeader,'User-Agent: Mozilla/4.0 (compatible; Protheus '+GetBuild()+')')
aAdd(aHeader,'Content-Type: application/json; charset=utf-8')
//Ajusta Padrão da Data para MM-DD-AAAA
cDataPtx := Dtos(dDataBase-1)
cDataPtx := SubStr(cDataPtx,5,2)+'-'+SubStr(cDataPtx,7,2)+'-'+SubStr(cDataPtx,1,4)
//[GET] Consulta Dados na Api
oRestClient:setPath("/CotacaoDolarDia(dataCotacao=@dataCotacao)?@dataCotacao='"+cDataPtx+"'&$format=json")
If oRestClient:Get(aHeader)
//Grava Retorno
cJsonRt := oJsObj:FromJson(oRestClient:CRESULT)
//Exibe Cotação
If ValType(cJsonRt) == 'U'
fViewCot(oJsObj)
Endif
//Limpa Objeto
FreeObj(oJsObj)
Endif
Return
//=================================================================================
/*/{Protheus.doc} fViewCot
Exibe Cotação
@author Thiago.Andrrade
@since 04/03/2021
/*/
//=================================================================================
Static Function fViewCot(oJsObj)
Local cMsg := ''
cMsg += "<b>Data:</b> "+Dtoc(Stod(StrTran(SubStr(oJsObj["value"][1]["dataHoraCotacao"],1,10),'-','')))
cMsg += " - "+SubStr(oJsObj["value"][1]["dataHoraCotacao"],12,5)+"h<br>"
cMsg += "<b>Cotação de Compra:</b> "+cValToChar(oJsObj["value"][1]["cotacaoCompra"])+"<br>"
cMsg += "<b>Cotação de Venda:</b> "+cValToChar(oJsObj["value"][1]["cotacaoVenda"])+"<br>"
MsgInfo(cMsg,"Cotação Dolar Ptax")
Return
Esse fonte também está disponível no GitHub do Thiago.
Update 28/06/2021:
O grande Maicon Macedo ( LinkedIn ), baseado no exemplo acima, também montou um, mas ao invés de usar FWRest, usando HTTPGet.
O motivo, é que algumas redes, bloqueiam recursos, inclusive esse caso de falha foi em um ambiente TCloud.
#include "Totvs.ch"
#include "Tbiconn.ch"
/*/{Protheus.doc} zApiMdCH
Função utilizada para buscar a cotação de determinada moeda em determinada data (período) no API Olinda disponibilizado pelo Banco Central (conforme documentação - vide url)
Neste fonte, utilizei a função HTTPGet para receber - via varíval de texto - a URL do CotacaoMoedaPeriodoFechamento da API Olinda do BC (acrescida dos parâmetros [codigoMoeda] e [dataInicialCotacao]/[dataFinalCotacao], a qual efetua o processamento da cotação da moeda indicada no período indicado. O retorno da função HTTPGet (texto) é transformado em um objeto JSon
Inicialmente, este fonte visa obter a cotação da Moeda Dólar em uma única data. Contudo, ele pode ser adaptado para obter a cotação de outras moedas e um período maior.
@type function
@author Maicon Macedo
@since 12/06/2021
@version 1.0
@sample U_zApiMdCH()
@url Dólar comercial (venda e compra) - cotações diárias e Taxas de Câmbio - todos os boletins diários - v1
https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/documentacao
https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/aplicacao#!/recursos
https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/$metadata
JsonObject - https://tdn.totvs.com/display/tec/Classe+JsonObject
HTTPGet - https://tdn.totvs.com/display/tec/HTTPGet
@history Maicon Macedo - 20210612 - Utilização do recurso CotacaoMoedaPeriodoFechamento para retornar os dados de cotação das moedas
/*/
User function zApiMdCH()
Local cBCApi := 'https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata'
Local cBCRec := ''
Local cGetParms := ''
Local nTimeOut := 200
Local aHeadStr := {'Content-Type: application/json'}
Local cHeadGet := ''
Local cRetorno := ''
Local cIdMoeda := 'USD'
Local cDtCot := '' //MM-DD-AAAA
Local oJsObj := JsonObject():New()
Local cJsonRt := ''
Local cMsg := ''
//Ajusta Padrão da Data para MM-DD-AAAA
cDtCot := DToS(dDataBase-1)
cDtCot := SubStr(cDtCot,5,2) + '-' + SubStr(cDtCot,7,2) + '-' + SubStr(cDtCot,1,4)
//[GET] Consulta Dados na Api Olinda
cBCRec += cBCApi
cBCRec += "/CotacaoMoedaPeriodoFechamento(codigoMoeda=@idMD,dataInicialCotacao=@dtIniCt,dataFinalCotacao=@dtFinCt)"
cBCRec += "?@idMD='"+cIdMoeda+"'&@dtIniCt='"+cDtCot+"'&@dtFinCt='"+cDtCot
cBCRec += "'&$format=json&$select=cotacaoCompra,cotacaoVenda,dataHoraCotacao,tipoBoletim"
cRetorno := HTTPGet( cBCRec , cGetParms, nTimeOut, aHeadStr, @cHeadGet )
cJsonRt := oJsObj:FromJson(cRetorno)
If ValType(cJsonRt) == 'U' //NIL
MsgInfo("JsonObject populado com sucesso!", ':: Cotação Moeda PTAX - BC API Olinda ::')
//Valida se a Cotação já está liberada para o dia - oJsObj:hasProperty("value")
If Len(oJsObj["value"]) > 0
cMsg += "<b>Data:</b> " + DToC(SToD(StrTran(SubStr(oJsObj["value"][1]["dataHoraCotacao"],1,10),'-','')))
cMsg += " - " + SubStr(oJsObj["value"][1]["dataHoraCotacao"],12,5) + "h<br>"
cMsg += "<b>Moeda: </b> " + cIdMoeda + "<br>"
cMsg += "<b>Cotação de Compra:</b> " + cValToChar(oJsObj["value"][1]["cotacaoCompra"]) + "<br>"
cMsg += "<b>Cotação de Venda:</b> " + cValToChar(oJsObj["value"][1]["cotacaoVenda"]) + "<br>"
MsgInfo( cMsg ,":: Cotação Moeda PTAX - BC API Olinda ::")
Endif
//Limpa Objeto
FreeObj(oJsObj)
Else
MsgStop("Ocorreu erro no processamento do Json" + CRLF+CRLF + cJsonRt, ':: Cotação Moeda PTAX - BC API Olinda ::')
EndIf
Return
Update Agosto de 2023:
Pessoal, foi disponibilizado no padrão do sistema, a atualização das moedas, através da rotina FINXTAXA, segue o link do TDN com a documentação: clique aqui.
Bom pessoal, por hoje é só.
Abraços e até a próxima.
