AI-agenten · Les

Overzicht van de GitHub REST API

De PyGitHub-bibliotheek, personal access tokens en API-rate limits.

Les 1 van 413 stappen

Overzicht van de GitHub REST API is een gratis AI-agenten-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject AI-agenten. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus AI-agenten bevat in totaal 4 lessen.

PyGitHub — de Python-client voor GitHub

PyGitHub is de populairste Python-bibliotheek voor de GitHub REST API. De bibliotheek verpakt de onbewerkte HTTP-API in Python-objecten die repositories, issues, PR's, commits en gebruikers voorstellen. Vrijwel elke GitHub-automatiseringstaak begint met Github(token=) en 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}')

Authenticatie: persoonlijk toegangstoken

De eenvoudigste manier om te authenticeren is een persoonlijk toegangstoken (PAT) — een token met een lange geldigheidsduur dat aan je GitHub-account is gekoppeld. Maak er een aan via github.com → Settings → Developer settings → Personal access tokens. Sla het op in een omgevingsvariabele, nooit in code. Gebruik fijnmazige PAT's voor betere beveiliging (beperk ze tot specifieke repositories).

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 done

Authenticatie met GitHub Apps

Voor agents in productie hebben GitHub Apps de voorkeur boven PAT's. Ze hebben fijnmazige rechten, kunnen op specifieke repositories worden geïnstalleerd en gebruiken kortdurende installatietokens die automatisch rouleren. Gebruik github.GithubIntegration om installatietokens te genereren.

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}')

Snelheidslimieten: 5000 verzoeken per uur

De GitHub REST API staat 5000 verzoeken per uur toe voor geauthenticeerde gebruikers. Elke API-aanroep (ook gepagineerde aanroepen) telt mee. Controleer je resterende quotum voordat je batchbewerkingen uitvoert — als het op is, retourneren alle verzoeken 403 Forbidden totdat de snelheidslimiet wordt vernieuwd.

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!')

Een repositoryobject ophalen

Het repo-object is het startpunt voor vrijwel alle GitHub-bewerkingen. Haal het op met g.get_repo('owner/name'). Het bevat metagegevens (sterren, forks, beschrijving, zichtbaarheid) en methoden voor toegang tot issues, PR's, commits, releases en meer.

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}')

API-paginering — PaginatedList

GitHub API-aanroepen die veel elementen retourneren (issues, commits, PR's), retourneren een PaginatedList. Je kunt erdoorheen itereren zoals door een gewone lijst — PyGitHub haalt pagina's automatisch op terwijl je itereert. Als je echter len() op een PaginatedList aanroept, worden alle pagina's opgehaald, wat duur kan zijn.

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 iteration

Uitzonderingen voor snelheidslimieten afhandelen

Wanneer je de snelheidslimiet overschrijdt, genereert PyGitHub github.GithubException.RateLimitExceededException. Handel deze af door de tijd waarop de limiet wordt vernieuwd te controleren en te wachten totdat dat gebeurt. Bouw dit in een wrapper voor nieuwe pogingen in, zodat elke GitHub-aanroep robuust wordt.

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'
)

In heel GitHub zoeken

Gebruik g.search_issues(), g.search_repositories() en g.search_code() om de zoekfunctie van GitHub uit te voeren in alle openbare repositories en je privérepositories. Deze gebruiken de zoek-API met een aparte snelheidslimiet van 30 verzoeken per minuut.

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')

Werken met meerdere repositories

Agents moeten vaak in meerdere repositories binnen een organisatie werken. Gebruik g.get_organization() om alle repositories in een organisatie op te vragen en verwerk ze vervolgens in een lus. Filter op programmeertaal, archiveringsstatus of activiteitsdatum om te voorkomen dat je inactieve repositories verwerkt.

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()}')

Bestandsinhoud uit een repository lezen

Gebruik repo.get_contents(path) om elk bestand uit een repository te lezen. De inhoud is met base64 gecodeerd, maar PyGitHub decodeert deze automatisch via de eigenschap .decoded_content. Geef een branch of commit-SHA op met de parameter 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])

Fouten voor veelvoorkomende GitHub-uitzonderingen afhandelen

PyGitHub genereert GithubException voor alle API-fouten. Veelvoorkomende subklassen zijn: UnknownObjectException (404 — repository of issue niet gevonden), BadCredentialsException (401 — ongeldig token) en RateLimitExceededException (403 — snelheidslimiet). Vang deze altijd specifiek op.

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 None

Snelle controle: snelheidslimiet

Toets je begrip van de snelheidslimieten van de GitHub API.

Samenvatting van de GitHub REST API

Je kunt nu met PyGitHub verbinding maken met GitHub:

  • Github(token=) of Github(auth=Auth.Token(...)) voor authenticatie met PAT
  • GitHub Apps met GithubIntegration voor agents in productie met fijnmazige rechten
  • Snelheidslimiet: 5.000 verzoeken/uur; controleer met g.get_rate_limit(); handel RateLimitExceededException af
  • PaginatedList: itereer lui; gebruik .totalCount om aantallen op te vragen zonder alle pagina's op te halen
  • g.get_repo('owner/name') — het ingangspunt voor bewerkingen op repositoryniveau
  • Vang UnknownObjectException (404) en BadCredentialsException (401) expliciet op
Gratis beginnen

Leer AI-agenten met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
60
Lessen
239

Veelgestelde vragen

Is de les “Overzicht van de GitHub REST API” gratis?

Ja — de volledige tekst van “Overzicht van de GitHub REST API” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus AI-agenten wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus AI-agenten bevat in totaal 4 lessen.

Wat leer ik in “Overzicht van de GitHub REST API”?

De PyGitHub-bibliotheek, personal access tokens en API-rate limits. Je oefent met AI-agenten door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met AI-agenten te beginnen?

Ervaring vooraf is niet nodig. AI-agenten op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “Overzicht van de GitHub REST API”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over AI-agenten?

Ja. Elke les over AI-agenten bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Overzicht van de GitHub REST API
  2. Issues opsommen en beheren
  3. Geautomatiseerde opmerkingen bij PR-reviews
  4. Commitgeschiedenis en diffanalyse
← Terug naar AI-agenten