AI-agenter · Lektion

Oversigt over GitHub REST API

PyGitHub-biblioteket, personlige access tokens og API-rategrænser.

Lektion 1 af 413 trin

Oversigt over GitHub REST API er en gratis AI-agenter-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i AI-agenter, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. AI-agenter-kurset indeholder 4 lektioner i alt.

PyGitHub — Python-klienten til GitHub

PyGitHub er det mest populære Python-bibliotek til GitHub REST API. Det omslutter den rå HTTP-API med Python-objekter, der repræsenterer repositories, sager, PR'er, commits og brugere. Næsten alle automatiseringsopgaver i GitHub begynder med Github(token=) og 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}')

Godkendelse: personligt adgangstoken

Den enkleste form for godkendelse er et personligt adgangstoken (PAT) — et langtidsholdbart token, der er knyttet til din GitHub-konto. Opret et på github.com → Settings → Developer settings → Personal access tokens. Gem det i en miljøvariabel, aldrig i kode. Brug finkornede PAT'er for bedre sikkerhed (begræns dem til bestemte 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

Godkendelse med GitHub Apps

Til produktionsagenter foretrækkes GitHub Apps frem for PAT'er. De har finkornede tilladelser, kan installeres på bestemte repositories og bruger kortlivede installationstokens, der roteres automatisk. Brug github.GithubIntegration til at generere installationstokens.

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

Hastighedsbegrænsninger: 5.000 forespørgsler i timen

GitHub REST API tillader 5.000 forespørgsler i timen for godkendte brugere. Hvert API-kald, også sideinddelte kald, tæller. Kontrollér din resterende kvote, før du kører batchhandlinger — hvis du løber tør, returnerer alle forespørgsler 403 Forbudt, indtil hastighedsbegrænsningen nulstilles.

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

Hentning af et repository-objekt

repo-objektet er udgangspunktet for næsten alle GitHub-handlinger. Hent det med g.get_repo('owner/name'). Det indeholder metadata (stjerner, forgreninger, beskrivelse og synlighed) samt metoder til at få adgang til sager, PR'er, commits, udgivelser og meget mere.

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

GitHub API-kald, der returnerer mange elementer (sager, commits og PR'er), returnerer en PaginatedList. Du kan gennemløbe den som en almindelig liste — PyGitHub henter automatisk sider, efterhånden som du gennemløber den. Men hvis du kalder len() på en PaginatedList, hentes alle sider, hvilket kan være ressourcekrævende.

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

Håndtering af undtagelser fra hastighedsbegrænsninger

Når du overskrider hastighedsbegrænsningen, udløser PyGitHub github.GithubException.RateLimitExceededException. Håndter den ved at kontrollere nulstillingstidspunktet og vente, indtil begrænsningen nulstilles. Byg dette ind i en genforsøgsomvikling, så alle GitHub-kald bliver robuste.

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

Søgning på tværs af GitHub

Brug g.search_issues(), g.search_repositories() og g.search_code() til at søge i GitHub på tværs af alle offentlige repositories samt dine private repositories. De bruger Search API med en separat hastighedsbegrænsning på 30 forespørgsler i minuttet.

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

Arbejde med flere repositories

Agenter skal ofte arbejde på tværs af flere repositories i en organisation. Brug g.get_organization() til at opliste alle repositories i en organisation, og behandl dem derefter i en løkke. Filtrér efter sprog, arkiveringsstatus eller aktivitetsdato for at undgå at behandle inaktive repositories.

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

Læsning af filindhold fra et repository

Brug repo.get_contents(path) til at læse en hvilken som helst fil fra et repository. Indholdet er base64-kodet, men PyGitHub afkoder det automatisk via egenskaben .decoded_content. Angiv en gren eller commit-SHA med parameteren 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])

Fejlhåndtering for almindelige GitHub-undtagelser

PyGitHub udløser GithubException for alle API-fejl. Almindelige underklasser er: UnknownObjectException (404 — repository eller sag blev ikke fundet), BadCredentialsException (401 — ugyldigt token) og RateLimitExceededException (403 — hastighedsbegrænsning). Fang altid disse specifikt.

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

Hurtigt tjek: hastighedsbegrænsning

Test din forståelse af GitHub API's hastighedsbegrænsninger.

Opsummering af GitHub REST API

Du kan nu oprette forbindelse til GitHub med PyGitHub:

  • Github(token=) eller Github(auth=Auth.Token(...)) til PAT-godkendelse
  • GitHub Apps med GithubIntegration til produktionsagenter med finkornede tilladelser
  • Hastighedsbegrænsning: 5.000 forespørgsler i timen; kontrollér med g.get_rate_limit(); håndtér RateLimitExceededException
  • PaginatedList: gennemløb den dovent; brug .totalCount til optællinger uden at hente alle sider
  • g.get_repo('owner/name') — indgangspunktet til handlinger på repository-niveau
  • Fang UnknownObjectException (404) og BadCredentialsException (401) eksplicit
Gratis at komme i gang

Lær AI-agenter med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
60
Lektioner
239

Ofte stillede spørgsmål

Er lektionen “Oversigt over GitHub REST API” gratis?

Ja — hele teksten til “Oversigt over GitHub REST API” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af AI-agenter-kurset, skal du opgradere til CoddyKit PRO. AI-agenter-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Oversigt over GitHub REST API”?

PyGitHub-biblioteket, personlige access tokens og API-rategrænser. Du øver dig i AI-agenter med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på AI-agenter?

Der kræves ingen tidligere erfaring. AI-agenter på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Oversigt over GitHub REST API”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne AI-agenter-lektion?

Ja. Alle AI-agenter-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Oversigt over GitHub REST API
  2. Visning og håndtering af issues
  3. Automatiserede kommentarer til PR-gennemgang
  4. Analyse af commit-historik og diffs
← Tilbage til AI-agenter