Visão geral da API REST do GitHub
Biblioteca PyGitHub, tokens de acesso pessoal e limites de taxa da API.
Visão geral da API REST do GitHub é uma aula grátis de AI Agents no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Agents, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Agents inclui 4 aulas no total.
PyGitHub — O cliente Python para GitHub
PyGitHub é a biblioteca Python mais popular para a API REST do GitHub. Ela envolve a API HTTP bruta com objetos Python que representam repositórios, problemas, PRs, confirmações e usuários. Quase toda tarefa de automação do GitHub começa com Github(token=) e 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}')Autenticação: Token de acesso pessoal
A forma mais simples de autenticação é um Token de acesso pessoal (PAT) — um Token de longa duração vinculado à sua conta do GitHub. Crie um em github.com → Configurações → Configurações de desenvolvedor → Tokens de acesso pessoal. Armazene-o em uma variável de ambiente, nunca no código. Use PAT com escopo granular para obter mais segurança (limite o escopo a repositórios específicos).
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 doneAutenticação de aplicativos do GitHub
Para agentes de produção, os aplicativos do GitHub são preferíveis aos PAT. Eles têm permissões granulares, podem ser instalados em repositórios específicos e usam Tokens de instalação de curta duração que alternam automaticamente. Use github.GithubIntegration para gerar Tokens de instalação.
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}')Limites de solicitações: 5.000 solicitações por hora
A API REST do GitHub permite 5.000 solicitações por hora para usuários autenticados. Cada chamada à API, mesmo paginada, conta. Verifique sua cota restante antes de executar operações em lote — se ela acabar, todas as solicitações retornarão 403 Forbidden até que o limite seja redefinido.
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!')Obtendo um objeto de repositório
O objeto repo é o ponto de partida para quase todas as operações do GitHub. Obtenha-o com g.get_repo('owner/name'). Ele contém metadados (estrelas, bifurcações, descrição, visibilidade) e métodos para acessar problemas, PRs, confirmações, lançamentos e muito mais.
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}')Paginação da API — PaginatedList
As chamadas à API do GitHub que retornam muitos itens (problemas, confirmações, PRs) devolvem uma PaginatedList. Você pode percorrê-la como uma lista comum — o PyGitHub busca as páginas automaticamente à medida que você itera. No entanto, chamar len() em uma PaginatedList busca todas as páginas, o que pode ser dispendioso.
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 iterationTratamento de exceções de limite de solicitações
Quando você ultrapassa o limite de solicitações, o PyGitHub lança github.GithubException.RateLimitExceededException. Trate essa exceção verificando o horário de redefinição e aguardando até que o limite seja redefinido. Incorpore esse comportamento a uma função auxiliar de novas tentativas para tornar qualquer chamada ao GitHub resiliente.
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'
)Pesquisando em todo o GitHub
Use g.search_issues(), g.search_repositories() e g.search_code() para executar a pesquisa do GitHub em todos os repositórios públicos e nos seus repositórios privados. Essas chamadas usam a API de pesquisa, que tem um limite separado de 30 solicitações por minuto.
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')Trabalhando com vários repositórios
Os agentes frequentemente precisam operar em vários repositórios de uma organização. Use g.get_organization() para listar todos os repositórios de uma organização e depois processe-os em um loop. Filtre por linguagem, status de arquivamento ou data de atividade para evitar processar repositórios inativos.
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()}')Lendo o conteúdo de arquivos de um repositório
Use repo.get_contents(path) para ler qualquer arquivo de um repositório. O conteúdo é codificado em base64, mas o PyGitHub o decodifica automaticamente por meio da propriedade .decoded_content. Especifique uma ramificação ou uma confirmação SHA com o parâmetro 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])Tratamento de exceções comuns do GitHub
O PyGitHub lança GithubException para todos os erros da API. Subclasses comuns: UnknownObjectException (404 — repositório ou problema não encontrado), BadCredentialsException (401 — Token inválido), RateLimitExceededException (403 — limite de solicitações excedido). Sempre capture essas exceções especificamente.
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 NoneVerificação rápida: limite de solicitações
Verifique sua compreensão sobre os limites de solicitações da API do GitHub.
Recapitulação da API REST do GitHub
Agora você já consegue se conectar ao GitHub com o PyGitHub:
- Github(token=) ou Github(auth=Auth.Token(...)) para autenticação por PAT
- Aplicativos do GitHub com
GithubIntegrationpara agentes de produção com permissões granulares - Limite de solicitações: 5.000 solicitações/h; verifique com
g.get_rate_limit(); trateRateLimitExceededException - PaginatedList: itere sob demanda; use
.totalCountpara obter contagens sem buscar todas as páginas - g.get_repo('owner/name') — o ponto de entrada para operações no nível do repositório
- Capture explicitamente
UnknownObjectException(404) eBadCredentialsException(401)
Perguntas Frequentes
A aula “Visão geral da API REST do GitHub” é grátis?
Sim — o texto completo de “Visão geral da API REST do GitHub” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Agents, atualize para CoddyKit PRO. O curso de AI Agents inclui 4 aulas no total.
O que vou aprender em “Visão geral da API REST do GitHub”?
Biblioteca PyGitHub, tokens de acesso pessoal e limites de taxa da API. Você pratica AI Agents com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Agents?
Nenhuma experiência prévia é necessária. AI Agents no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Visão geral da API REST do GitHub”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Agents?
Sim. Cada aula de AI Agents inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Visão geral da API REST do GitHub
- Listando e gerenciando problemas
- Comentários automatizados em revisões de PR
- Histórico de commits e análise de diferenças