pyGithub максимальное использование скорости вызовов API - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь использовать библиотеку pyGithub для доступа к v3 API github.Хотя эта библиотека проста в использовании.Я нашел документацию очень расплывчатой.

Ниже я успешно получаю содержимое файла с указанием пути к файлу и его ша.Моя конечная цель - сократить количество вызовов API с 3 до всего 1, поскольку я хочу использовать полные вызовы API в течение часа.

from github import Github
gh = Github(access_token) # I supply an access token here.
user = gh.get_user(owner_name) # This takes 1 API call
repo = user.get_repo(repo_name) # This takes 1 API call


file = repo.get_file_contents(filename, ref=sha) # This takes 1 API call

Кто-нибудь знает, как я могу передать репо иимя владельца для get_file_contents () или аналогичной функции, которую я могу использовать для достижения этой цели?

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Вы можете уменьшить его с 3-х вызовов API до 2-х, используя get_repo () в формате «имя-владельца / имя-репо»

from github import Github
gh = Github(access_token) # I supply an access token here.
repo = gh.get_repo(owner_name+'/'+repo_name) # This takes 1 API call

file = repo.get_file_contents(filename, ref=sha) # This takes 1 API call

Просто упомяните это здесь для дальнейшего использования.В действительности я закончил тем, что использовал библиотеку запросов и сформировал свои собственные вызовы API.

Вот так:

import requests
# Import python's base64 decoder
from base64 import b64decode as decode

def GET(owner_repo,filename,sha,access_token):
    # Supply Headers
    headers = {'content-type': 'application/json', 'Authorization':'token '+access_token}
    # This function is stable so long as the github API structure does not change. 
    # Also I am using the previously mentioned combo of owner/repo.
    url = 'https://api.github.com/repos/%s/contents/%s?ref=%s' % (owner_repo, filename, sha)
    # Let's stay within the API rate limits
    url_rate_limit = 'https://api.github.com/rate_limit'
    r = requests.get(url_rate_limit, headers=headers)
    rate_limit = int(r.json()['resources']['core']['remaining'])
    if(rate_limit > 0):
        # The actual request
        r = requests.get(url, headers=headers)
        # Note: you will need to handle the any error codes yourself. 
        # I am just safe checking for '200' OK
        if(r.status_code == 200):
            content = r.json()['content']
            # Decode base64 content
            decoded_content = decode(content)
            return decoded_content

Я лицензирую вышеуказанный код под лицензией MIT.

0 голосов
/ 20 декабря 2018

Кто-нибудь знает, как я могу передать имя репо и владельца get_file_contents ()

Учитывая текущую реализацию get_file_contents, она ожидает:

  • или GithubObject (который стоит вызовов API)
  • или строка (которая не требует вызовов API)

Но оба зависят от Репозиторий класса , который включает вызовы API.
Так что, если вы можете сделать свой процесс долгоживущим, способным многократно использовать в одном сеансе выполнения этот репозиторий, это будет лучше всего.

Но если вам нужно получить файлы из нескольких репозиториев, это не поможет.

...