Interfaz con la API de Github usando Python 3

Interfaz con la API de Github usando Python 3
Github como aplicación web es una entidad enorme y compleja. Piense en todos los repositorios, usuarios, sucursales, comodidades, comentarios, claves SSH y aplicaciones de terceros que forman parte de ellas. Además, hay múltiples formas de comunicarse con él. Hay aplicaciones de escritorio para GitHub, Extensiones para el código de estudio Visual y Atom Editor, Git CLI, Android e iOS Aples, por nombrar algunas.

Las personas en Github, y los desarrolladores de terceros, no pueden manejar toda esta complejidad sin una interfaz común. Esta interfaz común es lo que llamamos la API de GitHub. Cada utilidad de GitHub, como una CLI, interfaz de usuario web, etc., utiliza esta interfaz común para administrar recursos (recursos son entidades como repositorios, claves SSH, etc.).

En este tutorial aprenderemos algunos conceptos básicos de cómo uno interactúa con una API que usa GitHub API V3 y Python3. El último V4 de la API de GitHub requiere que aprenda sobre GraphQL que resulta en una curva de aprendizaje más pronunciada. Así que me quedaré solo con la versión tres, que sigue siendo activa y bastante popular.

Cómo hablar con una API web

Las API web son lo que le permite usar todos los servicios que ofrece una aplicación web, como GitHub, mediante programación utilizando el lenguaje de su elección. Por ejemplo, vamos a usar Python para nuestro caso de uso, aquí. Técnicamente, puede hacer todo lo que haga en GitHub utilizando la API, pero nos restringiremos solo a leer la información de acceso público.

Su programa de Python hablará con una API de la misma manera que su navegador habla con un sitio web. Es decir, principalmente a través de solicitudes HTTPS. Estas solicitudes contendrán diferentes 'piezas', que comienzan con el método de la solicitud [obtener, publicar, poner, eliminar], la URL en sí, una cadena de consulta, un encabezado HTTP y un cuerpo o una carga útil. La mayoría de estos son opcionales. Sin embargo, necesitaremos proporcionar un método de solicitud y la URL a la que estamos haciendo la solicitud.

Lo que son y cómo están representados en una solicitud HTTPS es algo que veremos lentamente a medida que comenzamos a escribir scripts de Python para interactuar con GitHub.

Un ejemplo

Agregar claves SSH a un servidor recién creado es siempre un proceso torpe. Escribamos un script de Python que recuperará sus claves SSH públicas de GitHub y lo agregue al archivo autorizado_keys en cualquier servidor Linux o Unix donde ejecute este script. Si no sabe cómo generar o usar las teclas SSH, aquí hay un excelente artículo sobre cómo hacer exactamente eso. Asumiré que ha creado y agregó sus propias claves SSH públicas a su cuenta de Github.

Una implementación de Python muy simple e ingenua para lograr la tarea que describimos anteriormente es como se muestra a continuación:

Solicitudes de importación
importar sistema operativo
# Obtener la entrada del usuario
unix_user = input ("Ingrese su nombre de usuario Unix:")
github_user = input ("Ingrese su nombre de usuario GitHub:")
# Asegurándose .El directorio SSH existe y la apertura del archivo Authorized_Keys
ssh_dir = '/home/'+unix_user+'/.ssh/'
Si no es un sistema operativo.camino.existe (ssh_dir):
sistema operativo.Makinirs (ssh_dir)
Authorized_keys_file = Open (ssh_dir+'autorized_keys', 'a')
# Enviar una solicitud a la API de Gihub y almacenar la respuesta en una variable llamada'Response '
API_ROOT = "https: // API.github.com "
request_header = 'aceptar': 'aplicación/vnd.github.v3+json '
respuesta = solicitudes.get (api_root+'/users/'+github_user+'/keys', encabezados = request_header)
## procesar la respuesta y agregar claves al archivo autorizado_keys
Para I en respuesta.json ():
autorizado_keys_file.Escribir (I ['Key']+'\ n')

Ignoremos el manejo de archivos de Python y los detalles diversos y miremos estrictamente la solicitud y la respuesta. Primero importamos las solicitudes de importación del módulo de solicitudes Esta biblioteca nos permite hacer llamadas API muy fácilmente. Esta biblioteca también es uno de los mejores ejemplos de un proyecto de código abierto realizado correctamente. Aquí está el sitio oficial en caso de que desee echar un vistazo más de cerca a los documentos.

A continuación, establecemos una variable API_ROOT.

API_ROOT = "https: // API.github.com "

Esta es la subcadena común en todas las URL a las que haremos llamadas API. Entonces, en lugar de escribir "https: // api.github.com ”Cada vez que necesitamos acceder a https: // API.github.com/ussers o https: // API.github.com/ uss/ solo escribimos API_ROOT+'/USERS/' o API_ROOT+'/USERS/', Como se muestra en el fragmento de código.

A continuación, establecemos el encabezado en nuestra solicitud HTTPS, lo que indica que las respuestas están destinadas a la API de la versión 3 y deben estar formateadas por JSON. Github respetaría esta información del encabezado.

Obtener solicitud

Entonces, ahora que tenemos nuestra URL y una información de encabezado (una opcional) almacenada en diferentes variables, es hora de realizar la solicitud.

respuesta = solicitudes.get (api_root+'/users/'+github_user+'/keys', encabezados = request_header)

La solicitud es de tipo 'Get' porque estamos leyendo información pública disponible de GitHub. Si estaba escribiendo algo en su cuenta de usuario de GitHub, usaría POST. Del mismo modo, otros métodos están destinados a otras funciones como Eliminar es para la eliminación de recursos como repositorios.

Punto final de la API

El punto final de la API que estamos llegando es:

https: // API.github.com/usuarios//llaves

Cada recurso de Github tiene su propio punto final API. Sus solicitudes de obtener, poner, eliminar, etc. luego se realizan contra el punto final que suministró. Dependiendo del nivel de acceso que tenga, Github le permitirá realizar esa solicitud o negarlo.

La mayoría de las organizaciones y usuarios en GitHub establecieron una gran cantidad de información legible y pública. Por ejemplo, mi cuenta de usuario de GitHub tiene un par de repositorios públicos y claves públicas de SSH que cualquiera puede leer el acceso (incluso sin una cuenta de usuario de GitHub). Si desea tener un control de grano más fino de su cuenta personal, puede generar un "token de acceso personal" para leer y escribir información privilegiada almacenada en su cuenta personal de GitHub. Si está escribiendo una aplicación de terceros, destinada a ser utilizada por usuarios que no sean usted, entonces una token OAuth de dicho usuario es lo que su aplicación requeriría.

Pero como puede ver, se puede acceder a mucha información útil sin crear ningún token.

Respuesta

La respuesta se devuelve desde el servidor API de GitHub y se almacena en la variable llamada respuesta. Toda la respuesta podría leerse de varias maneras como se documenta aquí. Pedimos explícitamente el contenido de tipo JSON desde GitHub para procesar la solicitud, como si fuera JSON. Para hacer esto, llamamos al método json () desde el módulo de solicitudes que lo decodificará en objetos nativos de Python como diccionarios y listas.

Puede ver que las claves se adjuntan al archivo autorizado_keys en este bucle:

Para I en respuesta.json ():
autorizado_keys_file.Escribir (I ['Key']+'\ n')

Si imprime la respuesta.objeto json (), notará que es una lista de Python con diccionarios de Python como miembros. Cada diccionario tiene una clave llamada 'clave' con su clave SSH pública como valor para esa clave. Para que pueda agregar estos valores uno por uno a su archivo autorizado_keys. Y ahora puede SSH fácilmente en su servidor desde cualquier computadora que tenga a cualquiera de las claves SSH privadas correspondientes a una de las claves públicas que acabamos de agregar.

Explorando más

Mucho trabajo con API implica una inspección cuidadosa de la documentación de la API en sí mismo que escribir líneas de código. En el caso de Github, la documentación es una de las mejores de la industria. Pero leer en los documentos de API y hacer llamadas de API usando Python es bastante poco interesante como una actividad independiente.

Antes de ir más allá, le recomendaría que cree una tarea que le gustaría realizar usando Python en su cuenta de GitHub. Luego intente implementarlo leyendo solo las documentos oficiales proporcionadas por Python, sus bibliotecas dependientes y GitHub. Esto también lo ayudará a adoptar una mentalidad más saludable en la que comprenda lo que está sucediendo dentro de su código y lo mejore gradualmente con el tiempo.