Здійснення виклику API на Python за допомогою API, який вимагає маркер носія


92

Шукаємо допомогу з інтеграцією виклику JSON API у програму Python.

Я прагну інтегрувати наступний API у програму Python .py, щоб дозволити його викликати та надрукувати відповідь.

Вказівки щодо API стверджують, що для дозволу викликів до API, який я успішно зробив, потрібно генерувати маркер носія. Однак я не впевнений, що синтаксис включає цей маркер як аутентифікацію маркера на пред'явника в запиті API Python.

Я можу успішно виконати вищезазначений запит, використовуючи cURL із включеним маркером. Я пробував маршрути "urllib" та "запити", але безрезультатно.

Повна інформація про API: Документація до API API X-Force Exchange - Репутація IP

Відповіді:


143

Це просто означає, що він очікує, що це ключ у ваших даних заголовка

import requests
endpoint = ".../api/ip"
data = {"ip": "1.1.2.3"}
headers = {"Authorization": "Bearer MYREALLYLONGTOKENIGOT"}

print(requests.post(endpoint, data=data, headers=headers).json())

Вищезазначене викликає таку синтаксичну помилку: 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 Код нижче: 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() Будь-які ідеї?
user4657

у вас є стара версія запитів ... jsonу вашій версії є дикт, а не функція requests.post(...).json ... не називайте його
Джоран Бізлі

Дякую Джоран Бізлі. Оновлена ​​бібліотека запитів через pip, і це дозволило мені зберегти оригінальний синтаксис. Однак тепер, коли я запускаю вищезазначене, виводиться така відповідь .json: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} Це те саме, що якщо я натиснув URL-адресу безпосередньо в браузері. Мені щось не вистачає з маркером або спосіб налаштування кінцевої точки? Код: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()
user4657

на жаль, я дійсно не можу з цим допомогти ... це або погана кінцева точка, або ваші облікові дані недійсні (ви використовуєте їх прикладний маркер, який налаштований лише на їхню URL-адресу?), або, можливо, вам потрібно помістити URL-адресу свого додатка в їх видаляч панель для вашого коду ... швидше за все, це ваш перший маркер ... вам потрібно обміняти маркер на маркер оновлення, який потім ви зможете використовувати для отримання більш постійного маркера (принаймні саме так зазвичай працює oauth2 ..)
Джоран Бізлі

Ой, схоже, у мене неправильний заголовок, спробуйте оновлений код
Джоран Бізлі

50

Якщо ви використовуєте requestsмодуль, альтернативним варіантом є написання класу автентичності , як обговорюється в " Нові форми автентифікації ":

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

а потім можете надсилати такі запити

response = requests.get('https://www.example.com/', auth=BearerAuth('3pVzwec1Gs1m'))

що дозволяє використовувати той самий authаргумент, що і базовий аутентифікатор, і може допомогти вам у певних ситуаціях.


Це може бути корисно і з зеепом. Він використовує типи авторизацій
request.auth

20

Токен повинен бути розміщений у заголовку авторизації відповідно до наступного формату:

Авторизація: Носій [Token_Value]

Код нижче:

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

Для Python3:req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
SidJ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.