Skip to content

Instantly share code, notes, and snippets.

@danperrout
Last active November 6, 2024 16:03
Show Gist options
  • Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.
Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.
API Função TESOURODIRETO Google Sheets
/*
* @return 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.");
}
@paulorobsonramos
Copy link

@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 '+'?

@renatofig
Copy link

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...

@rafaelgp23
Copy link

rafaelgp23 commented Aug 26, 2024

@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.

@paulorobsonramos
Copy link

IMPORTXML("https://www.tesouroinfo.com/";"//table[@id='table_investir']//tr[td='Ipca+ 2045']/td[3]/text()")/100

Deu certo.

@romulocampelo
Copy link

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.

@romulocampelo
Copy link

romulocampelo commented Aug 26, 2024

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

@renatofig
Copy link

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... ?

@romulocampelo
Copy link

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()")

@danperrout
Copy link
Author

danperrout commented Aug 26, 2024

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()")

@cristianoscaranci
Copy link

@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

@mateusguenter
Copy link

@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"

@renatofig
Copy link

=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.

@renatofig
Copy link

após um bom tempo rodou...Obrigado!

@rafaelgp23
Copy link

rafaelgp23 commented Sep 2, 2024

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.

@mateusguenter
Copy link

mateusguenter commented Sep 2, 2024

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..

@Nauahbanda
Copy link

o site https://www.tesouroinfo.com/ está fora do ar? ou é só na minha máquina?

@thiago-oc
Copy link

o site https://www.tesouroinfo.com/ está fora do ar? ou é só na minha máquina?

aqui também está fora

@vitroz
Copy link

vitroz commented Sep 2, 2024

Aqui esta fora tambem.
Po galera, aquele csv do tesouro transparente nao é confiavel?

É uma merda usar um arquivo de 11mb cheio de lixo, mas achei que fosse uma opcao viavel.
Vi que eles atualizaram ele hoje, mas abrindo o csv nao achei nenhum registro com data base 02/09/2024

Eu literalmente implementei um codigo ontem que filtra ele e pega os valores atualizados dos titulos, alguem sabe se é comum esse csv nao ser atualizado direito?

@epeixoto85
Copy link

Para atualização dos títulos existentes do Tesouro Direto, e dos preços e taxas de venda e compra, utilizava os seguintes serviços:

"https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json"
"https://www.tesourodireto.com.br/b3/tesourodireto/pricesAndFeesHistory?codigo=&periodo="

Ambos estão retornando erro 403, conforme algumas pessoas relataram anteriormente.

Alguém encontrou alguma alternativa?

@wroliveira1
Copy link

Aqui esta fora tambem. Po galera, aquele csv do tesouro transparente nao é confiavel?

É uma merda usar um arquivo de 11mb cheio de lixo, mas achei que fosse uma opcao viavel. Vi que eles atualizaram ele hoje, mas abrindo o csv nao achei nenhum registro com data base 02/09/2024

Eu literalmente implementei um codigo ontem que filtra ele e pega os valores atualizados dos titulos, alguem sabe se é comum esse csv nao ser atualizado direito?

atualizando uma vez por dia pra mim já está bom.
fuçando achei este, não sei se serve: https://ghostnetrn.github.io/bot-tesouro-direto/

@tuliopascoal
Copy link

Será que não valeria a pena entrar em contato com o criador do https://github.com/ghostnetrn/bot-tesouro-direto e perguntar como que ele ainda tá conseguindo utilizar a API do TesouroDireto (URL_API=https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json)??

@brvfr1
Copy link

brvfr1 commented Sep 6, 2024

Alegria de pobre dura pouco, o link não atualiza…

@alexbenfica
Copy link

Colocaram o Cloudflare na frente ou já tinha mas ativaram para que bots não possam acessar, exigindo aquela verificação de que é humano. :(

o 403 é do Cloudflare, tanto que funciona no navegador mas com scripts falha sempre.

Como eles não fornecem a chave de API para pessoas físicas, talvez a solução é baixar manualmente o arquivo quando se quiser ver a atualização. Alguma outra ideia?

@BDonadelli
Copy link

BDonadelli commented Sep 6, 2024

Alegria de pobre dura pouco, o link não atualiza…

aqui ainda funciona (com o selenium)

@tuliopascoal
Copy link

Coloquei o caminho "https://raw.githubusercontent.com/ghostnetrn/bot-tesouro-direto/714896cbcfc4100e241006cd29fef1bc3fcbcc65/tesouro.json" no script do Google Sheets e funcionou...

Eu coloquei esse link e funcionou no Google Sheets, mas o preço do título veio diferente.

O problema é que esse link é de um JSON estático. Se não me engano dia dia 05/09/2024.
Então ele sempre irá repetir os valores desse dia.

Alguém saberia alguma forma de pegar o JSON para o dia atual?

@danperrout
Copy link
Author

danperrout commented Oct 18, 2024

Pessoal, implementei minha própria abstração do json do Tesouro Direto. Na verdade, é uma cópia exata do JSON fornecidos por eles que pode ser acessado em:
Oficial: https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json
Mirror: https://api.radaropcoes.com/bonds.json

Esse json é atualizado de 15 em 15 minutos, mas o próprio TD só atualiza de hora em hora, por isso as datas podem estar "atrasadas" em algumas horas.

Fiquem a vontade para utilizar, além disso, no site Radar Opções, incluí a possibilidade de COPIAR o nome do Título para a área de transferência:

image

@danperrout
Copy link
Author

danperrout commented Oct 21, 2024

Alguém saberia alguma forma de pegar o JSON para o dia atual?

Código atualizado com o novo endereço de json: https://api.radaropcoes.com/bonds.json

@WadjoResende
Copy link

Alguém sabe explicar como resolver o seguinte erro:

Erro TypeError: Cannot read properties of undefined (reading 'toLowerCase')
TESOURODIRETO @ TESOURODIRETO.gs:12

@ArturJuan
Copy link

O erro é por conta do comentário que declara a função, segue a versão corrigida:

/**
 * Retorna a cotação atual de um título específico do Tesouro Direto.
 * 
 * @param {string} nome do título
 * @return Retorna a cotação atual de um título específico do Tesouro Direto.
 * @customfunction 
 * Fonte: https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm
*/
function TESOURODIRETO(bondName="Tesouro IPCA+ 2029", 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;
        console.log(typeof(currBondName))
        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.");
}

@WadjoResende
Copy link

Perfeito Artur! Valeu!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment