sof*_*var 16 api github-api oauth-2.0 python-2.7 python-requests
我可以使用用户名和密码在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)
Run Code Online (Sandbox Code Playgroud)
但我一直都想与401 error
有Bad Crediantials
消息.
在不输入密码的情况下使用API令牌的正确方法是什么
Ian*_*sco 20
首先,我建议使用API的包装器.你在这里问了很多问题,可以通过找到你喜欢的API的包装器来简化.还有用Python编写的包装清单在这里.
至于你实际回答你的问题,GitHub文档相当清楚你需要发送Authorization标题.你的电话实际上是这样的:
self.headers = {'Authorization': 'token %s' % self.api_token}
r = requests.post(url, headers=self.headers)
Run Code Online (Sandbox Code Playgroud)
既然你似乎在使用请求和课程,我可能会大胆地提出建议吗?假设您正在为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)
Run Code Online (Sandbox Code Playgroud)
Session对象将为您处理身份验证(通过令牌或用户名和密码组合).
此外,如果你最终决定使用github3.py来满足你的API包装需求,那么这里有一个标签.
小智 11
这是一些可以帮助您的代码。
示例1(身份验证):
username = 'user'
token = 'token'
login = requests.get('https://api.github.com/search/repositories?q=github+api', auth=(username,token))
Run Code Online (Sandbox Code Playgroud)
示例2(标题):
headers = {'Authorization': 'token ' + token}
login = requests.get('https://api.github.com/user', headers=headers)
print(login.json())
Run Code Online (Sandbox Code Playgroud)
示例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)
Run Code Online (Sandbox Code Playgroud)
示例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))
Run Code Online (Sandbox Code Playgroud)
您可能想看一下以下文档:
我希望这有帮助。
小智 5
我遵循 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))
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个答案(目前得票最高的答案)不起作用,因为该答案中的方法正是我在尝试上述解决方案之前使用的方法。
归档时间: |
|
查看次数: |
15737 次 |
最近记录: |