การเรียก API ใน Python ด้วย API ที่ต้องใช้โทเค็นผู้ถือ


98

กำลังมองหาความช่วยเหลือในการรวมการเรียก JSON API เข้ากับโปรแกรม Python

ฉันต้องการรวม API ต่อไปนี้เข้ากับโปรแกรม Python .py เพื่อให้สามารถเรียกใช้และพิมพ์คำตอบได้

คำแนะนำของ API ระบุว่าต้องสร้างโทเค็นผู้ถือเพื่ออนุญาตการเรียกไปยัง API ซึ่งฉันทำสำเร็จแล้ว อย่างไรก็ตามฉันไม่แน่ใจเกี่ยวกับไวยากรณ์ที่จะรวมโทเค็นนี้เป็นการรับรองความถูกต้องโทเค็นของผู้ถือในคำขอ Python API

ฉันสามารถดำเนินการตามคำขอข้างต้นได้สำเร็จโดยใช้ cURL โดยมีโทเค็นรวมอยู่ด้วย ฉันได้ลองใช้เส้นทาง "urllib" และ "request" แล้ว แต่ไม่เป็นประโยชน์

รายละเอียด API แบบเต็ม: เอกสารIBM X-Force Exchange API - IP Reputation

คำตอบ:


147

หมายความว่าคาดว่าจะเป็นคีย์ในข้อมูลส่วนหัวของคุณ

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 ... อย่าเรียกมันว่า
Joran Beasley

ขอบคุณ Joran Beasley อัปเดตไลบรารีคำขอผ่าน 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 แอปของคุณใน deleoper แผงสำหรับรหัสของคุณ ... มีโอกาสที่จะเป็นโทเค็นแรกของคุณ ... คุณต้องแลกเปลี่ยนโทเค็นเพื่อเป็นโทเค็นการรีเฟรชที่คุณสามารถใช้เพื่อรับโทเค็นที่ถาวรมากขึ้น (อย่างน้อยนั่นก็เป็นวิธีที่ oauth2 โดยปกติ .. )
Joran Beasley

อ๊ะดูเหมือนว่าฉันมีส่วนหัวผิดลองรหัสที่อัปเดต
Joran Beasley

56

หากคุณกำลังใช้requestsโมดูลตัวเลือกอื่นคือการเขียนคลาส auth ตามที่กล่าวไว้ใน " New Forms of Authentication ":

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อาร์กิวเมนต์เดียวกันเช่นเดียวกับการรับรองความถูกต้องพื้นฐานและอาจช่วยคุณได้ในบางสถานการณ์


สิ่งนี้อาจมีประโยชน์กับ Zeep เช่นกัน ใช้การอนุญาตประเภท
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

0

นี่คือตัวอย่างทั้งหมดของการใช้งานใน cURL และใน Python - สำหรับการอนุญาตและการเรียก API

cURL

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เป็นเพียงตัวอย่างของ 2 พารามิเตอร์ที่ API สามารถนำไปใช้ได้ คุณต้อง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

สิ่งเดียวกันจากด้านบนที่ใช้ใน 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()

@KurtPeters ความคิดเห็นของคุณไม่มีส่วนเกี่ยวข้องกับคำถาม OP คำตอบของฉันใช้ได้ผลดีกับกรณีของเขา
Harvey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.