ECサイトの運用は時間がかかる面倒な単純作業がいっぱいあり、自動化や効率化を進めないとあっという間にミス多発や人手不足となり、業務に押しつぶされてしまう。
幸いなことに楽天やamazon、Yahooなど大手ECモールは業務自動化を助けるAPIを提供している。今回は楽天の購入商品API(PurchaseItemAPI)を使ってどのような業務自動化ができるのか、具体的な例を挙げて紹介する。
楽天の購入商品API(PurchaseItemAPI)を使うメリット
楽天の購入商品API(PurchaseItemAPI)は指定した条件に一致する注文で購入された商品情報の取得を行うAPIで、注文情報から個人情報が省略されている。例えば、注文データの分析などをするのに使う。
今どき個人情報には細心の注意で接する必要があることを考えると、個人情報に触れずにデータの分析ができるのは大きなメリットだ。データ分析を外部に出したり、社内でより多くの従業員に依頼できたりする。
商品のデータ分析はもちろん管理画面でもできるが、これが例えば楽天だけでなくamazonも、YahooもShopifyもとなると、各管理画面にアクセスする必要が出てくる。さらにモールを横断して売れ筋の商品を人手をかけて集計するとなると、かなりの工数がかかるし、間違いも起きる。これはとても面倒だ。
だからAPIを使う。
APIなら、プログラムを介して必要な情報を自動で取得できる。定期的に処理をさせて自動で売れ筋商品のレポート作成なんてこともできる。
面倒な作業はプログラムにやらせよう。
楽天APIのエンドポイントににPythonでアクセスしてみる

基本的な仕様はRMSから閲覧できる楽天APIサービスのページに記載してあるが(RMSのサイドメニューからアクセスできる)、ここではPythonを使って楽天の購入商品API(PurchaseItemAPI)にアクセスする方法を紹介する。
※シークレットキーやライセンスキーは取得している前提
なおエンドポイントにアクセスするプログラムはPHPでもRubyでもなんでもいい。
serviceSecret = ***************
licenskey = ***************
b64 = serviceSecret + ':' + licenskey
b64_en = base64.b64encode(b64.encode())
yesterday = datetime.date.today() + datetime.timedelta(days=-1)
jst_st = str(yesterday)+"T00:00:00+0900"
jst_ed = str(yesterday)+"T23:59:59+0900"
headers = {
'Authorization': b'ESA ' + b64_en,
'Content-Type': 'application/json; charset=utf-8',
}
url_search_order = 'https://api.rms.rakuten.co.jp/es/2.0/purchaseItem/searchOrderItem/'
search_data = {
"orderProgressList": [100, 200, 300, 400, 500, 600, 700],
"dateType":1,
"startDatetime":jst_st,
"endDatetime":jst_ed,
"PaginationRequestModel": {"requestRecordsAmount":1000, "requestPage":1}
}
r_post = requests.post(url_search_order, headers=headers, json=search_data)
order_list = json.loads(r_post.text)
order_list = order_list['orderNumberList'] #これが指定日の注文番号一覧リスト
for id in order_list:
print(id)
このプログラムは前日の注文からキャンセルされた以外の注文情報の一覧を取得する処理を行っている。エンドポイントに条件を指定してアクセスすると、その結果が返ってくる。
指定日の注文番号一覧をリストにしたので、次に各注文番号から注文内容を取得する。どんな商品がいくつ売れ、いくらで購入されたかなどの情報が手に入る。
注意点として、一度のリクエストで得られる情報は100件までなので、100件以上ある場合は初回リクエスト時に発行される次ページのtokenを指定して、再度リクエストする必要がある。これはamazonなどのAPIも同じ仕様だ。
#一度のリクエストは100件まで 2022/10/13時点の楽天APIの仕様
rakuten_constant_number = 100
div_number = len(order_list) // rakuten_constant_number
master_data = {}
if div_number > 0: #1日の注文件数が100件以上の場合
#100でわった剰余を求めておく
mod_number = len(order_list) % rakuten_constant_number
count = div_number + 1
start_num = 0
end_num = rakuten_constant_number
#order_listを100件ずつのリストに分割する
for row in range(count):
if row == div_number:
end_num = (rakuten_constant_number * div_number) + mod_number
tmp = []
for rowj in range(start_num, end_num):
tmp.append(order_list[rowj])
master_data[row] = tmp
start_num += 100
end_num += 100
elif div_number == 0: #1日の注文件数が100件未満の場合
master_data[0] = order_list
#各注文番号の情報を取得
url_get_order = 'https://api.rms.rakuten.co.jp/es/2.0/purchaseItem/getOrderItem/'
for row in master_data:
order_data = {
'orderNumberList': master_data[row]
}
#注文番号一件ずつに対してエンドポイントにリクエストする
req = urllib.request.Request(url_get_order, json.dumps(order_data).encode(), headers)
#注文が0件の場合は400badとなる 例:2022/8/28
try:
with urllib.request.urlopen(req) as res:
body = res.read()
except urllib.error.HTTPError:
break
json_load = json.loads(body)
以上のPythonコードで指定した日の注文番号と、それに結びついた注文商品の情報が取得できた。あとはDBに保存するなり、自社システムと接続するなり、いかようにも活用できる。

