如何在Python中使用GitHub API令牌进行请求

41

我能够在Python中使用用户名和密码获取Github API令牌,但是我无法将该API令牌用于请求任何POST / DELETE / PATCH。

我们如何使用Github API令牌发出任何请求。 例如,我有一个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错误坏凭据消息。

在不输入密码的情况下,使用API令牌的正确方法是什么?


我们能否使用类似于 requests.post(....,auth=api_token) 而不是 auth=(username,password) - softvar
5个回答

48

这里是一些可能对您有帮助的代码。

示例:

示例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))

你可能想要查看以下文档:

Requests文档

Github API文档

希望这可以帮到你。


1
谢谢!这个解释真的很有帮助! - Saurav Saha
请求可能会报错:ssl错误,因为使用了没有证书的https(tls/ssl)。 - Nikolai Ehrhardt
如果您在请求中遇到SSL错误,请尝试以下操作:CERT_PATH=$(python3 -m certifi) export SSL_CERT_FILE=${CERT_PATH} export REQUESTS_CA_BUNDLE=${CERT_PATH} - Zeznzo
这只是一个提示。或者说,你的回答不够充分,有点让人烦恼 ;) - Nikolai Ehrhardt

38

首先,我建议使用API的包装器。您在这里提出了许多问题,通过找到一个您喜欢的API包装器,这些问题可以简化。这里有一个用Python编写的包装器列表here

至于您实际回答问题,GitHub文档非常清楚,您需要发送Authorization header。您的调用应该长这样:

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

看起来你在使用 requests 和一个类,我可以大胆地给出一个建议吗?假设你正在为 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包装器,这里有一个标签供您使用。


1
使用 self.session.headers['Authorization'] = 'token %s' % self.api_token 而不是在 requests.post() 中使用 auth=(username,password),会响应 {u'message': u'Not Found'} - softvar
你不应该使用 requests.post,而是应该使用 self.session.post - Ian Stapleton Cordasco
应该使用 session.get 而不是 post,因为后者会响应 404。 - Drxxd

5
我遵循 API 文档并尝试在调用 `requests.get()` 时设置 `Authorization` 头信息。然而,这总是返回 401 错误。所以我检查了 `Response` 对象的 `request` 属性中的头部信息,并发现我的请求中的 `Authorization` 头部已经被重写了。经过一番查找源代码后,我发现当请求调用 HTTP Basic Auth 时,`Authorization` 头部会被重写(请参见此处)。
因此,解决方法是在调用 `requests.get()` 时传递一个 auth 元组来传递令牌。例如:
requests.get('https://api.github.com/notifications', auth=(my_username, my_token))

很不幸,这个答案(目前获得最高投票)无法使用,因为该答案中的方法正是我在尝试上面解决方案之前使用的方法。


4
使用Python库requests,您需要在请求的Headers中提供Github账户API令牌

示例:

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官方文档中找到更多细节。

这个不起作用。收到403错误,抱怨需要为组织授权令牌(而相同的令牌在命令行中使用Curl可以工作,并且它可以像其他答案建议的那样使用“auth =”)。 - The Godfather

0
from github import Github
import requests
import pandas as pd
import datetime
token='.....................'
g=Github(token,per_page=10000)
repos=g.search_repositories(query="q:rgpd")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接