Как работать с GitHub API на Python: примеры запросов

🐙 Кратко: Научитесь работать с GitHub API на Python: получайте список репозиториев, коммиты, данные пользователя — с аутентификацией и обработкой ошибок.
python запросы к github

Если вы когда-нибудь хотели автоматизировать сбор информации с GitHub — например, получить список своих репозиториев, статистику коммитов или данные о пользователе — то вам понадобится GitHub API.

В этой статье я покажу, как делать запросы к GitHub API из Python с помощью стандартной библиотеки requests, как аутентифицироваться через токен, и как обрабатывать ответы. Всё — с рабочими примерами и пояснениями, чтобы вы могли сразу использовать код в своих проектах.

Почему нужен токен доступа?

GitHub API позволяет делать без авторизации до 60 запросов в час с одного IP.
Но если вы используете токен — лимит поднимается до 5000 запросов в час.

Кроме того, некоторые данные (например, приватные репозитории) недоступны без аутентификации.

📚 Официальная документация: GitHub REST API

💡 Токен GitHub, никогда не коммитьте его в репозиторий. Лучше хранить в файле .env, как мы делали в статье про отправку уведомлений в Telegram через API.

Шаг 1. Получаем Personal Access Token

  1. Зайдите в Settings → Developer settings → Personal Access Tokens → Tokens (classic)
  2. Нажмите «Generate new token»
  3. Выберите scopes (права):
    • Для публичных данных — достаточно public_repo
    • Для всего — repo
  4. Скопируйте токен — он покажется только один раз!

⚠️ Никогда не коммитьте токен в GitHub! Используйте .env.

Шаг 2. Базовый запрос: информация о пользователе

Если вы впервые работаете с requests и JSON, рекомендую начать с базовой статьи: Как работать с API на Python: запросы и ответы в формате JSON .

Установка и настройка

pip install requests python-dotenv

Создайте .env:

GITHUB_TOKEN=ghp_ваш_токен_здесь

Получение профиля пользователя

import requests
import os
from dotenv import load_dotenv

load_dotenv()
TOKEN = os.getenv("GITHUB_TOKEN")
HEADERS = {"Authorization": f"token {TOKEN}"}

def get_user_info(username):
    url = f"https://api.github.com/users/{username}"
    response = requests.get(url, headers=HEADERS)
    
    if response.status_code == 200:
        data = response.json()
        print(f"Имя: {data['name']}")
        print(f"Публичных репозиториев: {data['public_repos']}")
        print(f"Подписчиков: {data['followers']}")
        return data
    else:
        print(f"Ошибка: {response.status_code} — {response.json().get('message')}")
        return None

# Пример
get_user_info("octocat")

💡 Даже для публичных данных рекомендуется использовать токен — так вы избегаете лимитов.

Шаг 3. Получение списка репозиториев

def get_repos(username):
    url = f"https://api.github.com/users/{username}/repos"
    params = {
        "sort": "updated",
        "direction": "desc",
        "per_page": 30  # максимум 100
    }
    response = requests.get(url, headers=HEADERS, params=params)
    
    if response.status_code == 200:
        repos = response.json()
        for repo in repos[:5]:  # первые 5
            print(f"📦 {repo['name']} — {repo['stargazers_count']} ⭐")
        return repos
    return []

# Пример
get_repos("your-username")

Шаг 4. Получение истории коммитов

def get_commits(owner, repo, branch="main"):
    url = f"https://api.github.com/repos/{owner}/{repo}/commits"
    params = {"sha": branch, "per_page": 10}
    response = requests.get(url, headers=HEADERS, params=params)
    
    if response.status_code == 200:
        commits = response.json()
        for commit in commits:
            sha = commit["sha"][:7]
            message = commit["commit"]["message"].split("\n")[0]
            author = commit["commit"]["author"]["name"]
            print(f"{sha} — {message} (by {author})")
        return commits
    return []

# Пример
get_commits("your-username", "my-project")

Шаг 5. Обработка ошибок и пагинации

GitHub API использует пагинацию. Если репозиториев больше 100, нужно читать заголовок Link:

def get_all_repos(username):
    repos = []
    page = 1
    while True:
        url = f"https://api.github.com/users/{username}/repos"
        response = requests.get(
            url,
            headers=HEADERS,
            params={"page": page, "per_page": 100}
        )
        if response.status_code != 200:
            break
        page_data = response.json()
        if not page_data:
            break
        repos.extend(page_data)
        page += 1
    return repos

Советы для продвинутого использования

  • Кэшируйте ответы, если данные не меняются часто
  • Используйте time.sleep(1) между запросами при массовом парсинге
  • Для сложных задач рассмотрите библиотеку PyGithub — но для простых запросов requests достаточно

Чтобы сохранять результаты запросов к GitHub (например, список репозиториев) для резервной копии — используйте подход из статьи Python-скрипт для автоматического резервного копирования файлов .

Заключение

Теперь вы умеете:

✅ Авторизовываться через токен
✅ Получать профиль, репозитории, коммиты
✅ Обрабатывать ошибки и пагинацию

GitHub API — мощный инструмент для автоматизации, мониторинга и анализа.
А с Python — он становится ещё удобнее.

🐍 Попробуйте запустить примеры — и вы сразу почувствуете, насколько это просто.

💬 Остались вопросы? Пишите в комментариях — с радостью уточню, дополню или помогу с вашим кодом.
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и Python.
👉 Ваш интерес — лучшая мотивация для новых статей!

Оставьте комментарий