Ikhtisar GitHub REST API
Pustaka PyGitHub, token akses pribadi, dan batas laju API.
Ikhtisar GitHub REST API adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
PyGitHub — Klien GitHub untuk Python
PyGitHub adalah pustaka Python paling populer untuk API REST GitHub. Pustaka ini membungkus API HTTP mentah dengan objek Python yang merepresentasikan repositori, isu, PR, komit, dan pengguna. Hampir setiap tugas otomatisasi GitHub dimulai dengan Github(token=) dan 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}')Autentikasi: Token Akses Pribadi
Autentikasi paling sederhana adalah Token Akses Pribadi (PAT) — token berumur panjang yang terikat pada akun GitHub Anda. Buat token di github.com → Pengaturan pengembang → Token akses pribadi. Simpan token dalam variabel lingkungan, jangan pernah di dalam kode. Gunakan PAT dengan cakupan terperinci untuk keamanan yang lebih baik (batasi cakupannya ke repositori tertentu).
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 doneAutentikasi Aplikasi GitHub
Untuk agen produksi, Aplikasi GitHub lebih disarankan daripada PAT. Aplikasi ini memiliki izin dengan cakupan terperinci, dapat dipasang pada repositori tertentu, dan menggunakan token instalasi berumur pendek yang berputar secara otomatis. Gunakan github.GithubIntegration untuk membuat token instalasi.
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}')Batas Laju: 5.000 Permintaan per Jam
API REST GitHub mengizinkan 5.000 permintaan per jam bagi pengguna yang terautentikasi. Setiap pemanggilan API (bahkan yang menggunakan penomoran halaman) dihitung. Periksa kuota yang tersisa sebelum menjalankan operasi batch — jika kuota habis, semua permintaan mengembalikan 403 Forbidden hingga batas laju diatur ulang.
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!')Mendapatkan Objek Repositori
Objek repo adalah titik awal untuk hampir semua operasi GitHub. Dapatkan objek tersebut dengan g.get_repo('owner/name'). Objek ini berisi metadata (bintang, fork, deskripsi, visibilitas) dan metode untuk mengakses isu, PR, komit, rilis, dan lainnya.
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}')Penomoran Halaman API — PaginatedList
Pemanggilan API GitHub yang mengembalikan banyak elemen (isu, komit, PR) menghasilkan PaginatedList. Anda dapat melakukan iterasi atasnya seperti pada daftar biasa — PyGitHub mengambil halaman secara otomatis selama iterasi. Namun, memanggil len() pada PaginatedList akan mengambil semua halaman, yang dapat membutuhkan banyak sumber daya.
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 iterationMenangani Pengecualian Batas Laju
Ketika Anda melampaui batas laju, PyGitHub memunculkan github.GithubException.RateLimitExceededException. Tangani pengecualian tersebut dengan memeriksa waktu pengaturan ulang dan menunggu hingga batas laju diatur ulang. Masukkan logika ini ke dalam pembungkus percobaan ulang agar setiap pemanggilan GitHub tetap tangguh.
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'
)Mencari di Seluruh GitHub
Gunakan g.search_issues(), g.search_repositories(), dan g.search_code() untuk menjalankan pencarian GitHub di semua repositori publik (dan repositori privat milik Anda). Semua fungsi ini menggunakan API Pencarian dengan batas laju terpisah, yaitu 30 permintaan per menit.
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')Bekerja dengan Banyak Repositori
Agen sering perlu beroperasi di beberapa repositori dalam sebuah organisasi. Gunakan g.get_organization() untuk mencantumkan semua repositori dalam organisasi, lalu proses repositori tersebut dalam sebuah perulangan. Saring berdasarkan bahasa, status pengarsipan, atau tanggal aktivitas agar tidak memproses repositori yang tidak aktif.
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()}')Membaca Isi Berkas dari Repositori
Gunakan repo.get_contents(path) untuk membaca berkas apa pun dari sebuah repositori. Kontennya dikodekan dalam base64, tetapi PyGitHub secara otomatis mendekodenya melalui properti .decoded_content. Tentukan cabang atau SHA komit dengan parameter 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])Penanganan Kesalahan Umum GitHub
PyGitHub memunculkan GithubException untuk semua kesalahan API. Subkelas yang umum meliputi: UnknownObjectException (404 — repositori atau isu tidak ditemukan), BadCredentialsException (401 — token salah), dan RateLimitExceededException (403 — batas laju terlampaui). Selalu tangkap pengecualian ini secara spesifik.
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 NonePemeriksaan Singkat: Batas Laju
Uji pemahaman Anda tentang batas laju API GitHub.
Ringkasan API REST GitHub
Sekarang Anda dapat terhubung ke GitHub dengan PyGitHub:
- Github(token=) atau Github(auth=Auth.Token(...)) untuk autentikasi PAT
- Aplikasi GitHub dengan
GithubIntegrationuntuk agen produksi dengan izin terperinci - Batas laju: 5.000 permintaan/jam; periksa dengan
g.get_rate_limit(); tanganiRateLimitExceededException - PaginatedList: lakukan iterasi secara malas; gunakan
.totalCountuntuk mendapatkan jumlah tanpa mengambil semua halaman - g.get_repo('owner/name') — titik masuk untuk operasi tingkat repositori
- Tangkap
UnknownObjectException(404) danBadCredentialsException(401) secara eksplisit
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Ikhtisar GitHub REST API” gratis?
Ya — teks lengkap “Ikhtisar GitHub REST API” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Ikhtisar GitHub REST API”?
Pustaka PyGitHub, token akses pribadi, dan batas laju API. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Ikhtisar GitHub REST API” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Ikhtisar GitHub REST API
- Mencantumkan dan Mengelola Isu
- Komentar Tinjauan PR Otomatis
- Riwayat Commit dan Analisis Perbedaan