GitHub REST API:n yleiskatsaus
PyGitHub-kirjasto, henkilökohtaiset käyttötokenit ja API:n pyyntörajoitukset
GitHub REST API:n yleiskatsaus on ilmainen Tekoälyagentit-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Tekoälyagentit-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Tekoälyagentit-kurssilla on yhteensä 4 oppituntia.
PyGitHub — Pythonin GitHub-asiakaskirjasto
PyGitHub on suosituin Python-kirjasto GitHubin REST APIa varten. Se käärii HTTP-rajapinnan Python-olioiksi, jotka edustavat repositorioita, issueita, PR:iä, komitteja ja käyttäjiä. Lähes kaikki GitHubin automatisointitehtävät alkavat kutsuilla Github(token=) ja 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}')Todennus: Personal Access Token
Yksinkertaisin todennustapa on Personal Access Token (PAT) eli GitHub-tiliinne sidottu pitkäkestoinen tunniste. Luokaa tunniste osoitteessa github.com → Settings → Developer settings → Personal access tokens. Tallentakaa se ympäristömuuttujaan, ei koskaan koodiin. Käyttäkää tarkkarajaisia PAT-tunnisteita paremman tietoturvan saavuttamiseksi ja rajatkaa ne tiettyihin repositorioihin.
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 App -todennus
Tuotantoagenteille GitHub Apps on suositeltava vaihtoehto PAT-tunnisteille. Niillä on tarkkarajaiset käyttöoikeudet, ne voidaan asentaa tiettyihin repositorioihin ja ne käyttävät lyhytkestoisia, automaattisesti vaihtuvia asennustunnisteita. Luokaa asennustunnisteet komennolla 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}')Rajoitukset: 5 000 pyyntöä tunnissa
GitHubin REST API sallii todennetuille käyttäjille 5 000 pyyntöä tunnissa. Jokainen API-kutsu, myös sivutettu kutsu, lasketaan mukaan. Tarkistakaa jäljellä oleva kiintiö ennen erätoimintojen suorittamista — jos kiintiö loppuu, kaikki pyynnöt palauttavat arvon 403 Forbidden, kunnes rajoitus nollautuu.
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!')Repository-olion hakeminen
repo-olio on lähes kaikkien GitHub-toimintojen lähtökohta. Hakekaa se komennolla g.get_repo('owner/name'). Se sisältää metatietoja, kuten tähtien ja haarautumisten määrät, kuvauksen ja näkyvyyden, sekä menetelmiä issueiden, PR:ien, julkaisujen ja muiden kohteiden käyttämiseen.
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-sivutus — PaginatedList
GitHub API -kutsut, jotka palauttavat useita kohteita, kuten issueita, komitteja ja PR:iä, palauttavat PaginatedList-olion. Voitte iteroida sen läpi tavallisen luettelon tapaan — PyGitHub noutaa sivut automaattisesti iteroinnin aikana. len()-kutsun tekeminen PaginatedList-oliolle noutaa kuitenkin kaikki sivut, mikä voi olla kallista.
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 iterationRajoituspoikkeusten käsittely
Kun ylitätte pyyntörajoituksen, PyGitHub nostaa poikkeuksen github.GithubException.RateLimitExceededException. Käsitelkää se tarkistamalla rajoituksen nollautumisaika ja odottamalla, kunnes rajoitus nollautuu. Rakentakaa tämä uudelleenyrittämiseen tarkoitettuun wrapperiin, jotta GitHub-kutsut kestävät häiriötilanteita.
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'
)Haku kaikkialta GitHubista
Käyttäkää komentoja g.search_issues(), g.search_repositories() ja g.search_code() GitHubin hakuun kaikista julkisista ja omista yksityisistä repositorioistanne. Nämä käyttävät Search APIa, jolla on erillinen 30 pyynnön minuuttikohtainen rajoitus.
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')Useiden repositorioiden käsittely
Agenttien on usein toimittava organisaation useissa repositorioissa. Listatkaa organisaation kaikki repositoriot komennolla g.get_organization() ja käsitelkää ne sitten silmukassa. Suodattakaa repositoriot kielen, arkistointitilan tai aktiivisuuspäivän perusteella, jotta ette käsittele passiivisia repositorioita.
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()}')Tiedostosisällön lukeminen repositoriosta
Käyttäkää komentoa repo.get_contents(path) minkä tahansa repositorion tiedoston lukemiseen. Sisältö on base64-koodattu, mutta PyGitHub purkaa koodauksen automaattisesti .decoded_content-ominaisuuden avulla. Määrittäkää haara tai komitin SHA-arvo parametrilla 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])Yleisten GitHub-poikkeusten käsittely
PyGitHub nostaa GithubException-poikkeuksen kaikista API-virheistä. Yleisiä aliluokkia ovat UnknownObjectException (404 — repositoriota tai issuea ei löydy), BadCredentialsException (401 — virheellinen tunniste) ja RateLimitExceededException (403 — pyyntörajoitus). Ottakaa nämä aina kiinni erikseen.
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 NonePikatarkistus: pyyntörajoitus
Testatkaa GitHub API -pyyntörajoitusten ymmärtämistänne.
GitHub REST API -kertaus
Osaatte nyt muodostaa yhteyden GitHubiin PyGitHubilla:
- Github(token=) tai Github(auth=Auth.Token(...)) PAT-todennusta varten
- GitHub Apps ja
GithubIntegrationtuotantoagenteille, joilla on tarkkarajaiset käyttöoikeudet - Pyyntörajoitus: 5 000 pyyntöä tunnissa; tarkistakaa se komennolla
g.get_rate_limit()ja käsitelkääRateLimitExceededException - PaginatedList: iteroikaa sivuja laiskasti; käyttäkää
.totalCount-ominaisuutta lukumäärän hakemiseen ilman kaikkien sivujen noutamista - g.get_repo('owner/name') — repositoriotason toimintojen lähtökohta
- Käsitelkää poikkeukset
UnknownObjectException(404) jaBadCredentialsException(401) erikseen
Opi Tekoälyagentit tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 60
- Oppitunnit
- 239
Usein kysytyt kysymykset
Onko oppitunti ”GitHub REST API:n yleiskatsaus” ilmainen?
Kyllä – oppitunnin ”GitHub REST API:n yleiskatsaus” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Tekoälyagentit-kurssin, päivitä CoddyKit PROhon. Tekoälyagentit-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”GitHub REST API:n yleiskatsaus”?
PyGitHub-kirjasto, henkilökohtaiset käyttötokenit ja API:n pyyntörajoitukset Harjoittelet Tekoälyagentit-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Tekoälyagentit-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Tekoälyagentit-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”GitHub REST API:n yleiskatsaus”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Tekoälyagentit-oppitunnilla?
Kyllä. Jokainen Tekoälyagentit-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- GitHub REST API:n yleiskatsaus
- Issuejen luettelointi ja hallinta
- Automaattiset PR-katselmointikommentit
- Commit-historian ja diffien analyysi