-
-
Save turicas/3e3621d61415e3453cd03a1997f7473f to your computer and use it in GitHub Desktop.
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` |
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)
}
})
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);
}
}
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});
};
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.
@ibandim123 Você pode user os query parameters limit
e last_available_confirmed
, mas info aqui
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": "*",
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?
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
@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?