Python'da bir taşıyıcı belirteci gerektiren bir API ile bir API çağrısı yapmak


92

Bir JSON API çağrısını bir Python programına entegre etme konusunda yardım arıyorum.

Aşağıdaki API'nin çağrılmasına ve yanıtın yazdırılmasına izin vermek için bir Python .py programına entegre etmeyi düşünüyorum.

API kılavuzu, başarılı bir şekilde yaptığım API'ye çağrılara izin vermek için bir taşıyıcı belirtecinin oluşturulması gerektiğini belirtir. Ancak bu belirteci Python API isteğine taşıyıcı belirteci kimlik doğrulaması olarak dahil etmek için sözdiziminden emin değilim.

İçerdiği bir belirteçle cURL kullanarak yukarıdaki isteği başarıyla tamamlayabilirim. "Urllib" ve "istek" yollarını denedim ama işe yaramadı.

Tam API ayrıntıları: IBM X-Force Exchange API Belgeleri - IP İtibar

Yanıtlar:


143

Sadece başlık verilerinizde bir anahtar olarak bunu beklediği anlamına gelir

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

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

Yukarıdakiler aşağıdaki sözdizimi hatasını verir: Aşağıdaki 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 Kod: 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() Herhangi Bir Fikir?
user4657

isteklerin eski bir sürümüne sahipsiniz ... jsonsürümünüzde bir karar ve bir işlev değil requests.post(...).json ... onu arama
Joran Beasley

Teşekkürler Joran Beasley. Pip aracılığıyla İstek kitaplığı güncellendi ve bu, orijinal sözdizimini korumama izin verdi. Ancak, şimdi yukarıdakileri çalıştırdığımda şu .json yanıtını veriyor: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} Bu, URL'yi doğrudan bir tarayıcıda vurmamla aynı. Jetonlu bir şeyi veya uç noktanın yapılandırılma şeklini mi kaçırıyorum? Kod: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

maalesef bu konuda gerçekten yardımcı olamıyorum ... ya kötü bir uç nokta ya da kimlik bilgileriniz geçersiz (örnek simgelerini mi kullanıyorsunuz, bu yalnızca url'leri için yapılandırılmış mı?) ya da belki de uygulamanızın url'sini deleoper'larına koymanız gerekiyor kodunuz için bir panel ... muhtemelen bu sizin ilk belirtecinizdir ... Daha sonra daha kalıcı bir simge elde etmek için kullanabileceğiniz bir yenileme belirteci için jeton değiştirmelisiniz (en azından oauth2 genellikle böyle çalışır ..)
Joran Beasley

whoops, başlık yanlış gibi görünüyor güncellenmiş kodu deneyin
Joran Beasley

51

requestsModül kullanıyorsanız , " Yeni Kimlik Doğrulama Formları " nda açıklandığı gibi alternatif bir seçenek de bir kimlik doğrulama sınıfı yazmaktır :

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

ve sonra bunun gibi istekler gönderebilir misin

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

Bu, aynı authargümanı temel kimlik doğrulaması gibi kullanmanıza olanak tanır ve belirli durumlarda size yardımcı olabilir.


Bu, zeep için de yararlı olabilir. İstekleri kullanır.auth tür yetkilendirmeler (sabun başlıkları değil, http başlıkları kimlik doğrulaması için)
smido

20

Jeton, aşağıdaki biçime göre bir Yetkilendirme başlığına yerleştirilmelidir:

Yetkilendirme: Hamiline [Token_Value]

Aşağıdaki kod:

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 için:req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
SidJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.