0Pricing
AI Agents · Lektion

Überblick über die GitHub REST API

PyGitHub-Bibliothek, persönliche Zugriffstokens und API-Ratenlimits.

Überblick über die GitHub REST API ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

PyGitHub — Der Python-Client für GitHub

PyGitHub ist die beliebteste Python-Bibliothek für die GitHub REST API. Sie kapselt die rohe HTTP-API mit Python-Objekten, die Repositories, Issues, PRs, Commits und Benutzer darstellen. Fast jede GitHub-Automatisierungsaufgabe beginnt mit Github(token=) und 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}')

Authentifizierung: Personal Access Token

Die einfachste Authentifizierung erfolgt mit einem Personal Access Token (PAT) — einem langlebigen Token, das an Ihr GitHub-Konto gebunden ist. Erstellen Sie ihn unter github.com → Settings → Developer settings → Personal access tokens. Speichern Sie ihn in einer Umgebungsvariable, niemals im Code. Verwenden Sie für mehr Sicherheit feingranulare PATs und beschränken Sie sie auf bestimmte 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

Authentifizierung mit einer GitHub App

Für Agents im Produktivbetrieb werden GitHub Apps gegenüber PATs bevorzugt. Sie verfügen über feingranulare Berechtigungen, können auf bestimmten Repositories installiert werden und verwenden kurzlebige Installationstoken, die automatisch erneuert werden. Verwenden Sie github.GithubIntegration, um Installationstoken zu generieren.

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

Ratenlimits: 5.000 Anfragen pro Stunde

Die GitHub REST API erlaubt 5.000 Anfragen pro Stunde für authentifizierte Benutzer. Jeder API-Aufruf zählt, auch Aufrufe mit Paginierung. Prüfen Sie Ihr verbleibendes Kontingent, bevor Sie Stapelverarbeitungen ausführen — wenn es aufgebraucht ist, geben alle Anfragen 403 Forbidden zurück, bis das Ratenlimit zurückgesetzt wird.

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

Ein Repository-Objekt abrufen

Das repo-Objekt ist der Ausgangspunkt für fast alle GitHub-Operationen. Rufen Sie es mit g.get_repo('owner/name') ab. Es enthält Metadaten wie Sterne, Forks, Beschreibung und Sichtbarkeit sowie Methoden für den Zugriff auf Issues, PRs, Commits, Releases und mehr.

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-Paginierung — PaginatedList

GitHub-API-Aufrufe, die viele Elemente zurückgeben (Issues, Commits, PRs), liefern eine PaginatedList. Sie können wie eine normale Liste darüber iterieren — PyGitHub ruft beim Iterieren automatisch weitere Seiten ab. Der Aufruf von len() für eine PaginatedList ruft dagegen alle Seiten ab, was teuer sein kann.

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

Ausnahmen bei Ratenlimits behandeln

Wenn Sie das Ratenlimit überschreiten, löst PyGitHub github.GithubException.RateLimitExceededException aus. Behandeln Sie diese Ausnahme, indem Sie die Zurücksetzungszeit prüfen und warten, bis das Limit zurückgesetzt wird. Bauen Sie dies in einen Wiederholungs-Wrapper ein, damit jeder GitHub-Aufruf robust ist.

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

GitHub durchsuchen

Verwenden Sie g.search_issues(), g.search_repositories() und g.search_code(), um die GitHub-Suche über alle öffentlichen und Ihre privaten Repositories auszuführen. Diese Methoden verwenden die Search API mit einem separaten Ratenlimit von 30 Anfragen pro 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')

Mit mehreren Repositories arbeiten

Agents müssen häufig über mehrere Repositories in einer Organisation hinweg arbeiten. Verwenden Sie g.get_organization(), um alle Repositories einer Organisation aufzulisten, und verarbeiten Sie sie anschließend in einer Schleife. Filtern Sie nach Sprache, archiviertem Status oder Aktivitätsdatum, um die Verarbeitung inaktiver Repositories zu vermeiden.

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

Dateiinhalte aus einem Repository lesen

Verwenden Sie repo.get_contents(path), um eine beliebige Datei aus einem Repository zu lesen. Der Inhalt ist Base64-kodiert, aber PyGitHub dekodiert ihn automatisch über die Eigenschaft .decoded_content. Geben Sie mit dem Parameter ref einen Branch oder eine Commit-SHA an.

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

Fehlerbehandlung für häufige GitHub-Ausnahmen

PyGitHub löst für alle API-Fehler eine GithubException aus. Häufige Unterklassen sind: UnknownObjectException (404 — Repository oder Issue nicht gefunden), BadCredentialsException (401 — ungültiges Token) und RateLimitExceededException (403 — Ratenlimit überschritten). Fangen Sie diese Ausnahmen immer gezielt ab.

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

Kurztest: Ratenlimit

Testen Sie Ihr Verständnis der Ratenlimits der GitHub API.

Zusammenfassung: GitHub REST API

Sie können jetzt mit PyGitHub eine Verbindung zu GitHub herstellen:

  • Github(token=) oder Github(auth=Auth.Token(...)) für die PAT-Authentifizierung
  • GitHub Apps mit GithubIntegration für Agents im Produktivbetrieb mit feingranularen Berechtigungen
  • Ratenlimit: 5.000 Anfragen pro Stunde; mit g.get_rate_limit() prüfen; RateLimitExceededException behandeln
  • PaginatedList: verzögert iterieren; mit .totalCount die Anzahl ermitteln, ohne alle Seiten abzurufen
  • g.get_repo('owner/name') — der Einstiegspunkt für Operationen auf Repository-Ebene
  • UnknownObjectException (404) und BadCredentialsException (401) ausdrücklich abfangen

Häufig gestellte Fragen

Ist die Lektion „Überblick über die GitHub REST API“ kostenlos?

Ja — der vollständige Text von „Überblick über die GitHub REST API“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Überblick über die GitHub REST API“?

PyGitHub-Bibliothek, persönliche Zugriffstokens und API-Ratenlimits. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Agents zu starten?

Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Überblick über die GitHub REST API“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?

Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Überblick über die GitHub REST API
  2. Issues auflisten und verwalten
  3. Automatisierte Kommentare zu PR-Reviews
  4. Commit-Historie und Diff-Analyse
← Zurück zu AI Agents