Skip to content

Instantly share code, notes, and snippets.

@turicas
Last active August 13, 2022 23:04
Show Gist options
  • Save turicas/3e3621d61415e3453cd03a1997f7473f to your computer and use it in GitHub Desktop.
Save turicas/3e3621d61415e3453cd03a1997f7473f to your computer and use it in GitHub Desktop.
Exemplo de código para acessar dados do Brasil.IO
import csv
import gzip
import io
import json
from urllib.parse import urlencode, urljoin
from urllib.request import Request, urlopen
class BrasilIO:
base_url = "https://api.brasil.io/v1/"
def __init__(self, auth_token):
self.__auth_token = auth_token
@property
def headers(self):
return {
"User-Agent": "python-urllib/brasilio-client-0.1.0",
}
@property
def api_headers(self):
data = self.headers
data.update({"Authorization": f"Token {self.__auth_token}"})
return data
def api_request(self, path, query_string=None):
url = urljoin(self.base_url, path)
if query_string:
url += "?" + urlencode(query_string)
request = Request(url, headers=self.api_headers)
response = urlopen(request)
return json.load(response)
def data(self, dataset_slug, table_name, filters=None):
url = f"dataset/{dataset_slug}/{table_name}/data/"
filters = filters or {}
filters["page"] = 1
finished = False
while not finished:
response = self.request(url, filters)
next_page = response.get("next", None)
for row in response["results"]:
yield row
filters = {}
url = next_page
finished = next_page is None
def download(self, dataset, table_name):
url = f"https://data.brasil.io/dataset/{dataset}/{table_name}.csv.gz"
request = Request(url, headers=self.headers)
response = urlopen(request)
return response
if __name__ == "__main__":
api = BrasilIO("meu-api-token")
dataset_slug = "covid19"
table_name = "caso_full"
# Para baixar o arquivo completo:
# Após fazer o download, você salvá-lo no disco ou percorrer o arquivo em
# memória. Para salvá-lo no disco:
response = api.download(dataset_slug, table_name)
with open(f"{dataset_slug}_{table_name}.csv.gz", mode="wb") as fobj:
fobj.write(response.read())
# TODO: o código acima pode ser melhorado de forma a não utilizar
# `response.read()` para não colocar todo oarquivo em memória e sim fazer
# streaming da resposta HTTP e salvar cada chunk diretamente no `fobj`.
# Caso queira percorrer o CSV em memória:
response = api.download(dataset_slug, table_name)
fobj = io.TextIOWrapper(gzip.GzipFile(fileobj=response), encoding="utf-8")
reader = csv.DictReader(fobj)
for row in reader:
pass # faça algo com `row`
# Para navegar pela API:
filters = {"state": "PR", "is_last": True}
data = api.data(dataset_slug, table_name, filters)
for row in data:
pass # faça algo com `row`
@kleyber-ribeiro
Copy link

@turicas, eu cadastrei 2 tokens de acesso, estou usando PHP para acessar via cURL a API, para pegar dados apenas 1x ao dia, mas não consigo acessar... me dá o erro 401... não quero onerar de forma alguma a API de vocês, mas não vou poder buscar as informações 1x ao dia? Não é plausível?

@immichjs
Copy link

Eu efetuei uma requisição para API utilizando a biblioteca Axios com node.js, o que acabou facilitando bastante consumir essa API de forma bem simples. Abaixo tem o código

  const axios = require('axios')
  const keyToken = '[SUA CHAVE TOKEN]'
  
  axios.get('https://api.brasil.io/v1/dataset/covid19/caso/data/?format=json', {
      headers: {
          Authorization: `token ${keyToken}`
      }
  }).then(function(response) {
      const structure = response.data
      const data = response.data.results.forEach(element => {
          const city = element.city
          const confirmed = element.confirmed
          const deaths = element.deaths
          const state = element.state
  
          console.log(`Cidade: ${city}`,
            `Quantidade de confirmados: ${confirmed}`, 
            `Quantidade de mortes ${deaths}`,
            `Estado: ${state}`)
      });
  
  
      console.log(data)
  }).catch(function (error) {
      if (error) {
          console.log(error)
      }
  })

@brunorosselli
Copy link

Olá! Estou tentando acessar a API porém estou com problemas.
Estou enviando o meu token no header com a chave gerada no site, porém ainda estou recebendo o erro 401.
Fiz o teste no site: https://reqbin.com/ conforme foi recomendado por um de nossos colegas, mas o resultado do teste com Bearer Token e Custom, retornam 401 também.

Isso me leva a crer que possa existir um problema com o token.

Fiz um Interceptor usando Angular para enviar o token no meu head, quando confiro o head em Network a opção Authorization retorna o valor: authorization: Bearer <meu token>

Mas o erro 401, persiste.

Podem me ajudar? Obrigado :)

import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable()
export class TokenInterceptor implements HttpInterceptor {
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const token = '<meuToken>';
        const newRequest = request.clone({setHeaders: {'Authorization': `Bearer ${token}`}})
        return next.handle(newRequest);
    }

}

@brunorosselli
Copy link

brunorosselli commented Mar 20, 2021

Fiz outra tentativa direto no meu service, porém o erro 401 persiste.
Também tentei fazer um GET na api usando a aplicação do Postman e passando o Token no Authorization, também não obtive sucesso.
Estou usando Angular para desenvolver a aplicação, mas acredito que exista uma falha nos tokens que estão sendo gerados no site.

constructor(private http: HttpClient) { }
  dataList(): Observable<any>{
  const httpHeaders = new HttpHeaders({
    'Authorization': 'Bearer <meuToken>'
  });
  return this.http.get(`${environment.apiUrlBrasilioData}`, {headers: httpHeaders});
  };

@austre
Copy link

austre commented May 13, 2021

Olá pessoal, é possível configurar a requisição GET no Insomnia para testes?

Tentei fazer por aqui, coloquei no Header o parâmetro Authorization com a chave que gerei, mas retorna:

{
"message": "As credenciais de autenticação não foram fornecidas ou estão inválidas. Acesse https://brasil.io/auth/tokens-api/ para gerenciar suas chaves de acesso a API ou nosso blog post com o passo-a-passo da autenticação em https://blog.brasil.io/2020/10/31/nossa-api-sera-obrigatoriamente-autenticada/"
}

Tentei o endpoint https://api.brasil.io/v1/dataset/covid19/caso/data/?format=json que o @immichjs postou aqui.

@austre
Copy link

austre commented May 13, 2021

Consegui resolver aqui, abaixo segue as telas do Insomnia para ilustrar e ajudar a quem precisar.

image

Nesta parte, atenção ao uso de aspas duplas, foi um detalhe que penei aqui.
image

@ibandim123
Copy link

ibandim123 commented Oct 17, 2021

Olá! Gostaria de saber como eu posso aplicar uma query como o limit na chamada de API. Eu quero apenas que tenha 10 itens e aplicar uma lógica neles para que saia o maior "last_available_confirmed" dos 10.
image

@giuliano-macedo
Copy link

giuliano-macedo commented Oct 18, 2021

@ibandim123 Você pode user os query parameters limit e last_available_confirmed, mas info aqui

@jvnsantos
Copy link

Python é muito ruim de visualizar qualquer coisa, estou tentando consumir no React mas o CORS ta impedindo mesmo meu header estando assim:

   Authorization: "Token <meutoken>",
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Headers": "*",
  "User-Agent": "*",

@fernandosoares
Copy link

Boa noite. Gente, o dataset de casos está ok? A propriedade CONFIRMED está muito acima do normal por UF. Estou fazendo algo errado? Como posso pegar o numero de casos do dia anterior?

Copy link

ghost commented Aug 13, 2022

Quando faço a requisição fica aparecendo esta menssagem: {'message': 'As credenciais de autenticação não foram fornecidas ou estão inválidas. Acesse https://brasil.io/auth/tokens-api/ para gerenciar suas chaves de acesso a API ou nosso blog post com o passo-a-passo da autenticação em https://blog.brasil.io/2020/10/31/nossa-api-sera-obrigatoriamente-autenticada/'}. sendo que eu já tenho uma chave

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