带有身份验证的python请求(access_token)


81

我正在尝试将API查询输入python。命令行

curl --header "Authorization:access_token myToken" https://website.com/id

提供一些json输出。myToken是一个十六进制变量,始终保持不变。我想从python进行此调用,以便我可以遍历不同的id并分析输出。有任何想法吗?在需要身份验证之前,我已经使用urllib2进行了此操作。我也看过了requests模块,但是不知道该怎么做。

非常感谢。


设置整个会话的身份验证令牌:stackoverflow.com/a/47043335/911945
Anton Tarasenko

Answers:


125

请求包有一个用于HTTP请求的一个非常好的API,加入了自定义标题是这样的(来源:官方文档):

>>> import requests
>>> response = requests.get(
... 'https://website.com/id', headers={'Authorization': 'access_token myToken'})

如果您不想使用外部依赖关系,则使用标准库的urllib2的相同内容如下所示(来源:缺少的手册):

>>> import urllib2
>>> response = urllib2.urlopen(
... urllib2.Request('https://website.com/id', headers={'Authorization': 'access_token myToken'})

感谢您的答复。我已经尝试了两种实现,但都收​​到HTTP错误401:未授权。但是,命令行工作正常。我从来没有与访问令牌工作,所以仅仅是明确的:令牌我已经是形式的40位3f4264ff等
user1895406

1
奇怪。令我烦恼的是标头中的冒号...啊!也许我(或我们俩;)只是读错了。标头可能被命名为“授权”,然后其将为“ access_token long_hexadecimal_string”。想旋转一下吗?
wosc 2012年

起作用了!非常感谢。我最终键入的内容是url =' website.com/ id'head = {'Authorization':'access_token hex_string'} res = requests.get(url,headers = head)
user1895406 2012年

1
不建议使用此解决方案,或者在默认的Anaconda安装中不能使用该解决方案。
bloodrootfc

1
它是服务器用来验证您是否有权访问API的身份验证令牌。您需要获取要访问的API的客户端凭据(用户名,密码,API密钥),然后将其(例如,通过get请求)发送到身份验证服务器。服务器返回一个可以用JSON编码的字符串到您的客户端,然后您将其用作API调用中的令牌。搜索JWT或OAuth以进行更多阅读并查看一些示例。
菲利普

28

尝试在Github中使用令牌时遇到相同的问题。

使用Python 3的唯一语法对我来说是:

import requests

myToken = '<token>'
myUrl = '<website>'
head = {'Authorization': 'token {}'.format(myToken)}
response = requests.get(myUrl, headers=head)

这里的代币是什么?还是如何获取身份验证令牌?
深贾迪亚

7
>>> import requests
>>> response = requests.get('https://website.com/id', headers={'Authorization': 'access_token myToken'})

如果上述方法不起作用,请尝试以下操作:

>>> import requests
>>> response = requests.get('https://api.buildkite.com/v2/organizations/orgName/pipelines/pipelineName/builds/1230', headers={ 'Authorization': 'Bearer <your_token>' })
>>> print response.json()

1
本周我遇到了同样的问题,最终对我有用的是授权承载选项。不确定为什么会有区别,但是感谢您提供该选项让我尝试并成功开始工作!
Ryan Harris

@SowmiyaRagu第二部分对我有用,而第一部分Bearer <my_token>则不对,因为响应就像请求未通过验证一样。
hydradon

2

您是否尝试过该uncurl软件包(https://github.com/spulec/uncurl)?您可以通过pip安装它pip install uncurl。您的curl请求返回:

>>> uncurl "curl --header \"Authorization:access_token myToken\" https://website.com/id"

requests.get("https://website.com/id",
    headers={
        "Authorization": "access_token myToken"
    },
    cookies={},
)

1

我会添加一点提示:似乎您传递的内容是标题的键值取决于您的授权类型,在我的情况下是 PRIVATE-TOKEN

header = {'PRIVATE-TOKEN': 'my_token'}
response = requests.get(myUrl, headers=header)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.