Przegląd GitHub REST API
Biblioteka PyGitHub, osobiste tokeny dostępu i limity zapytań API.
Przegląd GitHub REST API to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.
PyGitHub — klient GitHuba dla Pythona
PyGitHub to najpopularniejsza biblioteka Pythona do obsługi interfejsu GitHub REST API. Opakowuje surowe API HTTP w obiekty Pythona reprezentujące repozytoria, zgłoszenia, PR-y, commity i użytkowników. Niemal każde zadanie związane z automatyzacją GitHuba zaczyna się od Github(token=) i 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}')Uwierzytelnianie: osobisty token dostępu
Najprostszą metodą uwierzytelniania jest osobisty token dostępu (PAT) — token długoterminowy powiązany z kontem GitHub. Należy utworzyć go w sekcji github.com → Settings → Developer settings → Personal access tokens. Token należy przechowywać w zmiennej środowiskowej, nigdy w kodzie. Dla większego bezpieczeństwa warto używać tokenów PAT o precyzyjnie określonych uprawnieniach i ograniczać ich zakres do konkretnych repozytoriów.
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 doneUwierzytelnianie za pomocą aplikacji GitHub
W przypadku agentów produkcyjnych preferowane są aplikacje GitHub zamiast tokenów PAT. Mają precyzyjnie określone uprawnienia, można je zainstalować w konkretnych repozytoriach, a także używają krótkotrwałych tokenów instalacyjnych, które są automatycznie wymieniane. Do generowania tokenów instalacyjnych należy użyć github.GithubIntegration.
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}')Limity zapytań: 5000 zapytań na godzinę
GitHub REST API pozwala uwierzytelnionym użytkownikom wykonywać 5000 zapytań na godzinę. Każde wywołanie API, również stronicowane, jest wliczane do limitu. Przed uruchomieniem operacji wsadowych należy sprawdzić pozostały limit — po jego wyczerpaniu wszystkie zapytania zwracają 403 Forbidden aż do zresetowania limitu.
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!')Pobieranie obiektu repozytorium
Obiekt repo jest punktem wyjścia dla niemal wszystkich operacji na GitHubie. Można go pobrać za pomocą g.get_repo('owner/name'). Zawiera metadane, takie jak liczba gwiazdek, forków, opis i widoczność, oraz metody umożliwiające dostęp do zgłoszeń, PR-ów, commitów, wydań i innych elementów.
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}')Stronicowanie API — PaginatedList
Wywołania GitHub API zwracające wiele elementów, takich jak zgłoszenia, commity i PR-y, zwracają obiekt PaginatedList. Można go iterować tak jak zwykłą listę — PyGitHub automatycznie pobiera kolejne strony podczas iteracji. Wywołanie len() na obiekcie PaginatedList pobiera jednak wszystkie strony, co może być kosztowne.
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 iterationObsługa wyjątków związanych z limitem zapytań
Po przekroczeniu limitu zapytań PyGitHub zgłasza wyjątek github.GithubException.RateLimitExceededException. Należy go obsłużyć, sprawdzając czas resetowania limitu i wstrzymując działanie do tego momentu. Warto umieścić tę logikę w mechanizmie ponawiania prób, aby każde wywołanie GitHuba było odporne na takie błędy.
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'
)Wyszukiwanie w GitHubie
Za pomocą g.search_issues(), g.search_repositories() i g.search_code() można przeszukiwać GitHuba we wszystkich publicznych repozytoriach oraz prywatnych repozytoriach, do których ma się dostęp. Metody te korzystają z Search API, które ma osobny limit wynoszący 30 zapytań na 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')Praca z wieloma repozytoriami
Agenci często muszą działać w wielu repozytoriach należących do organizacji. Należy użyć g.get_organization(), aby wyświetlić wszystkie repozytoria w organizacji, a następnie przetworzyć je w pętli. Aby uniknąć przetwarzania nieaktywnych repozytoriów, można filtrować je według języka, statusu archiwizacji lub daty ostatniej aktywności.
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()}')Odczytywanie zawartości plików z repozytorium
Za pomocą repo.get_contents(path) można odczytać dowolny plik z repozytorium. Zawartość jest zakodowana w formacie base64, ale PyGitHub automatycznie ją dekoduje za pośrednictwem właściwości .decoded_content. Gałąź lub SHA commita należy określić za pomocą parametru 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])Obsługa typowych wyjątków GitHuba
PyGitHub zgłasza GithubException w przypadku wszystkich błędów API. Typowe podklasy to: UnknownObjectException (404 — nie znaleziono repozytorium lub zgłoszenia), BadCredentialsException (401 — nieprawidłowy token) oraz RateLimitExceededException (403 — przekroczono limit zapytań). Zawsze należy przechwytywać je osobno.
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 NoneSzybki test: limit zapytań
Proszę sprawdzić swoją wiedzę na temat limitów zapytań GitHub API.
Podsumowanie: GitHub REST API
Można już łączyć się z GitHubem za pomocą PyGitHub:
- Github(token=) lub Github(auth=Auth.Token(...)) do uwierzytelniania za pomocą PAT
- Aplikacje GitHub z użyciem
GithubIntegrationdla agentów produkcyjnych z precyzyjnie określonymi uprawnieniami - Limit zapytań: 5000 zapytań na godzinę; sprawdzanie za pomocą
g.get_rate_limit(); obsługaRateLimitExceededException - PaginatedList: leniwa iteracja; użycie
.totalCountdo uzyskania liczby elementów bez pobierania wszystkich stron - g.get_repo('owner/name') — punkt wejścia do operacji na poziomie repozytorium
- Jawne przechwytywanie
UnknownObjectException(404) iBadCredentialsException(401)
Często zadawane pytania
Czy lekcja „Przegląd GitHub REST API” jest bezpłatna?
Tak — pełny tekst „Przegląd GitHub REST API” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.
Co nauczysz się w „Przegląd GitHub REST API”?
Biblioteka PyGitHub, osobiste tokeny dostępu i limity zapytań API. Ćwiczysz AI Agents z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Agents?
Nie wymagamy żadnego doświadczenia. AI Agents w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Przegląd GitHub REST API”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Agents?
Tak. Każda lekcja AI Agents zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Przegląd GitHub REST API
- Listowanie i zarządzanie zgłoszeniami
- Automatyczne komentarze w przeglądach PR
- Historia commitów i analiza diffów