Melakukan panggilan API dengan Python dengan API yang membutuhkan token pembawa


92

Mencari bantuan untuk mengintegrasikan panggilan JSON API ke dalam program Python.

Saya ingin mengintegrasikan API berikut ke dalam program .py Python untuk memungkinkannya dipanggil dan tanggapannya akan dicetak.

Panduan API menyatakan bahwa token pembawa harus dibuat untuk memungkinkan panggilan ke API, yang telah saya lakukan dengan sukses. Namun saya tidak yakin sintaks untuk memasukkan token ini sebagai otentikasi token pembawa dalam permintaan Python API.

Saya berhasil menyelesaikan permintaan di atas menggunakan cURL dengan token disertakan. Saya telah mencoba rute "urllib" dan "permintaan" tetapi tidak berhasil.

Detail API lengkap: Dokumentasi API IBM X-Force Exchange - Reputasi IP

Jawaban:


143

Itu hanya berarti mengharapkan itu sebagai kunci dalam data header Anda

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

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

Di atas melempar kesalahan sintaks berikut: 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 Kode Di Bawah: 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() Ada Ide?
pengguna4657

Anda memiliki permintaan versi lama ... jsonadalah perintah dalam versi Anda dan bukan fungsi requests.post(...).json ... jangan menyebutnya
Joran Beasley

Terima kasih Joran Beasley. Pustaka Permintaan yang diperbarui melalui pip dan ini memungkinkan saya untuk menyimpan sintaks asli. Namun sekarang ketika saya menjalankan yang di atas, ia mengeluarkan respons .json ini: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} Ini sama seperti jika saya menekan URL langsung di browser. Apakah saya kehilangan sesuatu dengan token atau cara endpoint dikonfigurasi? Kode: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

sayangnya saya tidak dapat benar-benar membantu dengan itu ... itu adalah titik akhir yang buruk atau kredensial Anda tidak valid (apakah Anda menggunakan token contoh mereka, yang hanya dikonfigurasi untuk url mereka?) atau mungkin Anda perlu meletakkan url aplikasi Anda di deleoper mereka panel untuk kode Anda ... kemungkinan itu adalah token pertama Anda ... Anda perlu menukar token dengan token penyegaran yang kemudian dapat Anda gunakan untuk mendapatkan token yang lebih permanen (setidaknya begitulah biasanya oauth2 bekerja ..)
Joran Beasley

Ups sepertinya saya memiliki header yang salah coba kode yang diperbarui
Joran Beasley

50

Jika Anda menggunakan requestsmodul, opsi alternatifnya adalah menulis kelas autentikasi , seperti yang dibahas dalam " Bentuk Otentikasi Baru ":

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

dan kemudian dapatkah Anda mengirim permintaan seperti ini

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

yang memungkinkan Anda menggunakan authargumen yang sama seperti autentikasi dasar, dan dapat membantu Anda dalam situasi tertentu.


Ini mungkin berguna dengan zeep juga. Ini menggunakan jenis otorisasi requests.auth (untuk http header auth, bukan header sabun)
smido

20

Token harus ditempatkan di header Otorisasi sesuai dengan format berikut:

Otorisasi: Bearer [Token_Value]

Kode di bawah ini:

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

Untuk Python3:req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
SidJ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.