Webは用いる人のリテラシーで決まる ウェブ運用と開発現場を経験したエンジニアのTIPS
TOP > BLOG > IT記事

楽天の購入商品API(PurchaseItemAPI)にPythonでアクセスしてみる

早川朋孝 早川朋孝
EC専門のSE

ECサイトの運用は時間がかかる面倒な単純作業がいっぱいあり、自動化や効率化を進めないとあっという間にミス多発や人手不足となり、業務に押しつぶされてしまう。

幸いなことに楽天やamazon、Yahooなど大手ECモールは業務自動化を助けるAPIを提供している。今回は楽天の購入商品API(PurchaseItemAPI)を使ってどのような業務自動化ができるのか、具体的な例を挙げて紹介する。

楽天の購入商品API(PurchaseItemAPI)を使うメリット

楽天の購入商品API(PurchaseItemAPI)は指定した条件に一致する注文で購入された商品情報の取得を行うAPIで、注文情報から個人情報が省略されている。例えば、注文データの分析などをするのに使う。

今どき個人情報には細心の注意で接する必要があることを考えると、個人情報に触れずにデータの分析ができるのは大きなメリットだ。データ分析を外部に出したり、社内でより多くの従業員に依頼できたりする。

商品のデータ分析はもちろん管理画面でもできるが、これが例えば楽天だけでなくamazonも、YahooもShopifyもとなると、各管理画面にアクセスする必要が出てくる。さらにモールを横断して売れ筋の商品を人手をかけて集計するとなると、かなりの工数がかかるし、間違いも起きる。これはとても面倒だ。

だからAPIを使う。

APIなら、プログラムを介して必要な情報を自動で取得できる。定期的に処理をさせて自動で売れ筋商品のレポート作成なんてこともできる。

面倒な作業はプログラムにやらせよう。

楽天APIのエンドポイントににPythonでアクセスしてみる

RMSからAPIへ

基本的な仕様は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に保存するなり、自社システムと接続するなり、いかようにも活用できる。

×
このブログを書いてる人
早川 朋孝 EC専門のSE
IT業界歴20年のエンジニアです。ネットショップ勤務で苦労した経験から、EC・ネットショップ事業者に向けて、バックオフィス業務の自動化・効率化を提案するSEをしています。
プロフィール
API連携の相談にのります
趣味は読書、ピアノ、マリノスの応援など
PAGE TOP