GitHub REST API'ye Genel Bakış
PyGitHub kitaplığı, kişisel erişim belirteçleri ve API hız sınırları.
GitHub REST API'ye Genel Bakış, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
PyGitHub — Python GitHub İstemcisi
PyGitHub, GitHub REST API'si için en popüler Python kütüphanesidir. Ham HTTP API'sini depoları, sorunları, PR'ları, işleme kayıtlarını ve kullanıcıları temsil eden Python nesneleriyle sarmalar. Neredeyse tüm GitHub otomasyon görevleri Github(token=) ve g.get_repo() ile başlar.
# 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}')Kimlik Doğrulama: Kişisel Erişim Token'ı
En basit kimlik doğrulama yöntemi, GitHub hesabınıza bağlı, uzun ömürlü bir Token olan Personal Access Token (PAT)'dır. Bir tane github.com → Ayarlar → Geliştirici ayarları → Kişisel erişim Token'ları bölümünden oluşturun. Bunu hiçbir zaman kodda tutmayın; bir ortam değişkeninde saklayın. Daha iyi güvenlik için ayrıntılı yetkilere sahip PAT'leri kullanın (kapsamı belirli depolarla sınırlayın).
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 doneGitHub Uygulamasıyla Kimlik Doğrulama
Üretim ortamındaki aracılar için GitHub Apps, PAT'lere tercih edilir. Ayrıntılı izinlere sahiptir, belirli depolara kurulabilir ve otomatik olarak yenilenen kısa ömürlü kurulum Token'ları kullanır. Kurulum Token'ları oluşturmak için github.GithubIntegration kullanın.
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}')Hız Sınırları: Saatte 5.000 İstek
GitHub REST API'si, kimliği doğrulanmış kullanıcılar için saatte 5.000 istek yapılmasına izin verir. Her API çağrısı (sayfalandırılmış olanlar bile) sayılır. Toplu işlemleri çalıştırmadan önce kalan kotanızı kontrol edin; kotanız biterse hız sınırı sıfırlanana kadar tüm istekler 403 Forbidden döndürür.
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!')Depo Nesnesi Alma
repo nesnesi, neredeyse tüm GitHub işlemleri için başlangıç noktasıdır. Nesneyi g.get_repo('owner/name') ile alın. Bu nesne meta verileri (yıldızlar, çatallar, açıklama, görünürlük) ve sorunlara, PR'lara, işleme kayıtlarına, sürümlere ve daha fazlasına erişmek için yöntemler içerir.
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 Sayfalandırması — PaginatedList
Çok sayıda öğe (sorunlar, işleme kayıtları, PR'lar) döndüren GitHub API çağrıları bir PaginatedList döndürür. Bu liste üzerinde normal bir listede olduğu gibi yineleme yapabilirsiniz; PyGitHub, yineleme sırasında sayfaları otomatik olarak getirir. Ancak bir PaginatedList üzerinde len() çağrısı tüm sayfaları getirir ve bu işlem maliyetli olabilir.
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ız Sınırı İstisnalarını Ele Alma
Hız sınırını aştığınızda PyGitHub, github.GithubException.RateLimitExceededException oluşturur. Sıfırlanma zamanını kontrol edip hız sınırı sıfırlanana kadar bekleyerek bu durumu ele alın. Her GitHub çağrısını dayanıklı hâle getirmek için bu yaklaşımı bir yeniden deneme sarmalayıcısına ekleyin.
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 Genelinde Arama
Tüm genel (ve özel) depolarınızda GitHub araması yapmak için g.search_issues(), g.search_repositories() ve g.search_code() kullanın. Bunlar, dakikada 30 istek şeklinde ayrı bir hız sınırına sahip Search API'sini kullanır.
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')Birden Çok Depoyla Çalışma
Araçların bir kuruluş içindeki birden çok depoda işlem yapması sık görülür. Bir kuruluştaki tüm depoları listelemek için g.get_organization() kullanın, ardından bunları bir döngüde işleyin. Etkin olmayan depoları işlemekten kaçınmak için dile, arşivlenme durumuna veya etkinlik tarihine göre filtreleyin.
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()}')Depodaki Dosya İçeriğini Okuma
Bir depodaki herhangi bir dosyayı okumak için repo.get_contents(path) kullanın. İçerik base64 ile kodlanır, ancak PyGitHub bunu .decoded_content özelliği aracılığıyla otomatik olarak çözer. ref parametresiyle bir dal veya işleme kaydı SHA'sı belirtin.
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])Yaygın GitHub İstisnalarını Ele Alma
PyGitHub, tüm API hataları için GithubException oluşturur. Yaygın alt sınıflar şunlardır: UnknownObjectException (404 — depo veya sorun bulunamadı), BadCredentialsException (401 — geçersiz Token), RateLimitExceededException (403 — hız sınırı). Bu istisnaları her zaman özel olarak yakalayın.
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 NoneHızlı Kontrol: Hız Sınırı
GitHub API'si hız sınırları konusundaki anlayışınızı sınayın.
GitHub REST API'si Özeti
Artık PyGitHub ile GitHub'a bağlanabilirsiniz:
- PAT kimlik doğrulaması için Github(token=) veya Github(auth=Auth.Token(...))
- Ayrıntılı izinlere sahip üretim aracılarında kullanılmak üzere
GithubIntegrationiçeren GitHub Apps - Hız sınırı: saatte 5.000 istek;
g.get_rate_limit()ile kontrol edin;RateLimitExceededExceptiondurumunu ele alın - PaginatedList: gerektikçe yineleyin; tüm sayfaları getirmeden sayıları almak için
.totalCountkullanın - g.get_repo('owner/name') — depo düzeyindeki işlemlerin giriş noktası
UnknownObjectException(404) veBadCredentialsException(401) durumlarını açıkça yakalayın
Yapay zeka eğitmeniyle AI Agents öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 60
- Dersler
- 239
Sıkça Sorulan Sorular
“GitHub REST API'ye Genel Bakış” dersi ücretsiz mi?
Evet — “GitHub REST API'ye Genel Bakış” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“GitHub REST API'ye Genel Bakış” dersinde ne öğreneceğim?
PyGitHub kitaplığı, kişisel erişim belirteçleri ve API hız sınırları. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“GitHub REST API'ye Genel Bakış” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- GitHub REST API'ye Genel Bakış
- Sorunları Listeleme ve Yönetme
- Otomatik PR İnceleme Yorumları
- İşleme Geçmişi ve Fark Analizi