0Pricing
AI Agents · Lección

Introducción a GitHub REST API

Biblioteca PyGitHub, tokens de acceso personal y límites de velocidad de la API.

Introducción a GitHub REST API es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.

PyGitHub — Cliente de GitHub para Python

PyGitHub es la biblioteca de Python más popular para la API REST de GitHub. Envuelve la API HTTP sin formato con objetos de Python que representan repositorios, incidencias, pull requests, commits y usuarios. Casi todas las tareas de automatización de GitHub comienzan con Github(token=) y 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}')

Autenticación: token de acceso personal

La autenticación más sencilla utiliza un token de acceso personal (PAT): un token de larga duración asociado a su cuenta de GitHub. Cree uno en github.com → Configuración → Configuración del desarrollador → Tokens de acceso personal. Guárdelo en una variable de entorno, nunca en el código. Utilice PAT de permisos granulares para mejorar la seguridad (limite su alcance a repositorios 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 done

Autenticación con GitHub App

Para los agentes de producción, se prefieren las GitHub Apps a los PAT. Tienen permisos granulares, pueden instalarse en repositorios específicos y utilizan tokens de instalación de corta duración que se rotan automáticamente. Utilice github.GithubIntegration para generar tokens de instalació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}')

Límites de solicitudes: 5000 solicitudes por hora

La API REST de GitHub permite 5.000 solicitudes por hora a los usuarios autenticados. Cada llamada a la API cuenta, incluso las paginadas. Compruebe la cuota restante antes de ejecutar operaciones por lotes; si se agota, todas las solicitudes devolverán 403 Forbidden hasta que se restablezca el límite de solicitudes.

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!')

Obtener un objeto de repositorio

El objeto repo es el punto de partida para casi todas las operaciones de GitHub. Obténgalo con g.get_repo('owner/name'). Contiene metadatos (estrellas, forks, descripción y visibilidad) y métodos para acceder a incidencias, pull requests, commits, releases y mucho más.

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}')

Paginación de la API — PaginatedList

Las llamadas a la API de GitHub que devuelven muchos elementos (incidencias, commits y pull requests) devuelven un PaginatedList. Puede recorrerlo como una lista normal; PyGitHub obtiene las páginas automáticamente a medida que lo recorre. Sin embargo, llamar a len() en un PaginatedList obtiene todas las páginas, lo que puede resultar costoso.

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 iteration

Gestión de excepciones por límite de solicitudes

Cuando supera el límite de solicitudes, PyGitHub genera github.GithubException.RateLimitExceededException. Gestiónelo comprobando la hora de restablecimiento y esperando hasta que se restablezca el límite. Integre este comportamiento en un envoltorio de reintentos para hacer resistente cualquier llamada a GitHub.

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'
)

Buscar en GitHub

Utilice g.search_issues(), g.search_repositories() y g.search_code() para realizar búsquedas de GitHub en todos los repositorios públicos y en sus repositorios privados. Estas funciones utilizan la Search API, que tiene un límite de solicitudes independiente de 30 solicitudes 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')

Trabajar con varios repositorios

A menudo, los agentes deben operar en varios repositorios de una organización. Utilice g.get_organization() para enumerar todos los repositorios de una organización y, después, procéselos en un bucle. Filtre por lenguaje, estado de archivado o fecha de actividad para evitar procesar repositorios inactivos.

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()}')

Leer el contenido de archivos de un repositorio

Utilice repo.get_contents(path) para leer cualquier archivo de un repositorio. El contenido está codificado en base64, pero PyGitHub lo decodifica automáticamente mediante la propiedad .decoded_content. Especifique una rama o un SHA de commit con el 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])

Gestión de excepciones comunes de GitHub

PyGitHub genera GithubException para todos los errores de la API. Algunas subclases comunes son: UnknownObjectException (404: no se encontró el repositorio o la incidencia), BadCredentialsException (401: el token no es válido) y RateLimitExceededException (403: límite de solicitudes excedido). Captúrelas siempre de forma específica.

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 None

Comprobación rápida: límite de solicitudes

Compruebe su comprensión de los límites de solicitudes de la API de GitHub.

Resumen de la API REST de GitHub

Ahora puede conectarse a GitHub con PyGitHub:

  • Github(token=) o Github(auth=Auth.Token(...)) para la autenticación mediante PAT
  • GitHub Apps con GithubIntegration para agentes de producción con permisos granulares
  • Límite de solicitudes: 5.000 solicitudes por hora; compruébelo con g.get_rate_limit() y gestione RateLimitExceededException
  • PaginatedList: recórralo de forma diferida; utilice .totalCount para obtener el número de elementos sin recuperar todas las páginas
  • g.get_repo('owner/name'): punto de entrada para las operaciones a nivel de repositorio
  • Capture explícitamente UnknownObjectException (404) y BadCredentialsException (401)

Preguntas frecuentes

¿La lección «Introducción a GitHub REST API» es gratis?

Sí — el texto completo de «Introducción a GitHub REST API» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.

¿Qué aprenderé en «Introducción a GitHub REST API»?

Biblioteca PyGitHub, tokens de acceso personal y límites de velocidad de la API. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Agents?

No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Introducción a GitHub REST API»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Agents?

Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Introducción a GitHub REST API
  2. Enumeración y gestión de incidencias
  3. Comentarios automatizados en revisiones de PR
  4. Historial de commits y análisis de diferencias
← Volver a AI Agents