PyGitHub: понимание ограничения скорости и управления количеством запросов - PullRequest
0 голосов
/ 09 июля 2020

Проблема

Я превышаю предел скорости GitHub API, когда использую PyGitHub, но не когда я использую простые HTTP-запросы.

Это странно, потому что мой пользовательский клиент может получить то, что Мне нужно ≈500 запросов, в то время как PyGitHub превышает 5000, чтобы получить тот же результат.

5k запросов / час

Мое приложение использует базовую c auth с токеном личного доступа.

from github import Github
g = Github(token)

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

Для запросов API с использованием Basi c Аутентификация или OAuth, можно делать до 5000 запросов в час. Запросы, прошедшие аутентификацию, связаны с аутентифицированным пользователем, независимо от того, использовалась ли аутентификация Basi c или токен OAuth.

Операция

Суть заключается в сканировании всех репозиториев в my org, отфильтруйте по topi c и загрузите указанные c каталоги.

Вот псевдокод того, как я делаю это с моим собственным клиентом. Это можно сделать за ≈500 запросов (сканирование ≈10k репозиториев и загрузка каталогов из ≈10 из них).

# Get the first page...
/orgs/<my-org>/repos

# Iterate through the pages...
for page in pages:
    /organizations/<my-org>/repos?page=page

# Filter repos by topic(s)...
repos = [repo for repo in repos if '<my-topic>' in repo['topics']]

# Download some content from qualifying repositories
for repo in repos:
    /repos/<my-org>/<repo-name>/contents/<my-path>
    ...recursively crawl directory at <my-path>

Вот аналогичный подход с использованием PyGitHub, который превышает ограничения скорости .

from github import Github
g = Github('<token>')
org = g.get_organization('tr')
repos = org.get_repos(type='all')
repos = [repo for repo in repos if '<my-topic>' in repo.get_topics()]
for repo in repos:
    content = repo.get_content('<my-path>')
    ...recursively crawl directory at <my-path>
...