Buscando ayuda para integrar una llamada a la API JSON en un programa Python.
Estoy buscando integrar la siguiente API en un programa Python .py para permitir que se llame y se imprima la respuesta.
La guía de la API establece que se debe generar un token de portador para permitir llamadas a la API, lo cual he hecho con éxito. Sin embargo, no estoy seguro de la sintaxis para incluir este token como autenticación de token de portador en la solicitud de la API de Python.
Puedo completar con éxito la solicitud anterior usando cURL con un token incluido. He intentado rutas "urllib" y "solicitudes" pero sin resultado.
Detalles completos de la API: Documentación de la API de IBM X-Force Exchange - Reputación de IP
Traceback (most recent call last): File "bearerreturn.py", line 6, in <module> print requests.post(endpoint,data=data,headers=headers).json() TypeError: 'dict' object is not callable
Código siguiente: ¿import requests endpoint = "https://xforce-api.mybluemix.net:443/api/ip" data = {"ip":"1.1.2.3"} headers = {"Bearer token":"TOKEN WAS INSERTED HERE"} print requests.post(endpoint,data=data,headers=headers).json()
Alguna idea?json
es un dictado en su versión y no una funciónrequests.post(...).json
... no la llame{u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'}
Esto es lo mismo que si presiono la URL directamente en un navegador. ¿Me falta algo con el token o la forma en que se configura el punto final? Código:import requests endpoint = "https://xforce-api.mybluemix.net:443/ipr/" data = {"ip":"1.1.2.3"} headers = {"Bearer token":"TOKEN_HERE"} print requests.post(endpoint,data=data,headers=headers).json()
Si está utilizando el
requests
módulo, una opción alternativa es escribir una clase de autenticación, como se explica en " Nuevas formas de autenticación ":import requests class BearerAuth(requests.auth.AuthBase): def __init__(self, token): self.token = token def __call__(self, r): r.headers["authorization"] = "Bearer " + self.token return r
y luego puedes enviar solicitudes como esta
response = requests.get('https://www.example.com/', auth=BearerAuth('3pVzwec1Gs1m'))
que le permite usar el mismo
auth
argumento como autenticación básica y puede ayudarlo en ciertas situaciones.fuente
El token debe colocarse en un encabezado de autorización de acuerdo con el siguiente formato:
Autorización: Portador [Token_Value]
Código a continuación:
import urllib2 import json def get_auth_token() ''' get an auth token ''' req=urllib2.Request("https://xforce-api.mybluemix.net/auth/anonymousToken") response=urllib2.urlopen(req) html=response.read() json_obj=json.loads(html) token_string=json_obj["token"].encode("ascii","ignore") return token_string def get_response_json_object(url, auth_token) ''' returns json object with info ''' auth_token=get_auth_token() req=urllib2.Request(url, None, {"Authorization": "Bearer %s" %auth_token}) response=urllib2.urlopen(req) html=response.read() json_obj=json.loads(html) return json_obj
fuente
req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)