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

楽天の在庫API(InventoryAPI)にPythonで在庫情報を取得してみた

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

楽天の在庫APIはSKUプロジェクトにより近いうちに仕様が変わり、「在庫API 2.0(InventoryAPI 2.0)」となる。

しかし現仕様でのアクセスが必要な場面もあるだろう。そこで、今回は楽天の在庫API(InventoryAPI)にPythonでアクセスする方法を紹介する。このAPIは仕様が古くsoap形式でのリクエストが必要で、楽天の公式ドキュメントを見てもいまいち分かりにくい面がある。

あれこれ試行錯誤してPythonでアクセスできたのだが、完成したソースをみればいとも簡単に在庫情報にアクセスできることが分かる。

なおRMSに「SKU移行済の店舗はこちらのAPIを使用することができません。」とあるのでSKU移行済みの店舗はここに紹介する方法では在庫情報にアクセスできない。

import zeep, base64
import requests
import time
import urllib.request
import urllib.error
import defusedxml.ElementTree as ET
import datetime

#楽天のアクセスキー
serviceSecret = 'hogehoge'
licenskey =  'hogehoge'
b64 = serviceSecret + ':' + licenskey
b64_en = base64.b64encode(b64.encode())
api_key = b'ESA ' + b64_en
api_key_str = str(api_key)
api_key_str = api_key_str[2:]
api_key_str = '' + api_key_str[:-1] + ''

# 設定値
url = 'https://api.rms.rakuten.co.jp/es/1.0/inventory/ws'
headers = {'Content-Type': 'text/xml;charset=UTF-8'}
method = 'POST'
shop_url = 'hogehoge'   #店舗のshop_url


def get_item_stock(shop_url, item_id):
    body = """<!--?xml version="1.0" encoding="UTF-8"?-->
     <soap-env:envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="java:jp.co.rakuten.rms.mall.inventoryapi.v1.model.entity" 
xmlns:ns2="https://inventoryapi.rms.rakuten.co.jp/rms/mall/inventoryapi"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns3="java:language_builtins.lang">
    <soap-env:body>
    <ns2:getinventoryexternal><ns2:externaluserauthmodel>"""
    body += api_key_str
    body += """
    <ns1:username>?</ns1:username>
    <ns1:shopurl>
    body += shop_url
    body += """</ns1:shopurl>
    <ns2:getrequestexternalmodel>
    <ns1:inventorysearchrange xsi:nil="true">
    <ns1:itemurl>
    <ns3:string>"""
    body += item_id
    body += """</ns3:string></ns1:itemurl>
    </ns1:inventorysearchrange></ns2:getrequestexternalmodel> 
    """

    response = requests.post(url, data=body, headers=headers)
    xml_data = response.content.decode('utf-8')
    return xml_data
    
    
if __name__=="__main__":
    xml = get_item_stock(shop_url, item_id)     

item_idはRMSから商品登録画面で確認できる。
これが成功すると生のxmlのレスポンスが得られる。正常終了という箇所で成功したかどうか分かる。

在庫数が100なら100が在庫情報とレスポンスが返ってくる。あとは必要に応じてxmlの解析をしてデータを利用するだけ。簡単にできるのでお試しください。

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