On rentre gentiment dans le game des API avec L’API GitHub. On utilisera Python pour jouer avec.
Si tu ne sais pas ce qu’est une API, tu peux lire ce cours.
Générer Token GitHub
Comment générer son/ses token Github :
On se connecte sur son compte GitHub / on crée un compte si ce n’est pas déjà fait.
Direction => https://github.com/settings/tokens
On clique sur « Generate new token »
On arrive sur la page suivante
« Note » nous permet d’entrer un nom pour notre token
Et les « scopes » en dessous sont en faites les droits d’accès du token sur les différentes fonctionnalités (lecture des dépôts, écriture, suppression, données utilisateurs, etc…)
Enfin on génère le Token avec « Generate Token »
On à maintenant notre token sous forme de longue chaîne de caractères composé de lettres et de chiffres.
Utilisation de l’API GitHub
Pour s’authentifier on ajoute le token dans le paramètre headers qui sera ensuite utilisé dans la requête :
headers = {"Authorization":"token 789098c3109545sdfsdf59318dsqdz97"}
Récupérer les données d’un utilisateur sur GitHub
Pour tester l’api on va commencer par créer un petit programme qui récupère, dans cet exemple je vais récupérer les données public du comptede la Nasa :
Pour commencer on importe le module « requests »
import requests
Voici donc l’URL pour obtenir les données utilisateurs :
https://api.github.com/users/nom_utilisateur
Dans notre code :
url = "https://api.github.com/users/nasa"
headers = {"Authorization":"token 789098c3109545sdfsdf59318dsqdz97"}
Evidemment le Token ici est un token test pour les besoins de ce cours qui n’existe pas réellement
On fais alors une requete GET sur cette url avec notre headers en paramètre (headers qui contient notre token) :
response = requests.get(url,headers=headers)
Notre requête s’est donc connecté à l’API et à récupérer les données utilisateur de la NASA.
On peut maintenant afficher ces données :
print(response.json())
les données s’affiche alors au format JSON :
{‘login’: ‘nasa’, ‘id’: 848102, ‘node_id’: ‘MDEyOk9yZ2FuaXphdGlvbjg0ODEwMg==’, ‘avatar_url’: ‘https://avatars2.githubusercontent.com/u/848102?v=4’, ‘gravatar_id’: », ‘url’: ‘https://api.github.com/users/nasa’, ‘html_url’: ‘https://github.com/nasa’, ‘followers_url’: ‘https://api.github.com/users/nasa/followers’, ‘following_url’: ‘https://api.github.com/users/nasa/following{/other_user}’, ‘gists_url’: ‘https://api.github.com/users/nasa/gists{/gist_id}’, ‘starred_url’: ‘https://api.github.com/users/nasa/starred{/owner}{/repo}’, ‘subscriptions_url’: ‘https://api.github.com/users/nasa/subscriptions’, ‘organizations_url’: ‘https://api.github.com/users/nasa/orgs’, ‘repos_url’: ‘https://api.github.com/users/nasa/repos’, ‘events_url’: ‘https://api.github.com/users/nasa/events{/privacy}’, ‘received_events_url’: ‘https://api.github.com/users/nasa/received_events’, ‘type’: ‘Organization’, ‘site_admin’: False, ‘name’: ‘NASA’, ‘company’: None, ‘blog’: ‘http://nasa.github.io/’, ‘location’: ‘United States of America’, ’email’: ‘github@lists.nasa.gov’, ‘hireable’: None, ‘bio’: « Read about NASA’s Open Data initiative here: https://www.nasa.gov/open/ & Members Find Instructions here: http://nasa.github.io/ », ‘twitter_username’: None, ‘public_repos’: 330, ‘public_gists’: 0, ‘followers’: 0, ‘following’: 0, ‘created_at’: ‘2011-06-13T22:19:22Z’, ‘updated_at’: ‘2020-11-16T16:07:47Z’} |
On peut également naviguer dans ce json par clé comme dans un dictionnaire, par exemple si l’on souhaite ne récupérer que le login on peut faire comme cela :
login = response.json()['login']
print(login)
Ou si l’on souhaite récupèrer par exemple l’adresse mail de l’utilisateur :
email = response.json()['email']
print(email)
Totalité du code :
import requests
# Contient le token de GitHub
url = "https://api.github.com/users/nasa"
headers = {"Authorization":"token 789098c3109545sdfsdf59318dsqdz97"}
response = requests.get(url,headers=headers)
# On est maintenant connecté à notre API GitHub
# et on peut mtn voir le contenu de notre compte GitHub :
email = response.json()['email']
print(email)
Récupérer les données d’une entreprise sur GitHub
Cette fois on va récupérer des données d’entreprise, pour ce faire on utilise l’URL :
https://api.github.com/orgs/nom_entreprise
Pour l’exemple on récupérera les données entreprise de Facebook.
url = "https://api.github.com/orgs/facebook"
headers = {"Authorization":"token 789098c3109545sdfsdf59318dsqdz97"}
response = requests.get(url,headers=headers)
On affiche le résultat au format json :
print(response.json())
{‘login’: ‘facebook’, ‘id’: 69631, ‘node_id’: ‘MDEyOk9yZ2FuaXphdGlvbjY5NjMx’, ‘url’: ‘https://apii.github.com/orgs/facebook’, ‘repos_url’: ‘https://apii.github.com/orgs/facebook/issues’, ‘members_url’: ‘public_members_url’: ‘https://ap.github.com/orgs/facebook/public_members{/member}’, ‘avatar_url’: ‘https://avatars3.githubusercontent.com/u/69631?v=4’, ‘description’: ‘We are working to build community through open source technology. NB: members must have two-factor auth.’, ‘name’: ‘Facebook’, ‘company’: None, ‘blog’: ‘https://opensource.fb.com’, ‘location’: ‘Menlo Park, California’, ’email’: None, ‘twitter_username’: None, ‘is_verified’: True, ‘has_organization_projects’: True, ‘has_repository_projects’: True, ‘public_repos’: 121, ‘public_gists’: 12, ‘followers’: 0, ‘following’: 0, ‘html_url’: ‘https://github.com/facebook’, ‘created_at’: ‘2009-04-02T03:35:22Z’, ‘updated_at’: ‘2020-05-28T20:20:25Z’, ‘type’: ‘Organization’} |
Ici aussi on peut naviguer dans le json via les clés de dictionnaire.
Pour l’exemple nous allons récupérer la localisation géographique de l’entreprise :
localisation = response.json()['location']
print(localisation)
Code entier :
import requests
# Contient le token de GitHub
url = "https://api.github.com/orgs/facebook"
headers = {"Authorization":"token 789098c3109545sdfsdf59318dsqdz97"}
response = requests.get(url,headers=headers)
# On est maintenant connecté à notre API GitHub
# et on peut mtn voir le contenu de notre compte GitHub :
localisation = response.json()['location']
print(localisation)
# l'url : "https://api.github.com/orgs/facebook" nous permet
# d'afficher les info des organisations "orgs" et on a selectionné
# facebook mais on aurait pu mettre n'importe quel
# autre entreprise ça aurait fonctionner également
Accéder aux données d’un repository GitHub
Une fois encore une URL est requise pour récupérer les données d’un repository :
https://api.github.com/repos/nom_du_compte/nom_du_repo
On va tester avec le repository « metro » de Facebook.
url = "https://api.github.com/repos/facebook/metro"
headers = {"Authorization":"token 789098c3109545sdfsdf59318dsqdz97"}
response = requests.get(url,headers=headers)
print(response.content)
Jusqu’ici nous n’avons fait que récupérer des données mais spécialement pour toi on va agir 👇
Créer un repository avec l’API GitHub
L’URL à utiliser pour créer un repository :
https://api.github.com/user/repos
Pour créer le repo nous auront besoin de créer un payload qui sera utilisé ensuite dans la requête.
payload = {"name":"test_api","description":"Ceci est un repo crée pour tester l'api de GitHub"}
Le payload est donc est dictionnaire contenant un nom et une description.
Puis on lance ensuite une requête POST avec le payload en paramètre et le token de connexion :
response = requests.post(url,headers=headers,json=payload)
Le dépôt distant est maintenant créée et on peut avoir les informations sur le repo via un print :
print(response.content)
code entier :
import requests
payload = {"name":"test_api","description":"Ceci est un repo crée pour tester l'api de GitHub"}
headers = {"Authorization":"token 789098c3109545sdfsdf59318dsqdz97"}
url = "https://api.github.com/user/repos"
response = requests.post(url,headers=headers,json=payload)
print(response.content)
Supprimer un repository avec l’API GitHub
L’URL :
https://api.github.com/repos/nom_utilisateur/nom_du_repo
La différence cette fois c’est que l’on va lancer une requête DELETE :
response = requests.delete(url,headers=headers)
code entier :
import requests
url = "https://api.github.com/repos/mon_username/nom_de_mon_repo"
headers = {"Authorization":"token 789098c3109545sdfsdf59318dsqdz97"}
# La requête delete va supprimer l'objet :
response = requests.delete(url,headers=headers)
On a donc vu dans cet article quelques fonctionnalités cependant il en existe bien d’autres que tu retrouvera dans la doc de l’API