Présentation de l’API REST GitHub
Bibliothèque PyGitHub, tokens d’accès personnels et limites de débit de l’API.
Présentation de l’API REST GitHub est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.
PyGitHub — Le client GitHub pour Python
PyGitHub est la bibliothèque Python la plus populaire pour l’API REST de GitHub. Elle encapsule l’API HTTP brute au moyen d’objets Python représentant les dépôts, les tickets, les PR, les validations et les utilisateurs. Presque toutes les tâches d’automatisation GitHub commencent par Github(token=) et g.get_repo().
# Install: pip install PyGitHub
from github import Github
import os
# Authenticate with a personal access token
g = Github(token=os.environ['GITHUB_TOKEN'])
# Get the authenticated user
user = g.get_user()
print(f'Logged in as: {user.login}')
print(f'Name: {user.name}')
print(f'Public repos: {user.public_repos}')
# Get a specific repository
repo = g.get_repo('octocat/Hello-World')
print(f'Repo: {repo.full_name}')
print(f'Stars: {repo.stargazers_count}')Authentification : jeton d’accès personnel
La méthode d’authentification la plus simple consiste à utiliser un jeton d’accès personnel (PAT) — un jeton de longue durée associé à votre compte GitHub. Créez-en un dans github.com → Paramètres → Paramètres de développeur → Jetons d’accès personnels. Stockez-le dans une variable d’environnement, jamais dans le code. Utilisez des PAT à granularité fine pour renforcer la sécurité (limitez-les à des dépôts précis).
from github import Github, Auth
import os
# Method 1: Classic token (works with PyGitHub)
token = os.environ['GITHUB_TOKEN']
g = Github(token=token)
# Method 2: Auth object (recommended for PyGitHub >= 1.59)
auth = Auth.Token(os.environ['GITHUB_TOKEN'])
g = Github(auth=auth)
# Test authentication
try:
user = g.get_user()
print(f'Authenticated as {user.login}')
except Exception as e:
print(f'Auth failed: {e}')
print('Check: Is GITHUB_TOKEN set? Has it expired?')
g.close() # close the connection when doneAuthentification avec une application GitHub
Pour les agents en production, les applications GitHub sont préférables aux PAT. Elles disposent d’autorisations précises, peuvent être installées sur des dépôts spécifiques et utilisent des jetons d’installation à courte durée de vie qui se renouvellent automatiquement. Utilisez github.GithubIntegration pour générer des jetons d’installation.
import os
import github
APP_ID = os.environ['GITHUB_APP_ID']
PRIVATE_KEY = os.environ['GITHUB_APP_PRIVATE_KEY'] # PEM content
INSTALLATION_ID = os.environ['GITHUB_INSTALLATION_ID']
# Create GitHub App client
auth = github.Auth.AppAuth(APP_ID, PRIVATE_KEY)
gi = github.GithubIntegration(auth=auth)
# Get installation access token (expires in 1 hour)
installation = gi.get_installation(int(INSTALLATION_ID))
access_token = gi.get_access_token(int(INSTALLATION_ID))
# Use the token with a standard Github client
g = github.Github(token=access_token.token)
print(f'App authenticated, token expires: {access_token.expires_at}')Limites de requêtes : 5 000 par heure
L’API REST de GitHub autorise 5 000 requêtes par heure pour les utilisateurs authentifiés. Chaque appel d’API, y compris les appels paginés, est comptabilisé. Vérifiez le quota restant avant d’exécuter des opérations par lots : si vous l’épuisez, toutes les requêtes renvoient 403 Forbidden jusqu’à la réinitialisation de la limite.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
# Check current rate limit status
rate_limit = g.get_rate_limit()
core = rate_limit.core
print(f'Remaining: {core.remaining}/{core.limit} requests')
print(f'Resets at: {core.reset}')
# Calculate time until reset
import datetime
now = datetime.datetime.utcnow()
reset_in = (core.reset.replace(tzinfo=None) - now).seconds
print(f'Reset in: {reset_in // 60}m {reset_in % 60}s')
# Check before heavy operations
if core.remaining < 100:
print('WARNING: Rate limit nearly exhausted!')Récupérer un objet dépôt
L’objet repo est le point de départ de presque toutes les opérations GitHub. Récupérez-le avec g.get_repo('owner/name'). Il contient des métadonnées (étoiles, dérivations, description, visibilité) et des méthodes permettant d’accéder aux tickets, aux PR, aux validations, aux versions publiées et à bien d’autres éléments.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# Repository metadata
print(f'Full name: {repo.full_name}')
print(f'Description: {repo.description}')
print(f'Default branch: {repo.default_branch}')
print(f'Stars: {repo.stargazers_count}')
print(f'Forks: {repo.forks_count}')
print(f'Open issues: {repo.open_issues_count}')
print(f'Private: {repo.private}')
print(f'Language: {repo.language}')
print(f'Created: {repo.created_at}')
print(f'Last push: {repo.pushed_at}')Pagination de l’API — PaginatedList
Les appels à l’API GitHub qui renvoient de nombreux éléments (tickets, validations, PR) renvoient une PaginatedList. Vous pouvez la parcourir comme une liste ordinaire : PyGitHub récupère automatiquement les pages au fil de l’itération. Toutefois, appeler len() sur une PaginatedList récupère toutes les pages, ce qui peut être coûteux.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# PaginatedList: fetch pages lazily as you iterate
issues = repo.get_issues(state='open') # returns PaginatedList
# Iterate — fetches pages 30 at a time automatically
for issue in issues:
print(f'#{issue.number}: {issue.title}')
# Get first N items without fetching everything
first_10 = list(issues[:10]) # only fetches first page
# Count (WARNING: fetches ALL pages)
total_open = issues.totalCount # uses the count from API metadata, not iterationGérer les exceptions liées à la limite de requêtes
Lorsque vous dépassez la limite de requêtes, PyGitHub lève github.GithubException.RateLimitExceededException. Gérez cette exception en vérifiant l’heure de réinitialisation et en mettant le programme en pause jusqu’à la réinitialisation de la limite. Intégrez ce mécanisme à un système de nouvelle tentative pour rendre tout appel GitHub résilient.
from github import Github
from github.GithubException import RateLimitExceededException
import os
import time
import datetime
g = Github(token=os.environ['GITHUB_TOKEN'])
def github_call_with_rate_limit(func, *args, **kwargs):
while True:
try:
return func(*args, **kwargs)
except RateLimitExceededException:
rate_limit = g.get_rate_limit()
reset_time = rate_limit.core.reset.replace(tzinfo=None)
now = datetime.datetime.utcnow()
wait_seconds = (reset_time - now).total_seconds() + 10
print(f'Rate limit exceeded. Sleeping {wait_seconds:.0f}s until reset...')
time.sleep(max(wait_seconds, 1))
# Usage
repo = github_call_with_rate_limit(
g.get_repo, 'myorg/myrepo'
)Rechercher dans GitHub
Utilisez g.search_issues(), g.search_repositories() et g.search_code() pour effectuer des recherches GitHub dans tous les dépôts publics, ainsi que dans vos dépôts privés. Ces méthodes utilisent l’API de recherche, qui dispose d’une limite distincte de 30 requêtes par minute.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
# Search issues across all your repos
results = g.search_issues(
query='is:open is:issue label:bug user:myorg',
sort='created',
order='desc'
)
print(f'Found {results.totalCount} open bugs')
for issue in results[:10]:
print(f'{issue.repository.full_name}#{issue.number}: {issue.title}')
# Search for repos using a specific package
repos = g.search_repositories(
query='topic:machine-learning language:python stars:>100'
)
for repo in repos[:5]:
print(f'{repo.full_name}: {repo.stargazers_count} stars')Travailler avec plusieurs dépôts
Les agents doivent souvent agir sur plusieurs dépôts d’une organisation. Utilisez g.get_organization() pour lister tous les dépôts d’une organisation, puis traitez-les dans une boucle. Filtrez-les selon le langage, l’état d’archivage ou la date d’activité afin d’éviter de traiter des dépôts inactifs.
from github import Github
import os
import datetime
g = Github(token=os.environ['GITHUB_TOKEN'])
org = g.get_organization('myorg')
# Get all active Python repos
cutoff = datetime.datetime.now() - datetime.timedelta(days=180)
active_repos = [
repo
for repo in org.get_repos(type='all')
if (
not repo.archived
and repo.language == 'Python'
and repo.pushed_at
and repo.pushed_at.replace(tzinfo=None) > cutoff
)
]
print(f'Active Python repos: {len(active_repos)}')
for repo in active_repos[:5]:
print(f' {repo.name}: last push {repo.pushed_at.date()}')Lire le contenu d’un fichier dans un dépôt
Utilisez repo.get_contents(path) pour lire n’importe quel fichier d’un dépôt. Le contenu est encodé en base64, mais PyGitHub le décode automatiquement via la propriété .decoded_content. Indiquez une branche ou un SHA de validation avec le paramètre ref.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# Read a file from the default branch
contents = repo.get_contents('README.md')
readme_text = contents.decoded_content.decode('utf-8')
print(f'README ({len(readme_text)} chars):')
print(readme_text[:200])
# Read from a specific branch
requirements = repo.get_contents(
'requirements.txt',
ref='feature/new-deps'
)
deps = requirements.decoded_content.decode('utf-8')
print('Dependencies:', deps[:300])Gérer les exceptions GitHub courantes
PyGitHub lève GithubException pour toutes les erreurs d’API. Sous-classes courantes : UnknownObjectException (404 — dépôt ou ticket introuvable), BadCredentialsException (401 — jeton incorrect) et RateLimitExceededException (403 — limite de requêtes dépassée). Interceptez toujours ces exceptions de manière explicite.
from github import Github
from github.GithubException import (
GithubException, UnknownObjectException,
BadCredentialsException, RateLimitExceededException
)
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
def get_repo_safely(repo_full_name):
try:
return g.get_repo(repo_full_name)
except BadCredentialsException:
print('ERROR: GitHub token is invalid or expired')
return None
except UnknownObjectException:
print(f'ERROR: Repo not found: {repo_full_name}')
print('Check: typo in name? Private repo you can\'t access?')
return None
except RateLimitExceededException:
print('ERROR: GitHub rate limit exceeded, retry later')
return None
except GithubException as e:
print(f'GitHub API error {e.status}: {e.data}')
return NoneVérification rapide : limite de requêtes
Testez votre compréhension des limites de requêtes de l’API GitHub.
Récapitulatif de l’API REST de GitHub
Vous pouvez désormais vous connecter à GitHub avec PyGitHub :
- Github(token=) ou Github(auth=Auth.Token(...)) pour l’authentification par PAT
- Applications GitHub avec
GithubIntegrationpour les agents de production dotés d’autorisations précises - Limite de requêtes : 5 000 requêtes par heure ; vérifiez-la avec
g.get_rate_limit()et gérezRateLimitExceededException - PaginatedList : parcourez la liste de manière différée ; utilisez
.totalCountpour obtenir le nombre d’éléments sans récupérer toutes les pages - g.get_repo('owner/name') — le point d’entrée des opérations au niveau du dépôt
- Interceptez explicitement
UnknownObjectException(404) etBadCredentialsException(401)
Questions Fréquemment Posées
La leçon « Présentation de l’API REST GitHub » est-elle gratuite ?
Oui — le texte complet de « Présentation de l’API REST GitHub » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Présentation de l’API REST GitHub » ?
Bibliothèque PyGitHub, tokens d’accès personnels et limites de débit de l’API. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Agents ?
Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Présentation de l’API REST GitHub » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?
Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Présentation de l’API REST GitHub
- Répertorier et gérer les problèmes
- Commentaires automatisés de revue de PR
- Historique des commits et analyse des différences