-
-
Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.
/* | |
* @return Acesse radaropcoes.com Retorna a cotação atual de um título específico do Tesouro Direto. | |
* Fonte: https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm | |
**/ | |
function TESOURODIRETO(bondName, argumento="r") { | |
let srcURL = "https://api.radaropcoes.com/bonds.json"; | |
let jsondata = UrlFetchApp.fetch(srcURL); | |
let parsedData = JSON.parse(jsondata.getContentText()).response; | |
for(let bond of parsedData.TrsrBdTradgList) { | |
let currBondName = bond.TrsrBd.nm; | |
if (currBondName.toLowerCase() === bondName.toLowerCase()) | |
if(argumento == "r") | |
return bond.TrsrBd.untrRedVal; | |
else | |
return bond.TrsrBd.untrInvstmtVal; | |
} | |
throw new Error("Título não encontrado."); | |
} |
Eu fiz uma aplicação em Go pra pegar as informações na API do tesouro e salvar em cache. Ela expoe uma API com dois endpoints pra puxar os dados (lista tudo ou por nome). Consegui fazer o bypass da Cloudflare usando uma lib que permite impersonar o chrome no request.
Tentei na AWS e GCP mas não rolou, devem bloquear todos os IPs das clouds grandes. Como eu só preciso disso localmente, joguei num Raspberry Pi que tenho aqui e funciona redondo.
Se alguém quiser usar de base o repo é esse: https://github.com/gabrielgasp/go-taxa-tesouro
Exportei uma collection do Postman no repo porque tava com preguiça de fazer README. Tem um .env.example simples e um Dockerfile pronto.
Edit: Consegui deployar no Railway e parece estar funcionando, só não sei quanto tempo vai durar, mas enquanto durar fiquem a vontade pra usar:
Listar todos: https://tesouro.gabrielgaspar.dev/bonds
Por nome: https://tesouro.gabrielgaspar.dev/bonds/{bondName} (usa hyphen no lugar dos espaços tipo tesouro-ipca+-2035)
Configurei pra rodar o scrapping a cada 5 min de segunda a sexta de 8h às 19h, vamos ver amanha durante o dia como fica.
Update 23/08/2024: estão bloqueando 🥲
Olá Pessoal, como maneira alternativa estou usando import xml do site https://taxas-tesouro.com, já usava assim antes mas até voltar a funcionar o script, da pra fazer dessa maneira.
Exemplo Titulo do IPCA+ 2045:
=VALUE(REGEXREPLACE(importxml(concat("https://taxas-tesouro.com/resgatar/","tesouro-ipca+-2045/"),"normalize-space(/html/body/div/div[1]/div/div[2]/main/div/div/div[1]/div[4]/div[2]/span)"),"[^\d.]",""))*1000
Como Fazer:
Só alterar a URL do titulo que deseja e incluir o xpath full no local indicado.
=VALUE(REGEXREPLACE(importxml(concat("https://taxas-tesouro.com/resgatar/","TITULO AQUI"),"normalize-space(XPATHFULL-AQUI)"),"[^\d.]",""))*1000
Olá Pessoal, como maneira alternativa estou usando import xml do site https://taxas-tesouro.com, já usava assim antes mas até voltar a funcionar o script, da pra fazer dessa maneira.
Exemplo Titulo do IPCA+ 2045:
=VALUE(REGEXREPLACE(importxml(concat("https://taxas-tesouro.com/resgatar/","tesouro-ipca+-2045/"),"normalize-space(/html/body/div/div[1]/div/div[2]/main/div/div/div[1]/div[4]/div[2]/span)"),"[^\d.]",""))*1000
Como Fazer:
Só alterar a URL do titulo que deseja e incluir o xpath full no local indicado.
=VALUE(REGEXREPLACE(importxml(concat("https://taxas-tesouro.com/resgatar/","TITULO AQUI"),"normalize-space(XPATHFULL-AQUI)"),"[^\d.]",""))*1000
O problema é que o https://taxas-tesouro.com/ também parece estar sofrendo bloqueio pra buscar as informações do Tesouro. Se você reparar, a última atualização que ele tem é do dia 19.
@carmodurante eu cogitei essa solução, vai uma potencial dica pra vc:
Se olhar os Response Headers do https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json
server: cloudflare
x-frame-options: SAMEORIGIN
x-frame-options: ALLOW-FROM http://bvmf.bmfbovespa.com.br, http://www2.bmfbovespa.com.br, http://www.bmf.com.br, http://www2.bmf.com.br, https://www2.cetip.com.br, http://estatisticas.cetip.com.br/
Não manjo disso, mas to interpretando que esses domínios acima talvez tenham permissão de chamada dessa API, sem incorrer no problema que estamos tendo.
Talvez se encontrar aonde nos sites desses domínios estejam usando o api/treasurybondsinfo.json, daria pra usar o importxml neles.
Eu não sou muito bom em programação, por acaso alguém conseguiu criar um script ou função para o google planilha para capturar as taxas do Tesouro Direto do site "https://www.tesouroinfo.com/", ele esta com as taxas atualizadas diferente do site "https://taxas-tesouro.com/ " que estão com as taxas congelas desde o dia 19. Talvez com esse script resolva nossos problemas....
Se alguém puder ajudar e colocar o código aqui no grupo, agradeço
Pra pegar o IPCA+ 2029 eu fiz assim:
=IMPORTXML("https://www.tesouroinfo.com/"; "/html/body/div[1]/div[3]/table[1]/tbody/tr[18]/td[5]/text()")
O segundo parametro é o xpath. Pra pegar faz como o @carmodurante explicou no screenshot.
@Celogol e @rafaelgp23
Estava tentando usar a API que o site do https://www.tesouroinfo.com/api-documentation diponibiliza mas fiz um teste e ainda ta em testes não disponibilizaram dados desse ano.
Como alternativa eu fiz um query direto do html mesmo utilizando a função IMPORTHTML, da pra usar de boas assim.
Aqui ele trás a tabela completa com os dados de todos os titulos, da pra brincar se alguem quiser:
Tabela Resgatar:
=importhtml("https://www.tesouroinfo.com/","table",4)
Tabela Investir:
=importhtml("https://www.tesouroinfo.com/","table",2)
Se quiserem utilizar de uma forma que retorne apenas o valor de um titulo especifico só utilizar essa formula:
=REGEXREPLACE(QUERY(query(importhtml("https://www.tesouroinfo.com/","table",4), "select Col5 where Col2 = 'Ipca+ 2045' ", -1), "SELECT * OFFSET 1", 0),"[^\d.]","")*1000
Para alterar o titulo que retorna é só mudar na formula o Col2 = 'Nome Titulo' de acordo com o nome que esta na tabela.
Desse jeito via IMPORTHTML é melhor do que fazer pelo importxml e fullpath que falei ali acima, porque qualquer alteração na tela ele já para de funcionar, e esse aqui pega direto a tabela e fazemos a manipulação dos dados em cima dela.
@carmodurante : o tesouroinfo.com está com as taxas atualizadas? Não estão sofrendo do mesmo problema também?
De qualquer maneira, o site tesouroinfo.com tá retornando HTTP error 500 aqui.
@tuliopascoal Que estranho aqui esta normal, pode ser que tenha caido de madrugada pra alguma atualização.
E sim está atualizado, mas api que está sendo chamanda no site não está exposta, esta vindo do google analytics, e a que eles disponibilizaram é meme.
Então por enquanto com IMPORTHTML é oque está funcionando pra mim, até achar alguma API utilizavel.
@carmodurante Obrigado meu caro. Confirmo que o sistema do TesouroInfo voltou ao normal aqui, e conseguir fazer as alterações necessárias na minhas tabelas.
Enquanto isso, vamos aguardar a situação do bloqueio da CloudFare :(
@carmodurante Obrigado. Se puder, favor me tirar uma dúvida.
Com o =importhtml("https://www.tesouroinfo.com/";"table";4), funcionou trocando as vírgulas por ponto e vírgula.
Tentei fazer o mesmo com o =REGEXREPLACE(QUERY(query(importhtml("https://www.tesouroinfo.com/";"table";4), "select Col5 where Col2 = 'Ipca+ 2045' ", -1), "SELECT * OFFSET 1", 0),"[^\d.]","")*1000
trocando todas as vírgulas por ponto e vírgula e como acima, mesclando. Deu erro em ambas.
@carmodurante Obrigado. Se puder, favor me tirar uma dúvida. Com o =importhtml("https://www.tesouroinfo.com/";"table";4), funcionou trocando as vírgulas por ponto e vírgula. Tentei fazer o mesmo com o =REGEXREPLACE(QUERY(query(importhtml("https://www.tesouroinfo.com/";"table";4), "select Col5 where Col2 = 'Ipca+ 2045' ", -1), "SELECT * OFFSET 1", 0),"[^\d.]","")*1000 trocando todas as vírgulas por ponto e vírgula e como acima, mesclando. Deu erro em ambas.
Para mim estava a dar erro, mas retirei o REGEXREPLACE e funcionou:
=QUERY(query(importhtml("https://www.tesouroinfo.com/";"table";4); "select Col5 where Col2 = 'Selic 2027' "; -1); "SELECT * OFFSET 1"; 0)
@carmodurante Obrigado. Se puder, favor me tirar uma dúvida. Com o =importhtml("https://www.tesouroinfo.com/";"table";4), funcionou trocando as vírgulas por ponto e vírgula. Tentei fazer o mesmo com o =REGEXREPLACE(QUERY(query(importhtml("https://www.tesouroinfo.com/";"table";4), "select Col5 where Col2 = 'Ipca+ 2045' ", -1), "SELECT * OFFSET 1", 0),"[^\d.]","")*1000 trocando todas as vírgulas por ponto e vírgula e como acima, mesclando. Deu erro em ambas.
Para mim estava a dar erro, mas retirei o REGEXREPLACE e funcionou: =QUERY(query(importhtml("https://www.tesouroinfo.com/";"table";4); "select Col5 where Col2 = 'Selic 2027' "; -1); "SELECT * OFFSET 1"; 0)
Para mim deu certo. Como faço para selecionar o IPCA+ 2045, uma vez que está dando erro, acredito que seja devido ao caracter especial '+'?
QUERY(query(importhtml("https://www.tesouroinfo.com/";"table";4); "select Col5 where Col2 = 'Selic 2027' "; -1); "SELECT * OFFSET 1"; 0)
Como mostrar como número e não texto ? A funcao VALUE deu erro...
@carmodurante Obrigado. Se puder, favor me tirar uma dúvida. Com o =importhtml("https://www.tesouroinfo.com/";"table";4), funcionou trocando as vírgulas por ponto e vírgula. Tentei fazer o mesmo com o =REGEXREPLACE(QUERY(query(importhtml("https://www.tesouroinfo.com/";"table";4), "select Col5 where Col2 = 'Ipca+ 2045' ", -1), "SELECT * OFFSET 1", 0),"[^\d.]","")*1000 trocando todas as vírgulas por ponto e vírgula e como acima, mesclando. Deu erro em ambas.
Para mim estava a dar erro, mas retirei o REGEXREPLACE e funcionou: =QUERY(query(importhtml("https://www.tesouroinfo.com/";"table";4); "select Col5 where Col2 = 'Selic 2027' "; -1); "SELECT * OFFSET 1"; 0)
Para mim deu certo. Como faço para selecionar o IPCA+ 2045, uma vez que está dando erro, acredito que seja devido ao caracter especial '+'?
IPCA+2045:
=IMPORTXML("https://www.tesouroinfo.com/";"//table[@id='table_investir']//tr[td='Ipca+ 2045']/td[3]/text()")/100
Usando importxml com xpath acho melhor, vale a pena aprender a usar xpath.
Pessoal, vocês confirmam que esse site tesouroinfo.com está realmente atualizando/sincronizando as taxas e todos os valores igualzinho o https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm?
Antes de discutir formulas pra puxar os valores (< isso tá facil), o principal é discutir que essa fonte realmente é confiável e com sincronia real-time. Antes tinhamos uma API oficial do tesourodireto, agora estamos todos nos baseando num site terceiro, não sei se dá pra garantir que é uma boa fonte de informação.
IMPORTXML("https://www.tesouroinfo.com/";"//table[@id='table_investir']//tr[td='Ipca+ 2045']/td[3]/text()")/100
Deu certo.
Uso uma planilha para controle pessoal, estava atualizando uma vez por semana para contornar esse problema, independente do preciosismo da fonte ser real-time ou se tem a mesma confiabilidade da fonte oficial, estou usando a seguinte fórmula, onde a célula A84 contém o nome do título como consta do site "tesouroinfo.com", e está funcionando muito bem:
=IMPORTXML("https://www.tesouroinfo.com/"; "//table[@id='table_resgatar']//tr[td='" & A84 & "']/td[4]/text()")
A fórmula está retornando o "Preço de venda", que é a informação que desejo, alterando o índice em "td[4]/" podemos obter outras informações sobre o título.
Uso uma planilha para controle pessoal, estava atualizando uma vez por semana para contornar esse problema, independente do preciosismo da fonte ser real-time ou se tem a mesma confiabilidade da fonte oficial, estou usando a seguinte fórmula, onde a célula A84 contém o nome do título como consta do site "tesouroinfo.com", e está funcionando muito bem:
=IMPORTXML("https://www.tesouroinfo.com/"; "//table[@id='table_resgatar']//tr[td='" & A2 & "']/td[4]/text()")
A fórmula está retornando o "Preço de venda", que é a informação que desejo
Romulo, perfeito, meu caso é o mesmo, incluí a fórmula no Google Sheets trocando a célula referência onde incluí o nome como aparece no site "tesouroinfo.com", porém dá a mensagem ERRO:carregando os dados, O que pode estar errado, pois mesmo digitando direto o nome do título sem referenciar, o erro persiste... ?
Olá Renato! Não sei se funciona para todos os títulos eu usei os seguintes nomes nas células "A81:A86":
Selic 2027
Selic 2029
Ipca+ 2035
Ipca+ 2029
Ipca+ 2026
Funcionou tudo perfeito. Transcrevo a seguir a fórmula novamente, espero que funcione para você:
=IMPORTXML("https://www.tesouroinfo.com/"; "//table[@id='table_resgatar']//tr[td='" & A81 & "']/td[4]/text()")
Essa fórmula esta funcionando agora, mas acho que eventualmente irão derrubar, pois eles possuem uma API de consulta:
=IMPORTXML("https://www.tesouroinfo.com/"; "//table[@id='table_resgatar']//tr[td='" & PROPER(TRIM(CLEAN(A2))) & "']/td[4]/text()")
@danperrout , tentei agora com o nome do título e retornou N/A. Parou de novo ou errei algo?
=IMPORTXML("https://www.tesouroinfo.com/"; "//table[@id='table_resgatar']//tr[td='" & PROPER(TRIM("Tesouro Prefixado 2029")) & "']/td[4]/text()")
#N/A
@danperrout , tentei agora com o nome do título e retornou N/A. Parou de novo ou errei algo? =IMPORTXML("https://www.tesouroinfo.com/"; "//table[@id='table_resgatar']//tr[td='" & PROPER(TRIM("Tesouro Prefixado 2029")) & "']/td[4]/text()") #N/A
tem que ser com o nome do titulo que está na página. Nesse caso seria "Prefixado 2029"
=IMPORTXML("https://www.tesouroinfo.com/"; "//table[@id='table_resgatar']//tr[td='" & PROPER(TRIM(CLEAN(A2))) & "']/td[4]/text()")
Romulo, muito obrigado, depois de umas 2 horas o IPCA+ 2029 apareceu ok, mas se mudo para Ipca+ 2035 dá o mesmo erro e fica pendurado carregando, muito estranho.
após um bom tempo rodou...Obrigado!
Antes de discutir formulas pra puxar os valores (< isso tá facil), o principal é discutir que essa fonte realmente é confiável e com sincronia real-time. Antes tinhamos uma API oficial do tesourodireto, agora estamos todos nos baseando num site terceiro, não sei se dá pra garantir que é uma boa fonte de informação.
No momento que posto este comentário:
https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm - Última atualização: 02/09/2024 • 09h26min
https://www.tesouroinfo.com/ - Última atualização: | 30/Ago/2024 15:36
Como suspeitava, não dá pra confiar 100% no site de terceiro. Talvez seja mais um workaround. O ideal seria reestabelecer acesso ao API oficial.
Acessei agora e os dois estão sincronizados.
Tenho acompanhado os dois e estão sempre sincronizados, as vezes demora algumas horas, mas me parece que da pra utilizar.
Eu vou utilizar..
o site https://www.tesouroinfo.com/ está fora do ar? ou é só na minha máquina?
o site https://www.tesouroinfo.com/ está fora do ar? ou é só na minha máquina?
aqui também está fora
via selenium:
https://github.com/BDonadelli/Finance-playground/blob/main/DT_TesouroDireto_Dia_planilha_v2.ipynb
PS: um possibilidade é por no agendador de tarefas da sua maquina o script https://github.com/BDonadelli/Finance-playground/blob/main/DT_TesouroDireto_Dia.py para executar na frequencia q quiser. Ele faz uma copia do conteudo do tesouro para seu github (no meu caso https://raw.githubusercontent.com/BDonadelli/Finance-playground/main/data/tesouro_direto.json)
Na api do googlesheets , TesouroDireto.gs, troque a url do tesouro por essa do github (https://raw.githubusercontent....)
(assumindo que sua máquina conversa com o GitHub)