如何在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_PATH
export 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