POST log_download
サンプルコード
POST log_download を呼び出すサンプルコードをご紹介します。
下記のコードをep-api_logdownload.pyというファイル名で保存します。
import base64 |
import contextlib |
import hashlib |
import hmac |
import json |
import ssl |
import time |
import urllib.request |
import urllib.parse |
import subprocess |
ENDPOINT = "ep.api.iij.jp" |
API_VERSION = "20190625" |
API_NAME = "log_download_url" |
HTTP_METHOD = "POST" |
ACCESS_KEY = b"YOUR ACCESS KEY HERE" |
SECRET_KEY = b"YOUR SECRET KEY HERE" |
SIGNATURE_VERSION = "2" |
SIGNATURE_METHOD = "HmacSHA256" |
CONTENT_TYPE = "application/json" |
EXPIRE = time.strftime("%FT%H:%M:%SZ", time.gmtime(time.time() + 12 * 60 * 60)) |
SERVICE_CODE = "YEMxxxxxxxx" |
CHILD_SERVICE_CODE = "yexxxxxxxx" |
MASTER_ID = "xxxxxxxx" |
LOG_DATE = "YYYYMMDD" |
FILENAME = './log.zip' |
# make signature |
path = "/r/{}/{}/{}/{}.json".format( |
API_VERSION, SERVICE_CODE, CHILD_SERVICE_CODE, API_NAME |
) |
header_strings = CONTENT_TYPE + "\n" |
header_strings += "x-iijapi-expire" + ":" + EXPIRE + "\n" |
header_strings += "x-iijapi-signaturemethod" + ":" + SIGNATURE_METHOD + "\n" |
header_strings += "x-iijapi-signatureversion" + ":" + SIGNATURE_VERSION |
string_to_sign = "\n".join([HTTP_METHOD.upper(), "", header_strings, path]) |
signature = hmac.new( |
SECRET_KEY, string_to_sign.encode("utf-8"), hashlib.sha256 |
).digest() |
signature = base64.b64encode(signature) |
# setup SSL context |
context = ssl.create_default_context() |
https_handler = urllib.request.HTTPSHandler(context=context) |
opener = urllib.request.build_opener(https_handler) |
urllib.request.install_opener(opener) |
# make request |
headers = { |
"Authorization": b"IIJAPI " + ACCESS_KEY + b":" + signature, |
"Content-Type": CONTENT_TYPE, |
"x-iijapi-expire": EXPIRE, |
"x-iijapi-SignatureMethod": SIGNATURE_METHOD, |
"x-iijapi-SignatureVersion": SIGNATURE_VERSION, |
} |
data = {"LogDate": LOG_DATE} |
url = "https://{}{}".format(ENDPOINT, path) |
request = urllib.request.Request(url, json.dumps(data).encode(), headers=headers) |
# call EP-API |
with contextlib.closing(urllib.request.urlopen(request)) as conn: |
response = conn.read() |
resp_dict = json.loads(response.decode()) |
encrypt_key = resp_dict["APIResult"]["EncryptKey"] |
# encode master id |
cmd1 = "echo -n {}".format(MASTER_ID).split(" ") |
cmd2 = "openssl enc -md md5 -aes-128-cbc -e -nosalt -base64 -pass pass:{}".format(encrypt_key).split(" ") |
p1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE) |
p2 = subprocess.Popen(cmd2, stdin=p1.stdout, stdout=subprocess.PIPE) |
master_id_enc = p2.communicate()[0].decode()[:-1] |
download_url = resp_dict["APIResult"]["LogDownloadURL"] |
url = "{}?MasterID={}".format(download_url, urllib.parse.quote(master_id_enc, safe='')) |
request = urllib.request.Request(url, headers=headers) |
data = urllib.request.urlopen(request).read() |
with open(FILENAME, mode="wb") as f: |
f.write(data) |
注意点
ファイル内の以下の行を適宜変更します。
ACCESS_KEY = b"YOUR ACCESS KEY HERE" |
SECRET_KEY = b"YOUR SECRET KEY HERE" |
SERVICE_CODE = "YEMxxxxxxxx" |
CHILD_SERVICE_CODE = "yexxxxxxxx" |
MASTER_ID = "xxxxxxxx" |
LOG_DATE = "YYYYMMDD" |
実行例
下記の実行例は python 3.10.12 環境で実行しています。
$ python ep-api_logdownload.py |
正常に終了すると、log.zip というファイル名でログがダウンロードされます。 |
$ ls -l log.zip |
-rw-r--r-- 1 user group 1406139 Nov 13 17:46 log.zip |