Interfaçage avec l'API GitHub en utilisant Python 3

Interfaçage avec l'API GitHub en utilisant Python 3
GitHub en tant qu'application Web est une entité énorme et complexe. Pensez à tous les référentiels, utilisateurs, succursales, commits, commentaires, clés SSH et applications tierces qui en font partie. De plus, il existe plusieurs façons de communiquer avec elle. Il existe des applications de bureau pour GitHub, des extensions pour le code Visual Studio et l'éditeur d'atom, les applications Git CLI, Android et iOS pour n'en nommer que quelques-uns.

Les gens de GitHub et des développeurs tiers ne peuvent pas gérer toute cette complexité sans interface commune. Cette interface commune est ce que nous appelons l'API GitHub. Chaque utilitaire GitHub comme une CLI, une interface utilisateur Web, etc. utilise cette seule interface commune pour gérer les ressources (les ressources étant des entités comme les référentiels, les clés SSH, etc.).

Dans ce tutoriel, nous apprendrons quelques bases de la façon dont on interface avec une API à l'aide de GitHub API V3 et Python3. Le dernier V4 de l'API GitHub vous oblige à en savoir plus sur GraphQL, ce qui se traduit par une courbe d'apprentissage plus abrupte. Je vais donc m'en tenir à la version trois qui est toujours active et assez populaire.

Comment parler à une API Web

Les API Web sont ce qui vous permet d'utiliser tous les services offerts par une application Web, comme GitHub, par programme en utilisant un langage de votre choix. Par exemple, nous allons utiliser Python pour notre cas d'utilisation, ici. Techniquement, vous pouvez faire tout ce que vous faites sur GitHub en utilisant l'API, mais nous nous limiterons à lire uniquement les informations accessibles au public.

Votre programme Python parlera à une API de la même manière que votre navigateur parle à un site Web. C'est-à-dire, principalement via les demandes HTTPS. Ces demandes contiendront différentes «parties», à partir de la méthode de la demande [obtenir, publier, mettre, supprimer], l'URL elle-même, une chaîne de requête, un en-tête HTTP et un corps ou une charge utile. La plupart d'entre eux sont facultatifs. Nous devrons cependant fournir une méthode de demande et l'URL à laquelle nous faisons la demande.

Ce que ce sont et comment ils sont représentés dans une demande HTTPS est quelque chose que nous verrons lent alors que nous commençons à écrire des scripts Python pour interagir avec Github.

Un exemple

L'ajout de touches SSH à un serveur nouvellement créé est toujours un processus maladroit. Écrivons un script Python qui récupérera vos touches SSH publiques à partir de GitHub et l'ajoutera au fichier autorisé_keys sur n'importe quel serveur Linux ou Unix où vous exécutez ce script. Si vous ne savez pas comment générer ou utiliser des clés SSH, voici un excellent article sur la façon de faire exactement cela. Je suppose que vous avez créé et ajouté vos propres clés SSH publiques à votre compte GitHub.

Une implémentation Python très simple et naïve pour réaliser la tâche que nous avons décrite ci-dessus est comme indiqué ci-dessous:

Demandes d'importation
Importer un système d'exploitation
# Obtenir la saisie des utilisateurs
Unix_User = Input ("Entrez votre nom d'utilisateur Unix:")
github_user = input ("Entrez votre nom d'utilisateur github:")
# S'assurer .Le répertoire SSH existe et ouvre le fichier autorisé_keys
ssh_dir = '/ home /' + unix_user + '/.ssh / '
Sinon OS.chemin.existe (ssh_dir):
OS.Makedirs (SSH_DIR)
Autorized_keys_file = Open (SSH_DIR + 'Authorized_keys', 'A')
# Envoi d'une demande à l'API GIHUB et stockant la réponse dans une variable nommée 'Response'
api_root = "https: // api.github.com "
request_header = 'accepter': 'application / vnd.github.v3 + json '
réponse = demandes.get (api_root + '/ utilisateurs /' + github_user + '/ keys', en-têtes = request_header)
## Traitement de la réponse et des clés d'appel
pour je en réponse.JSON ():
Autorized_keys_file.écrire (i ['key'] + '\ n')

Ignorons la gestion des fichiers Python et divers détails et examinons strictement la demande et la réponse. Nous avons d'abord importé les demandes d'importation des modules de demandes Cette bibliothèque nous permet de passer des appels API très facilement. Cette bibliothèque est également l'un des meilleurs exemples d'un projet open source réalisé correctement. Voici le site officiel au cas où vous voudriez regarder de plus près les documents.

Ensuite, nous définissons une variable api_root.

api_root = "https: // api.github.com "

C'est la sous-chaîne commune dans toutes les URL auxquelles nous passerons des appels API. Donc, au lieu de taper «https: // API.github.com ”Chaque fois que nous devons accéder à Https: // API.github.com / utilisateurs ou https: // api.github.com / utilisateurs / nous écrivons juste api_root + '/ utilisateurs /' ou api_root + '/ utilisateurs /', Comme indiqué dans l'extrait de code.

Ensuite, nous définissons l'en-tête dans notre demande HTTPS, indiquant que les réponses sont destinées à l'API de la version 3 et devraient être formatées JSON. GitHub respecterait ces informations d'en-tête.

Faire une demande

Alors maintenant que nous avons notre URL et une information d'en-tête (facultative) stockée dans différentes variables, il est temps de faire la demande.

réponse = demandes.get (api_root + '/ utilisateurs /' + github_user + '/ keys', en-têtes = request_header)

La demande est de type «Get» parce que nous lisons des informations accessibles au public à GitHub. Si vous écriviez quelque chose sous votre compte d'utilisateur GitHub, vous utiliseriez la publication. De même, d'autres méthodes sont destinées à d'autres fonctions telles que la suppression consiste à supprimer des ressources comme les référentiels.

Point final de l'API

Le point de terminaison de l'API que nous tenons la main est:

https: // api.github.com / utilisateurs //clés

Chaque ressource GitHub a son propre point de terminaison API. Vos demandes de get, put, supprimer, etc. sont ensuite faites contre le point final que vous avez fourni. Selon le niveau d'accès que vous avez, Github vous permettra alors de passer avec cette demande ou de le refuser.

La plupart des organisations et des utilisateurs sur GitHub ont mis une énorme quantité d'informations lisibles et publics. Par exemple, mon compte d'utilisateur GitHub a quelques référentiels publics et des clés SSH publiques que n'importe qui peut lire l'accès (même sans compte d'utilisateur GitHub). Si vous souhaitez avoir un contrôle plus fin de votre compte personnel, vous pouvez générer un «jeton d'accès personnel» pour lire et rédiger des informations privilégiées stockées dans votre compte GitHub personnel. Si vous écrivez une application tierce, destinée à être utilisée par des utilisateurs autres que vous, alors un jeton OAuth dudit utilisateur est ce dont votre application aurait besoin.

Mais comme vous pouvez le voir, de nombreuses informations utiles sont accessibles sans créer de jeton.

Réponse

La réponse est renvoyée du serveur API GitHub et est stockée dans la variable nommée Response. La réponse entière pourrait être lue de plusieurs manières comme documentée ici. Nous avons explicitement demandé le contenu de type JSON de GitHub, nous allons donc traiter la demande, comme si c'était JSON. Pour ce faire, nous appelons la méthode json () à partir du module de requêtes qui le décodera dans des objets natifs Python comme les dictionnaires et les listes.

Vous pouvez voir les clés en annexe dans le fichier autorisé_keys dans cette boucle:

pour je en réponse.JSON ():
Autorized_keys_file.écrire (i ['key'] + '\ n')

Si vous imprimez la réponse.Objet JSON (), vous remarquerez qu'il s'agit d'une liste de python avec des dictionnaires Python en tant que membres. Chaque dictionnaire a une clé nommée «clé» avec votre clé SSH publique comme valeur à cette clé. Ainsi, vous pouvez ajouter ces valeurs une par une à votre fichier autorisé_keys. Et maintenant, vous pouvez facilement SSH dans votre serveur à partir de n'importe quel ordinateur qui a toute personne des clés SSH privées correspondant à l'une des clés publiques que nous venons d'ajouter.

Explorer plus loin

Beaucoup de travail avec les API implique une inspection minutieuse de la documentation de l'API elle-même que d'écrire des lignes de code. En cas de github, la documentation est l'une des meilleures de l'industrie. Mais lire sur les documents API et passer des appels API à l'aide de Python est plutôt inintéressant en tant qu'activité autonome.

Avant d'aller plus loin, je vous recommande de trouver une tâche que vous souhaitez effectuer en utilisant Python sur votre compte GitHub. Ensuite, essayez de le mettre en œuvre en lisant uniquement les documents officiels fournis par Python, ses bibliothèques dépendantes et Github. Cela vous aidera également à adopter un état d'esprit plus sain où vous comprenez ce qui se passe dans votre code et à l'améliorer progressivement au fil du temps.