寻求将JSON API调用集成到Python程序中的一些帮助。
我希望将以下API集成到Python .py程序中,以允许它被调用并打印响应。
API指南指出必须生成承载令牌以允许调用API,这是我成功完成的。但是,我不确定在Python API请求中将此令牌包含为承载令牌身份验证的语法。
我可以使用包含令牌的cURL成功完成上述请求。我试过" urllib"和"请求"路线但无济于事。
完整的API详细信息:IBM X-Force Exchange API Documentation - IP Reputation
答案 0 :(得分:66)
这只是意味着它希望将其作为标题数据中的一个键
import requests
endpoint = ".../api/ip"
data = {"ip": "1.1.2.3"}
headers = {"Authorization": "Bearer MYREALLYLONGTOKENIGOT"}
print(requests.post(endpoint, data=data, headers=headers).json())
答案 1 :(得分:3)
如果您使用的是requests
模块,则可以选择编写一个auth类,如“ New Forms of Authentication”中所述:
import requests
class BearerAuth(requests.auth.AuthBase):
token = None
def __init__(self, token):
self.token = token
def __call__(self, r):
r.headers["authorization"] = "Bearer " + self.token
return r
然后您可以发送这样的请求
response = requests.get('https://www.example.com/', auth=BearerAuth('3pVzwec1Gs1m'))
它使您可以像基本auth一样使用相同的auth
参数,并且在某些情况下可能会为您提供帮助。
答案 2 :(得分:0)
1。授权
您已收到如下访问数据:
Username: johndoe
Password: zznAQOoWyj8uuAgq
Consumer Key: ggczWttBWlTjXCEtk3Yie_WJGEIa
Consumer Secret: uuzPjjJykiuuLfHkfgSdXLV98Ciga
您可以这样调用cURL:
curl -k -d "grant_type=password&username=Username&password=Password" \
-H "Authorization: Basic Base64(consumer-key:consumer-secret)" \
https://somedomain.test.com/token
或者在这种情况下为:
curl -k -d "grant_type=password&username=johndoe&password=zznAQOoWyj8uuAgq" \
-H "Authorization: Basic zzRjettzNUJXbFRqWENuuGszWWllX1iiR0VJYTpRelBLZkp5a2l2V0xmSGtmZ1NkWExWzzhDaWdh" \
https://somedomain.test.com/token
答案类似于:
{
"access_token": "zz8d62zz-56zz-34zz-9zzf-azze1b8057f8",
"refresh_token": "zzazz4c3-zz2e-zz25-zz97-ezz6e219cbf6",
"scope": "default",
"token_type": "Bearer",
"expires_in": 3600
}
2。调用API
这是您从上面调用一些使用身份验证的API的方式。 Limit
和offset
只是API可以实现的2个参数的示例。
您需要在access_token
之后插入上方的"Bearer "
。因此,您可以使用上面的身份验证数据来调用一些API:
curl -k -X GET "https://somedomain.test.com/api/Users/Year/2020/Workers?offset=1&limit=100" -H "accept: application/json" -H "Authorization: Bearer zz8d62zz-56zz-34zz-9zzf-azze1b8057f8"
以上内容在Python中实现。我在注释中添加了文本,以便可以复制粘贴代码。
# Authorization data
import base64
import requests
username = 'johndoe'
password= 'zznAQOoWyj8uuAgq'
consumer_key = 'ggczWttBWlTjXCEtk3Yie_WJGEIa'
consumer_secret = 'uuzPjjJykiuuLfHkfgSdXLV98Ciga'
consumer_key_secret = consumer_key+":"+consumer_secret
consumer_key_secret_enc = base64.b64encode(consumer_key_secret.encode()).decode()
# Your decoded key will be something like:
#zzRjettzNUJXbFRqWENuuGszWWllX1iiR0VJYTpRelBLZkp5a2l2V0xmSGtmZ1NkWExWzzhDaWdh
headersAuth = {
'Authorization': 'Basic '+ str(consumer_key_secret_enc),
}
data = {
'grant_type': 'password',
'username': username,
'password': password
}
## Authentication request
response = requests.post('https://somedomain.test.com/token', headers=headersAuth, data=data, verify=True)
j = response.json()
# When you print that response you will get dictionary like this:
{
"access_token": "zz8d62zz-56zz-34zz-9zzf-azze1b8057f8",
"refresh_token": "zzazz4c3-zz2e-zz25-zz97-ezz6e219cbf6",
"scope": "default",
"token_type": "Bearer",
"expires_in": 3600
}
# You have to use `access_token` in API calls explained bellow.
# You can get `access_token` with j['access_token'].
# Using authentication to make API calls
## Define header for making API calls that will hold authentication data
headersAPI = {
'accept': 'application/json',
'Authorization': 'Bearer '+j['access_token'],
}
### Usage of parameters defined in your API
params = (
('offset', '0'),
('limit', '20'),
)
# Making sample API call with authentication and API parameters data
response = requests.get('https://somedomain.test.com/api/Users/Year/2020/Workers', headers=headersAPI, params=params, verify=True)
api_response = response.json()
答案 3 :(得分:0)
import json
import os
import requests
def lambda_handler(event, context):
print(event)
item = list(map(lambda x: x['detail']['item'], event['inputData']))
print("item List :", item)
consumer_key = os.getenv('consumer_key')
consumer_secret = os.getenv('consumer_secret')
entitlement_url=os.getenv('entitlement_url')
storage_url=os.getenv('storage_url')
access_token = get_jwt_token(consumer_key,consumer_secret,entitlement_url)
print("Response from entitlement: ", access_token)
for listID in list:
print("listID: ", listID)
response = get_storage_service(access_token,storage_url,listID)
print("Response from storage: ", response.text)
return "Success"
def get_jwt_token(consumer_key, consumer_secret, url):
data = 'grant_type=client_credentials&client_id=' + consumer_key + '&client_secret=' + consumer_secret
header = {"Content-type": "application/x-www-form-urlencoded"}
try:
response = requests.post(url, data=data, headers=header)
access_token = json.loads(response.text)
final_response=access_token['access_token']
except requests.exceptions as err:
print(err)
final_response = 'error'
return final_response
def get_storage_service(jwt_token, url, list_id):
final_url = url + list_id + "/data"
print("Final url is :", final_url)
headers_api = {
'Authorization': 'Bearer ' + jwt_token
}
try:
response = requests.get(url=final_url, headers=headers_api)
except requests.exceptions as err:
print(err)
response = 'error'
return response
使用环境变量