-
-
Save lucashmsilva/9f4596f2924ac5c1eb0721c2c41dc257 to your computer and use it in GitHub Desktop.
/* | |
* @return Retorna a cotação atual de um título específico do Tesouro Direto Junto com a taxa anual de retorno | |
* @customfunction | |
**/ | |
function TESOURODIRETO(bondName) { | |
let srcURL = "https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.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 === bondName) | |
return [bond.TrsrBd.untrRedVal, bond.TrsrBd.anulInvstmtRate]; // créditos ao @figueiredods por ter encontrado o campo que retorna a taxa correta | |
} | |
throw new Error("Not Found"); | |
} |
/* | |
* @return Retorna a cotação atual de um título específico do Tesouro Direto | |
* @customfunction | |
**/ | |
function TESOURODIRETO(bondName) { | |
let srcURL = "https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.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 === bondName) | |
return bond.TrsrBd.untrRedVal; | |
} | |
throw new Error("Not Found"); | |
} |
Já tentei investigar mais a fundo e sem novidades. Creio que seja bloqueio por parte do Tesouro Direto mesmo.
Alguém mais focado em dev no Google Script saberia se existe outro modo de dar fetch em páginas html/json sem ser por "UrlFetchApp"? Talvez isso possa gerar uma requição diferente não identificada/bloqueada pelo TesouroDireto.
ou talvez um bypass/workaround, um dominio intermediario processar a chamada da API e no Google script fazer a chamada desse intermediário
Abri uma pergunta no stackoverflow pra ver se consigo ajuda nisso: https://stackoverflow.com/questions/78897095/bypass-workaround-for-urlfetchapp-request-failed-returned-code-403
O que está rolando é que agora o Site do Tesouro Direto está usando a Cloudflare. Com isso, estão barrando a request do Google Script, pois estende que ela é um bot. Tentei implementar um proxy, na mesma linha do que o @rafaelgp23 propôs, mas não tive sucesso, nem rodando no meu PC local, antes de subir o proxy para um server.
Assim que tiver um pouco mais de tempo, vou voltar nessa ideia do proxy. Mas até lá, estamos sendo barrados 🙁
@lucashmsilva vc tem o contato do dev/owner dessa API? Talvez reportar o problema direto para ele(s)? Não faz sentido um domínio de uma API pública bloquear chamada de função do Google Script.
Coloquei algumas informações nessa thread em relação ao que já tentei para entrar em contato com alguém do Tesouro Direto.
Realmente, a API tá tentando validar se é um humano fazendo uma chama, mas isso não faz sentido algum, vai totalmente contra o conceito de API:
Isso fica bem claro no "Run code snippet" da descrição do post que fiz no stackoverflow:
E realmente a solução lógica para isso seria reportar o problema para o admin da API mudar o settings no cloudflare para corrigir isso, mas voltamos ao problema de conseguir entrar em contato.
Sem querer polemizar, mas se tratando de serviço público/federal, já sabem que contato e conseguir essa solução ideal é bem difícil.
Enviei mensagem pela central de atendimentos do Tesouro Direto mas não sei se terei alguma resposta.
Sobre os proxys, pelo nível de bloqueio com CloudFlare, o que dá pra fazer, por enquanto, é implementar algo usando Playwright ou Selenium pra fazer essa req simulando um usuário real de X em X tempos e baixar o JSON e prover um endpoint que devolva ele com Nginx...
@EduardoJM vamos focar a conversa no link que o tulio mandou acima: https://gist.github.com/danperrout/b27197056fa38d0d669332647ab89d7a?permalink_comment_id=5159964#gistcomment-5159964
Alguém já conseguiu solucionar o problema?
Alguém já conseguiu solucionar o problema?
om dia, parece que deu ruim nessa API:
Parece que o dominio dessa API tá bloqueando chamadas pelo servidor do Google Script:
Exception: Request failed for https://www.tesourodireto.com.br returned code 403. Truncated server response: <!DOCTYPE html><html lang="en-US"><head><title>Just a moment...</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta htt... (use muteHttpExceptions option to examine full response)