2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

cURL API を Pythonスクリプト に変換する(IBM Cloud オブジェクトストレージを使って)

Posted at

cURLでREST-APIの動作確認をしてからPythonに書き直すときの変換パターンをメモ

  1. IBM Cloud オブジェクトストレージを使って cURL の動作を確認する。
  2. 確認できたcURLをPythonスクリプトで書いて、オブジェクトストレージで検査する。

その1.認証トークンを取得する

cURLの場合

curl -X "POST" "https://iam.cloud.ibm.com/identity/token" \
     -H 'Accept: application/json' \
     -H 'Content-Type: application/x-www-form-urlencoded' \
     --data-urlencode "apikey={api-key}" \
     --data-urlencode "response_type=cloud_iam" \
     --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey"

Pythonの場合

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import requests
import json

# トークンを取得する
headers = {
    'Accept': 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded',
}
data = {
    'apikey': os.environ['IBM_APIKEY'],
    'response_type': 'cloud_iam',
    'grant_type': 'urn:ibm:params:oauth:grant-type:apikey'
}
response = requests.post('https://iam.cloud.ibm.com/identity/token', headers=headers, data=data)
print(response)
output = response.json()
#print(json.dumps(output, indent=4))

ibm_access_token = output['access_token']

print(ibm_access_token)

Python実行結果

STATUS :<Response [200]>

{
"access_token":"eyJraWQ******************************************2Erh-Te-w",
"expires_in":3600,
}
# すんごく長いトークンは、1時間有効(3600 = 60秒 x 60分)

その2.バケットのリストを表示する

cURLの場合

curl "https://(endpoint)/" \
 -H "Authorization: bearer (token)" \
 -H "ibm-service-instance-id: (resource-instance-id)"

Pythonの場合

# トークンの取得までは同じpythonスクリプトを書く
# “#!/usr/bin/env pythonからibm_access_token = output['access_token']まで”
# ここでは省略します。

# オブジェクトのリスト表示
headers = {
    'Authorization': 'bearer ' + ibm_access_token
}
response = requests.get('https://s3.jp-tok.cloud-object-storage.appdomain.cloud/robocamera', headers=headers)
print("STATUS :" + str(response))
print("HEADERS:" + str(response.headers))
print("TEXT   :" + str(response.text))

Python実行結果

STATUS :<Response [200]>
HEADERS:{'Content-Length': '1938', 'ibm-sse-kp-enabled':  <中略> 'Content-Type': 'application/xml'}
TEXT   :<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <中略>

        <Name>robocamera</Name>
        <Contents>
            <Key>ciel_face_s.png</Key><LastModified>2019-11-30T02:50:53.410Z</LastModified>
            <Key>ghostpicture.jpg</Key><LastModified>2019-11-30T01:46:52.413Z</LastModified>
            <Key>index.html</Key><LastModified>2019-11-24T14:48:55.793Z</LastModified>

その3.バケットにファイルをアップロードする

cURLの場合

curl -X "PUT" "https://(endpoint)/(bucket-name)/(object-key)" \
 -H "Authorization: bearer (token)" \
 -H "Content-Type: (content-type)" \
 -d "(object-contents)"

Pythonの場合

# IBM Cloud Object Storage に、カメラ画像ファイルをアップロードする。
# この例では[/robocamera]がバケット名、[ghostpicture.jpg]がオブジェクトのキー名。
    headers = {
        'Authorization': 'bearer ' + ibm_access_token,
        'Content-Type': 'image/jpeg',
    }
    f = open('capture_output.jpg', 'rb')
    img_data = f.read()
    f.close()
    response = requests.put(service_endpoint + '/robocamera/ghostpicture.jpg', headers=headers, data=img_data)
    # トークン取得をデバッグするときに検査したいとき
    print("UPLOAD STATUS:" + str(response))

おっと。cURL と Pythonスクリプトを変換してくれるサイトがありました。

これは便利。

Convert curl syntax to Python https://curl.trillworks.com/

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?