Consumindo a API do Github em Python

Consumindo a API do Github em Python

Introdução

No dia a dia de um profissional de tecnologia, independente da linguagem, a palavra API é bem recorrente. Mas, o que é uma API? Como fazer o consumo de uma API utilizando a linguagem Python? É isto que vamos descobrir neste artigo.

Uma API(Application Programming Interface) ou em português, Interface de Programação de Aplicativos, trata-se de um conjunto de rotinas que permite enviar e recuperar dados em um servidor, de forma a permitir a integração do uso destes dados em outras aplicações. Mas por que utilizar uma API e não um arquivo csv com os dados que precisamos?

Banner da Imersão Phyton: Inscreva-se gratuitamente na Imersão Phyton da Alura e mergulhe em análise de dados!

Por que utilizar uma API?

Em certas situações, queremos apenas algumas informações que estão nesse arquivo, porém, os dados costumam mudar frequentemente. Utilizando uma API conseguiremos ir direto ao ponto, evitando baixar arquivos desnecessários e economizando tempo.

E foi exatamente o que aconteceu durante essa semana, quando eu recebi uma tarefa para listar somente os repositórios do github de uma funcionária da empresa onde trabalho.

Entendendo o funcionamento da API

Talvez, a primeira ideia que venha à mente seja ir ao perfil dela e listar um a um cada repositório. Porém, é muito laborioso fazer isto manualmente, concorda?!

E é aí que entra a API, como uma ponte em tempo real entre os dados do github e nossa aplicação, como mostra a imagem abaixo:

imagem 1

Ou seja, iremos solicitar os dados para a API através de uma requisição e ela irá retornar os dados solicitados, no nosso caso os repositórios da funcionária.

Fazendo uma requisição

Para conseguirmos nos comunicar com a API do github iremos precisar da biblioteca requests, como essa biblioteca não é built in do Python, vamos instalá-la através do comando:

pip install requests 

Agora que já temos nossa biblioteca instalada, podemos começar. Mas antes, vamos analisar como funciona a API pública do Github. Ela está disponível através da url:

https://api.github.com/

Quando acessamos este link, nos deparamos com uma estrutura similar a esta:

{
  "current_user_url": "https://api.github.com/user",
  "rate_limit_url": "https://api.github.com/rate_limit",
  "repository_url": "https://api.github.com/repos/{owner}/{repo}",
  "user_url": "https://api.github.com/users/{user}",
  "user_organizations_url": "https://api.github.com/user/orgs",

}

Mas calma,não se assuste. Observe que temos uma estrutura semelhante a um dicionário em python: um par de chave e valor. E o nosso valor é uma url de como podemos acessar as chaves específicas, por exemplo, na chave: user_url possuímos o valor:

https://api.github.com/users/{user}

Então, se substituirmos o parâmetro user no link acima, excluindo também as chaves por um nome de usuário válido, por exemplo:

https://api.github.com/users/nadiaaoliverr

Teremos como resultado a mesma estrutura já vista antes, porém, com os dados da usuária nadiaaoliverr.

{
  "login": "NadiaaOliverr",
  "name": "Nádia Oliveira",
  "location": "Rio Paranaíba - Minas Gerais - BR",
  "bio": "Just a common dev |  Student in Information Systems",
  "public_repos": 17,
  "followers": 82,
  "following": 130,
}

Legal! Mas, e os repositórios?

Acessando os repositórios

Para termos acesso aos repositórios precisamos acessar a url:

https://api.github.com/users/{user}/repos

E caso façamos a requisição para esta nova url com o nome de usuário mencionado, será possível ver todos os repositórios daquela pessoa.

imagem 2

Bingo! Era o que queríamos. Com isto, fizemos o nosso primeiro acesso a api, porém, manualmente. O que queremos é mostrar estes dados com a ajuda do Python, vamos lá.

Agora sim, como consumir uma API em Python ?

No nosso arquivo de código, vamos dizer ao Python que queremos utilizar a biblioteca de requisições e também, a biblioteca de representação de dados, a json.

import requests
import json

O Json(JavaScript Object Notation) nada mais é do que um formato de representação de dados muito utilizado em API's. Para uma melhor organização do nosso código, iremos trabalhar com uma classe que recebe como parâmetro o nome do usuário.

class ListaDeRepositorios():

    def __init__(self, usuario):
        self._usuario = usuario

O que queremos é obter os repositórios que estão dentro da api, e para isso, na função responsável por fazer a requisição, vamos utilizar o método requests.get() que recebe como parâmetro a url da api.

  def requisicao_api(self):
        resposta = requests.get(
            f'https://api.github.com/users/{self._usuario}/repos')

Agora que já fizemos a requisição, precisamos saber se houvesse sucesso ou não nesta solicitação e para isto, iremos utilizar o status de retorno da api. Podemos identificar esta informação através da palavra reservada status_code. Os mais comuns são:

  • 200 (OK): a solicitação ocorreu conforme o esperado e retornará algum dado, caso haja.
  • 404 (NOT FOUND): não foi possível encontrar o endereço passado como parâmetro.
  • 500 (INTERNAL SERVER ERROR): ocorreu algum erro no servidor.

Então, caso retorne 200, podemos retornar aqueles dados, em caso contrário, vamos retornar o status daquela solicitação, conseguimos criar essa lógica através de um if/else:

def requisicao_api(self):
        resposta = requests.get(
            f'https://api.github.com/users/{self._usuario}/repos')
        if resposta.status_code == 200:
            return resposta.json()
        else:
            return resposta.status_code

Agora, temos que mostrar estes dados na tela. Vamos lá

Listando os repositórios

Vamos criar uma função responsável por imprimir os repositórios. Chamaremos dentro desta função a nossa requisição à api e caso o retorno não seja um inteiro, percorremos os dados e acessaremos o nome daquele repositório.

def imprime_repositorios(self):
        dados_api = self.requisicao_api()
        if type(dados_api) is not int:
            for i in range(len(dados_api)):
                print(dados_api[i]['name'])
        else:
            print(dados_api)

Caso o retorno seja um número inteiro diferente de 200, lembre-se que o status 200 é um OK, vamos printar este status.

Podemos acessar uma lista completa de todos os retornos e o que eles significam neste link.

Observe que conseguimos acessar os dados da api através da chave da mesma, neste caso, a chave name. Podemos agora instanciar nossa classe e printar os repositórios daquela funcionária:


repositorios = ListaDeRepositorios('nadiaaoliverr')
repositorios.imprime_repositorios()

Ao executarmos o código, teremos como resultado:

imagem 3

Maravilha! Alcançamos nosso objetivo. Não tinha ideia que fosse tão simples assim, não é?! Você pode encontrar o código completo aqui.

Esta é apenas uma das inúmeras funcionalidades da poderosa biblioteca de requests e você pode saber mais sobre ela acessando a documentação da mesma.

Gostou deste artigo e quer conhecer mais sobre os poderes da linguagem python? Que tal dar uma olhada em nossos cursos de Python aqui na Alura? Bons estudos e até o próximo artigo!

Nádia Oliveira
Nádia Oliveira

Nádia é uma entusiasta do Python, graduada em Sistemas de Informação pela Universidade Federal de Viçosa e faz parte do time do Apoio Educacional aqui na Alura. No fórum, você a encontrará nas categorias de Python, Python Web e Data Science.

Veja outros artigos sobre Programação