Översikt över GitHub REST API
PyGitHub-biblioteket, personliga åtkomsttokenar och API:ets hastighetsbegränsningar.
Översikt över GitHub REST API är en gratis lektion i AI-agenter på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för AI-agenter, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-agenter innehåller totalt 4 lektioner.
PyGitHub — Python-klienten för GitHub
PyGitHub är det populäraste Python-biblioteket för GitHubs REST API. Det kapslar in det råa HTTP-API:t med Python-objekt som representerar repos, issues, PR:ar, commits och användare. Nästan alla automatiseringsuppgifter för GitHub börjar med Github(token=) och 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: personlig åtkomsttoken
Den enklaste autentiseringen använder en personlig åtkomsttoken (PAT) — en långlivad token som är kopplad till ditt GitHub-konto. Skapa en på github.com → Settings → Developer settings → Personal access tokens. Lagra den i en miljövariabel, aldrig i koden. Använd finkorniga PAT:ar för bättre säkerhet (begränsa dem till specifika repos).
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
För produktionsagenter föredras GitHub Apps framför PAT:ar. De har finkorniga behörigheter, kan installeras på specifika repos och använder kortlivade installationstoken som roteras automatiskt. Använd github.GithubIntegration för att generera installationstoken.
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}')Anropsgränser: 5 000 anrop per timme
GitHubs REST API tillåter 5 000 anrop per timme för autentiserade användare. Varje API-anrop (även paginerade anrop) räknas. Kontrollera din återstående kvot innan du kör batchåtgärder — om kvoten tar slut returnerar alla anrop 403 Forbidden tills anropsgränsen återställs.
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!')Hämta ett repository-objekt
Objektet repo är utgångspunkten för nästan alla GitHub-operationer. Hämta det med g.get_repo('owner/name'). Det innehåller metadata (stjärnor, forks, beskrivning, synlighet) och metoder för att komma åt issues, PR:ar, commits, releaser med mera.
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-anrop som returnerar många objekt (issues, commits, PR:ar) returnerar en PaginatedList. Du kan iterera över den som över en vanlig lista — PyGitHub hämtar automatiskt nya sidor medan du itererar. Om du däremot anropar len() på en PaginatedList hämtas alla sidor, vilket kan vara kostsamt.
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 iterationHantera undantag för anropsgränsen
När du överskrider anropsgränsen utlöser PyGitHub github.GithubException.RateLimitExceededException. Hantera undantaget genom att kontrollera återställningstiden och vänta tills gränsen återställs. Bygg in detta i en wrapper för nya försök, så att alla GitHub-anrop blir motståndskraftiga.
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ök i hela GitHub
Använd g.search_issues(), g.search_repositories() och g.search_code() för att söka i GitHub bland alla publika repos (och dina privata). Dessa använder Search API med en separat anropsgräns på 30 anrop per minut.
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')Arbeta med flera repos
Agenter behöver ofta arbeta med flera repos i en organisation. Använd g.get_organization() för att lista alla repos i en organisation och bearbeta dem sedan i en loop. Filtrera efter språk, arkiveringsstatus eller aktivitetsdatum för att undvika att bearbeta inaktiva repos.
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äs filinnehåll från ett repo
Använd repo.get_contents(path) för att läsa valfri fil från ett repo. Innehållet är base64-kodat, men PyGitHub avkodar det automatiskt via egenskapen .decoded_content. Ange en branch eller commit-SHA med parametern 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])Felhantering för vanliga GitHub-undantag
PyGitHub utlöser GithubException för alla API-fel. Vanliga underklasser är UnknownObjectException (404 — repo eller issue hittades inte), BadCredentialsException (401 — ogiltig token) och RateLimitExceededException (403 — anropsgränsen har överskridits). Fånga alltid dessa 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 NoneSnabbtest: anropsgräns
Testa din förståelse av GitHub API:s anropsgränser.
Sammanfattning av GitHub REST API
Nu kan du ansluta till GitHub med PyGitHub:
- Github(token=) eller Github(auth=Auth.Token(...)) för PAT-autentisering
- GitHub Apps med
GithubIntegrationför produktionsagenter med finkorniga behörigheter - Anropsgräns: 5 000 anrop/timme; kontrollera med
g.get_rate_limit(); hanteraRateLimitExceededException - PaginatedList: iterera lazy; använd
.totalCountför antal utan att hämta alla sidor - g.get_repo('owner/name') — startpunkten för operationer på repånivå
- Fånga uttryckligen
UnknownObjectException(404) ochBadCredentialsException(401)
Lär dig AI-agenter med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 60
- Lektioner
- 239
Vanliga frågor
Är lektionen ”Översikt över GitHub REST API” gratis?
Ja – hela texten till ”Översikt över GitHub REST API” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i AI-agenter, kan Ni uppgradera till CoddyKit PRO. Kursen i AI-agenter innehåller totalt 4 lektioner.
Vad lär jag mig i ”Översikt över GitHub REST API”?
PyGitHub-biblioteket, personliga åtkomsttokenar och API:ets hastighetsbegränsningar. Ni övar på AI-agenter med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig AI-agenter?
Du behöver inga förkunskaper. Utbildningen i AI-agenter på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Översikt över GitHub REST API”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här AI-agenter-lektionen?
Ja. Varje AI-agenter-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Översikt över GitHub REST API
- Lista och hantera issues
- Automatiserade kommentarer vid PR-granskning
- Analysera commit-historik och diffar