web-dev-qa-db-ja.com

pythonでgithubapiトークンを使用してリクエストする方法

ユーザー名とパスワードを使用してpythonでGithub apiトークンを取得できますが、POST/DELETE/PATCHをリクエストするためにそのAPIトークンを使用することはできません。

リクエストを行うためにGithubAPIトークンをどのように使用しますか。たとえば、私は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トークンを使用する適切な方法は何ですか

19
softvar

1つは、APIのラッパーを使用することをお勧めします。ここでは、APIを高く評価するラッパーを見つけることで簡略化できる、多くの質問をしています。 Python here で書かれたラッパーのリストがあります。

実際に質問に答える場合、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オブジェクトが認証を処理します(トークンまたはユーザー名とパスワードの組み合わせのいずれかによる)。

また、APIラッパーのニーズにgithub3.pyを使用することにした場合は、ここにタグがあります。

これがあなたを助けるかもしれないいくつかのコードです。

例:

例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ドキュメント

これがお役に立てば幸いです。

7
ferdio