Interface com a API do GitHub usando o Python 3

Interface com a API do GitHub usando o Python 3
Github como aplicativo da web é uma entidade enorme e complexa. Pense em todos os repositórios, usuários, ramificações, começos, comentários, chaves ssh e aplicativos de terceiros que fazem parte disso. Além disso, existem várias maneiras de se comunicar com isso. Existem aplicativos para desktop para Github, extensões para o Código do Visual Studio e o Atom Editor, Git CLI, Android e iOS Apps, para citar alguns.

Pessoas no Github e desenvolvedores de terceiros não podem gerenciar toda essa complexidade sem uma interface comum. Esta interface comum é o que chamamos de API do GitHub. Todo utilitário github como uma CLI, interface da web, etc. usa essa interface comum para gerenciar recursos (recursos como entidades como repositórios, chaves ssh, etc.).

Neste tutorial, aprenderemos alguns conceitos básicos de como se interface com uma API usando o github API V3 e Python3. O mais recente V4 da API do GitHub exige que você aprenda sobre o GraphQL, o que resulta em uma curva de aprendizado mais acentuada. Então, vou me manter apenas na versão três, que ainda é ativa e bastante popular.

Como falar com uma API da Web

APIs da web são o que permite que você use todos os serviços oferecidos por um aplicativo da web, como o GitHub, programaticamente usando a linguagem de sua escolha. Por exemplo, vamos usar o Python para o nosso caso de uso, aqui. Tecnicamente, você pode fazer tudo o que faz no github usando a API, mas nos restringiremos a ler apenas as informações acessíveis ao público.

Seu programa Python estará conversando com uma API da mesma maneira que o seu navegador fala com um site. Isto é, principalmente por meio de solicitações HTTPS. Essas solicitações conterão diferentes 'partes', a partir do método da solicitação [Get, Post, Put, Delete], o próprio URL, uma sequência de consulta, um cabeçalho HTTP e um corpo ou uma carga útil. A maioria deles é opcional. No entanto, precisaremos fornecer um método de solicitação e o URL ao qual estamos fazendo a solicitação.

O que são e como eles são representados em uma solicitação HTTPS é algo que veremos devagar quando começamos a escrever scripts Python para interagir com o GitHub.

Um exemplo

Adicionar teclas SSH a um servidor recém -criado é sempre um processo desajeitado. Vamos escrever um script python que recuperará suas chaves ssh públicas do github e adicioná -lo ao arquivo Autorizado_keys em qualquer servidor Linux ou Unix, onde você executa este script. Se você não sabe como gerar ou usar as teclas SSH, aqui está um excelente artigo sobre como fazer exatamente isso. Vou assumir que você criou e adicionou suas próprias chaves ssh públicas à sua conta do github.

Uma implementação Python muito simples e ingênua para realizar a tarefa que descreveu acima é como mostrado abaixo:

solicitações de importação
OS de importação
# Obtendo entrada do usuário
unix_user = input ("Digite seu nome de usuário do Unix:")
github_user = input ("Digite seu nome de usuário do github:")
# Ter certeza .O diretório SSH existe e o arquivo Authorized_Keys Authorized_Keys
ssh_dir = '/home/'+unix_user+'/.ssh/'
se não OS.caminho.existe (ssh_dir):
OS.Makes (ssh_dir)
Authorized_Keys_File = Open (SSH_DIR+'Autorizado_keys', 'A')
# Enviando uma solicitação para a API do Gihub e armazenando a resposta em uma variável chamada 'Response'
api_root = "https: // API.Github.com "
request_header = 'Acep': 'Application/VND.Github.v3+json '
resposta = solicitações.get (api_root+'/usuários/'+github_user+'/keys', cabeçalhos = request_header)
## Processando a resposta e anexando as chaves ao arquivo autorizado_keys
para eu em resposta.JSON ():
Autorizado_keys_file.Escreva (i ['key']+'\ n')

Vamos ignorar o manuseio de arquivos Python e detalhes diversos e olhar estritamente para a solicitação e resposta. Primeiro, importamos as solicitações de importação do módulo de importação Esta biblioteca nos permite fazer chamadas de API com muita facilidade. Esta biblioteca também é um dos melhores exemplos de um projeto de código aberto feito corretamente. Aqui está o site oficial, caso você queira dar uma olhada mais de perto nos documentos.

Em seguida, definimos uma variável api_root.

api_root = "https: // API.Github.com "

Esta é a substring comum em todos os URLs aos quais faremos chamadas de API. Então, em vez de digitar “https: // api.Github.com ”toda vez que precisamos acessar https: // api.Github.com/usuários ou https: // API.Github.com/ usuários/ nós apenas escrevemos api_root+'/usuários/' ou api_root+'/usuários/', Como mostrado no trecho de código.

Em seguida, definimos o cabeçalho em nossa solicitação HTTPS, indicando que as respostas são destinadas à API da versão 3 e devem ser formatadas JSON. Github respeitaria esta informação do cabeçalho.

Obtenha solicitação

Então agora que temos nosso URL e (um (opcional) informações de cabeçalho armazenadas em diferentes variáveis, é hora de fazer a solicitação.

resposta = solicitações.get (api_root+'/usuários/'+github_user+'/keys', cabeçalhos = request_header)

O pedido é do tipo 'Get' porque estamos lendo informações disponíveis ao público do GitHub. Se você estivesse escrevendo algo em sua conta de usuário do github, você usaria postagem. Da mesma forma, outros métodos são destinados a outras funções, como Delete, é para exclusão de recursos como repositórios.

Endpoint da API

O ponto final da API que estamos alcançando é:

https: // API.Github.com/usuários//chaves

Cada recurso do GitHub tem seu próprio ponto de extremidade da API. Seus pedidos de get, put, exclusão etc. são feitos contra o ponto final que você forneceu. Dependendo do nível de acesso que você tem, o GitHub permitirá que você continue com esse pedido ou negar.

A maioria das organizações e usuários no Github estabelece uma enorme quantidade de informações legíveis e públicas. Por exemplo, minha conta de usuário do GitHub tem alguns repositórios públicos e chaves públicas SSH que qualquer um pode ler o acesso (mesmo sem uma conta de usuário do GitHub). Se você deseja ter um controle mais fino da sua conta pessoal, pode gerar um "token de acesso pessoal" para ler e escrever informações privilegiadas armazenadas em sua conta pessoal do github. Se você estiver escrevendo um aplicativo de terceiros, destinado a ser usado por outros usuários que não você, um token OAuth do referido usuário é o que seu aplicativo exigiria.

Mas como você pode ver, muitas informações úteis podem ser acessadas sem criar nenhum token.

Resposta

A resposta é retornada do servidor API do GitHub e é armazenada na variável de resposta nomeada. Toda a resposta pode ser lida de várias maneiras, conforme documentado aqui. Pedimos explicitamente o conteúdo do tipo JSON do GitHub, então processaremos a solicitação, como se fosse JSON. Para fazer isso, chamamos o método JSON () do módulo de solicitações que o decodificará em objetos nativos do Python, como dicionários e listas.

Você pode ver as chaves sendo anexadas ao arquivo Autorizado_keys neste loop:

para eu em resposta.JSON ():
Autorizado_keys_file.Escreva (i ['key']+'\ n')

Se você imprimir a resposta.JSON () Objeto, você notará que é uma lista de Python com dicionários de Python como membros. Cada dicionário tem uma chave chamada 'chave' com sua chave ssh pública como valor para essa chave. Assim, você pode anexar esses valores um por um ao seu arquivo Autorizado_keys. E agora você pode facilmente entrar em seu servidor de qualquer computador que tenha qualquer uma das teclas SSH privadas correspondentes a uma das chaves públicas que acabamos de anexar.

Explorando mais

Muito trabalho com APIs envolve uma inspeção cuidadosa da própria documentação da API mais do que escrever linhas de código. Em caso de github, a documentação é uma das melhores da indústria. Mas ler os documentos da API e fazer chamadas de API usando Python é bastante desinteressante como uma atividade independente.

Antes de prosseguir, eu recomendaria que você invente uma tarefa que gostaria de executar usando o Python em sua conta do GitHub. Em seguida, tente implementá -lo lendo apenas as documentações oficiais fornecidas pela Python, suas bibliotecas dependentes e github. Isso também ajudará você a adotar uma mentalidade mais saudável, onde você entende o que está acontecendo dentro do seu código e a melhorá -lo gradualmente com o tempo.