如何在python中使用github api token进行请求

Posted

技术标签:

【中文标题】如何在python中使用github api token进行请求【英文标题】:how to use github api token in python for requesting 【发布时间】:2013-07-11 10:34:07 【问题描述】:

我可以使用用户名和密码在 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)

但我总是收到带有Bad Crediantials 消息的401 error

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

【问题讨论】:

我们不能用requests.post(....,auth=api_token)代替auth=(username,password) 【参考方案1】:

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

至于您实际回答您的问题,GitHub 文档非常清楚您需要发送Authorization header。你的电话实际上应该是这样的:

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

【讨论】:

requests.post() 中使用self.session.headers['Authorization'] = 'token %s' % self.api_token 而不使用auth=(username,password) 正在回复u'message': u'Not Found' 你不要用requests.post这个,你用self.session.post 它应该是 session.get(不是 post),因为后者以 404 回复【参考方案2】:

这里有一些代码可以帮助你。

示例:

示例 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(删除 repo):

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):

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 Docs

Github API docs

我希望这会有所帮助。

【讨论】:

谢谢!这个解释真的很有帮助! requests 可能会报错:ssl error, as use https (tls/ssl) without certificate. @NikolaiEhrhardt 如果您收到 SSL 请求错误,试试这个:CERT_PATH=$(python3 -m certifi)export SSL_CERT_FILE=$CERT_PATHexport REQUESTS_CA_BUNDLE=$CERT_PATH 这只是一个提示。或者你的答案不足,有点烦人;)【参考方案3】:

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

因此,解决方案是在调用requests.get() 时将令牌传递到身份验证元组中。例如:

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

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

【讨论】:

【参考方案4】:

使用requests python库,需要将Headers请求告知Github account 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 official documentation找到更多详细信息

【讨论】:

【参考方案5】:
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")

【讨论】:

以上是关于如何在python中使用github api token进行请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ctypes 在 python 中正确包装 C API?

如何运行 Youtube Api 视频:插入 (python)

在 Python 中使用 AT&T Speech to Text API

如何通过python调用新浪微博的API

如何使用 Python 获取币安 API 的所有价格历史记录?

如何播放从 Bing Text to Speech API 返回的音频流?