Oversikt over GitHub REST API
PyGitHub-biblioteket, personlige tilgangstokener og API-frekvensgrenser.
Oversikt over GitHub REST API er en gratis leksjon i AI-agenter på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-agenter, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-agenter inneholder totalt 4 leksjoner.
PyGitHub — Python-klienten for GitHub
PyGitHub er det mest populære Python-biblioteket for GitHub REST API-et. Det pakker inn det underliggende HTTP-API-et med Python-objekter som representerer repoer, issues, PR-er, commits og brukere. Nesten alle automatiseringsoppgaver i GitHub begynner 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}')Autentisering: Personal Access Token
Den enkleste måten å autentisere på er et Personal Access Token (PAT) — et langlivet token knyttet til GitHub-kontoen Deres. Opprett et på github.com → Settings → Developer settings → Personal access tokens. Lagre det i en miljøvariabel, aldri i kode. Bruk finkornede PAT-er for bedre sikkerhet (avgrens dem til bestemte repoer).
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 doneAutentisering med GitHub App
For agenter i produksjon foretrekkes GitHub Apps fremfor PAT-er. De har finkornede tillatelser, kan installeres på bestemte repoer og bruker kortlivede installasjonstokener som roteres automatisk. Bruk github.GithubIntegration til å generere installasjonstokener.
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}')Rategrense: 5 000 forespørsler per time
GitHub REST API tillater 5 000 forespørsler per time for autentiserte brukere. Hvert API-kall teller med, også paginerte kall. Kontroller gjenværende kvote før De kjører masseoperasjoner — hvis kvoten brukes opp, returnerer alle forespørsler 403 Forbidden til rategrensen nullstilles.
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!')Hente et repo-objekt
repo-objektet er utgangspunktet for nesten alle GitHub-operasjoner. Hent det med g.get_repo('owner/name'). Det inneholder metadata (stjerner, forker, beskrivelse, synlighet) og metoder for å få tilgang til issues, PR-er, commits, releases og mer.
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-kall som returnerer mange elementer (issues, commits, PR-er), returnerer en PaginatedList. De kan iterere over den som over en vanlig liste — PyGitHub henter sider automatisk etter hvert som De itererer. Å kalle len() på en PaginatedList henter imidlertid alle sider, noe som kan være kostbart.
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 iterationHåndtering av rategrense-unntak
Når De overskrider rategrensen, kaster PyGitHub github.GithubException.RateLimitExceededException. Håndter dette ved å kontrollere tidspunktet for nullstilling og vente til rategrensen nullstilles. Bygg dette inn i en wrapper for nye forsøk, slik at alle GitHub-kall blir 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øke på tvers av GitHub
Bruk g.search_issues(), g.search_repositories() og g.search_code() til å søke i GitHub på tvers av alle offentlige og Deres private repoer. Disse bruker Search API med en separat rategrense på 30 forespørsler per minutt.
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')Arbeide med flere repoer
Agenter må ofte arbeide på tvers av flere repoer i en organisasjon. Bruk g.get_organization() til å liste opp alle repoene i en organisasjon, og behandle dem deretter i en løkke. Filtrer etter språk, arkivstatus eller aktivitetsdato for å unngå å behandle inaktive repoer.
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()}')Lese filinnhold fra et repo
Bruk repo.get_contents(path) til å lese hvilken som helst fil fra et repo. Innholdet er base64-kodet, men PyGitHub dekoder det automatisk via egenskapen .decoded_content. Angi en branch 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])Feilhåndtering for vanlige GitHub-unntak
PyGitHub kaster GithubException for alle API-feil. Vanlige underklasser er: UnknownObjectException (404 — repo eller issue ikke funnet), BadCredentialsException (401 — ugyldig token) og RateLimitExceededException (403 — rategrense). Fang alltid disse spesifikt.
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 NoneHurtigsjekk: rategrense
Test forståelsen Deres av rategrensene i GitHub API.
Oppsummering av GitHub REST API
De kan nå koble til GitHub med PyGitHub:
- Github(token=) eller Github(auth=Auth.Token(...)) for PAT-autentisering
- GitHub Apps med
GithubIntegrationfor produksjonsagenter med finkornede tillatelser - Rate limit: 5,000 req/hr; sjekk med
g.get_rate_limit(); håndterRateLimitExceededException - PaginatedList: iterer på en lat måte; bruk
.totalCountfor antall uten å hente alle sider - g.get_repo('owner/name') — inngangspunktet for operasjoner på repo-nivå
- Fang
UnknownObjectException(404) ogBadCredentialsException(401) eksplisitt
Lær deg AI-agenter med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 60
- Leksjoner
- 239
Ofte stilte spørsmål
Er leksjonen «Oversikt over GitHub REST API» gratis?
Ja – hele teksten i «Oversikt over GitHub REST API» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av AI-agenter-kurset, kan du oppgradere til CoddyKit PRO. Kurset i AI-agenter inneholder totalt 4 leksjoner.
Hva lærer jeg i «Oversikt over GitHub REST API»?
PyGitHub-biblioteket, personlige tilgangstokener og API-frekvensgrenser. Du øver på AI-agenter med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med AI-agenter?
Ingen tidligere erfaring er nødvendig. AI-agenter på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Oversikt over GitHub REST API»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne AI-agenter-leksjonen?
Ja. Alle AI-agenter-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Oversikt over GitHub REST API
- Liste opp og administrere issues
- Automatiserte kommentarer i PR-gjennomganger
- Analyse av commit-historikk og differ