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

# cURLでREST-APIの動作確認をしてからPythonに書き直すときの変換パターンをメモ
1. IBM Cloud オブジェクトストレージを使って cURL の動作を確認する。
2. 確認できたcURLをPythonスクリプトで書いて、オブジェクトストレージで検査する。

## その１．認証トークンを取得する
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分）
```

## その２．バケットのリストを表示する
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>

```

## その３．バケットにファイルをアップロードする
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/>