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.