30

我可以使用用户名和密码在 python 中获取 Github api 令牌,但我无法使用该 API 令牌来请求任何 POST/DELETE/PATCH。

我们如何使用 Github API-Tokens 发出任何请求。例如,我有 API-Token 可以说“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 errorBad Crediantials

在不输入密码的情况下使用 API-Tokens 的正确方法是什么

4

5 回答 5

35

一方面,我建议对 API 使用包装器。您在这里提出了很多问题,可以通过找到您欣赏其 API 的包装器来简化这些问题。这里有一个用 Python 编写的包装器列表。

至于您实际回答您的问题,GitHub 文档非常清楚您需要发送Authorization 标头。您的电话实际上看起来像这样:

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 包装器需求,这里有一个标签。

于 2013-07-13T03:30:12.793 回答
32

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

例子:

示例 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 文档

我希望这有帮助。

于 2018-04-10T12:28:28.210 回答
3

我遵循 API 文档并尝试Authorization在调用中将标头设置为requests.get(). 但是,这总是返回 401 错误。所以我检查了Response对象request属性中的标头,发现Authorization我的请求中的标头已被重写。在对源代码进行了一些挖掘之后,我发现当请求调用 HTTP Basic Auth 时,Authorization标头会被重写(参见此处)。

因此,解决方案是在调用requests.get(). 例如:

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

不幸的是,这个答案(目前投票最高的一个)不起作用,因为该答案的方法正是我在尝试上述解决方案之前使用的方法。

于 2020-04-11T20:50:36.277 回答
3

使用requests python 库,需要在请求Headers上告知Github 账户 API Token

例子:

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 官方文档中找到更多详细信息

于 2021-02-07T20:09:06.877 回答
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")
于 2022-01-29T23:55:24.627 回答