как использовать токен github api в python для запроса

Я могу получить API-токен Github в python, используя имя пользователя и пароль, но я не могу использовать этот API-токен для запроса любого POST/DELETE/PATCH.

Как мы используем API-токены Github для выполнения любого запроса. Например, у меня есть API-токен, скажем, "hbnajkjanjknjknh23b2jk2kj2jnkl2..."

теперь для запроса

#i'm providing username and API-Token in headers like    
self.header = {'X-Github-Username': self.username,
               'X-Github-API-Token': self.api_token                  
              }
#then requesting(post) to create a gist
r = requests.post(url, headers=headers)

Но я всегда получаю 401 error с Bad Crediantials сообщением.

Как правильно использовать API-токены без ввода пароля


person softvar    schedule 12.07.2013    source источник
comment
мы не можем использовать что-то вроде requests.post(....,auth=api_token) вместо auth=(username,password)   -  person softvar    schedule 12.07.2013


Ответы (4)


Во-первых, я бы рекомендовал использовать оболочку для API. Вы задаете здесь много вопросов, которые можно упростить, найдя оболочку, чей API вам нравится. здесь есть список оберток, написанных на Python.

Что касается вашего фактического ответа на ваш вопрос, в документации GitHub довольно ясно, что вам нужно отправить заголовок авторизации. Ваш звонок на самом деле будет выглядеть так:

self.headers = {'Authorization': 'token %s' % self.api_token}
r = requests.post(url, headers=self.headers)

Поскольку кажется, что вы используете запросы и класс, могу ли я быть настолько смелым, чтобы дать рекомендацию? Допустим, вы делаете что-то вроде создания клиента для API. У вас может быть такой класс:

class GitHub(object):
    def __init__(self, **config_options):
        self.__dict__.update(**config_options)
        self.session = requests.Session()
        if hasattr(self, 'api_token'):
           self.session.headers['Authorization'] = 'token %s' % self.api_token
        elif hasattr(self, 'username') and hasattr(self, 'password'):
           self.session.auth = (self.username, self.password)

    def call_to_the_api(self, *args):
        # do stuff with args
        return self.session.post(url)

Объект Session позаботится об аутентификации за вас (либо с помощью токенов, либо с помощью комбинации имени пользователя и пароля).

Кроме того, если вы в конечном итоге решите использовать github3.py для своих потребностей в оболочке API, для этого есть тег здесь.

person Ian Stapleton Cordasco    schedule 13.07.2013
comment
используя self.session.headers['Authorization'] = 'token %s' % self.api_token и не используя auth=(username,password) внутри requests.post(), отвечает {u'message': u'Not Found'} - person softvar; 13.07.2013
comment
Вы не используете requests.post с этим, вы используете self.session.post. - person Ian Stapleton Cordasco; 14.07.2013
comment
Предполагается, что это session.get (а не post), потому что последний отвечает 404 - person Drxxd; 27.03.2019

Вот некоторый код, который может вам помочь.

Примеры:

Пример 1 (авторизация):

username = 'user'
token = 'token'

login = requests.get('https://api.github.com/search/repositories?q=github+api', auth=(username,token))

Пример 2 (заголовки):

headers = {'Authorization': 'token ' + token}

login = requests.get('https://api.github.com/user', headers=headers)
print(login.json())

Пример 3 (удалить репо):

user = 'username'
repo = 'some_repo' # Delete this repo

headers = {'Authorization': 'token ' + token}

login = requests.delete('https://api.github.com/' + 'repos/' + user + '/' + repo, headers=headers)

Пример 4 (создание репо):

repo = 'some_repo'
description = 'Created with api'

payload = {'name': repo, 'description': description, 'auto_init': 'true'}

login = requests.post('https://api.github.com/' + 'user/repos', auth=(user,token), data=json.dumps(payload))

Возможно, вы захотите ознакомиться со следующими документами:

Документация по запросам

документация Github API

Надеюсь, это поможет.

person Zeznzo    schedule 10.04.2018
comment
Благодарю вас! Это объяснение действительно помогло! - person Saurav Saha; 28.01.2020
comment
запросы, возможно, будут жаловаться: ошибка ssl, так как используйте https (tls/ssl) без сертификата. - person Nikolai Ehrhardt; 30.06.2021

Я следил за документацией API и попытался установить заголовок Authorization в моем вызове на requests.get(). Однако это всегда возвращало ошибку 401. Итак, я проверил заголовки из атрибута request объекта Response и обнаружил, что заголовок Authorization из моего запроса был переписан. Немного покопавшись в исходном коде, я обнаружил, что когда запрос вызывает HTTP Basic Auth, заголовок Authorization перезаписывается (см. здесь).

Итак, решение состояло в том, чтобы передать токен в кортеже аутентификации при вызове requests.get(). Например:

requests.get('https://api.github.com/notifications', auth=(my_username, my_token))

К сожалению, этот ответ (в настоящее время получивший наибольшее количество голосов) не будет работать, так как именно метод из этого ответа Я использовал, прежде чем попробовать решение выше.

person Erik    schedule 11.04.2020

Используя библиотеку python requests, вам необходимо сообщить токен API учетной записи Github о запросе Headers.

Пример:

authorization = f'token {token}'
headers = {
    "Accept": "application/vnd.github.v3+json",
    "Authorization" : authorization,
    }

Затем вы можете вызвать нужный ресурс, например:

r = requests.post(
    url=url,
    data=json_data,
    headers=headers
    )

Дополнительную информацию можно найти в официальной документации Github API.

person user15164966    schedule 07.02.2021