楽天の店舗が商品データにアクセスするために SOAP による Web サービスがつかわれている. それが RMS API だ. そのなかで商品 API は有料だが,他の API は店舗関係者は無料でつかえる. 在庫 API をつかう必要が生じて,Python でそれをアクセスするプログラムをつくった. 在庫をよみだすにはわずか 10 数行でよい.
在庫検索は基本的にはつぎのようにすればよい.
import zeep, base64 client = zeep.Client(wsdl = "{WSDL}") ArrayOfString = client.get_type('ns0:ArrayOfString') factory = client.type_factory('ns1') method = getattr(client.service, 'getInventoryExternal') response = method( externalUserAuthModel = factory.ExternalUserAuthModel( authKey = b"ESA " + base64.b64encode(b"{service_secret}" + b':' +b"{license_key}"), userName = "{name}", shopUrl = "{shop}", ), getRequestExternalModel = factory.GetRequestExternalModel( itemUrl = ArrayOfString(["{itemUrl1}", ..., "{itemUrlN}"]) ) )
ここで {WSDL} は楽天の RMS API の WSDL ファイルがある場所 (URL) だが,これは楽天の公開された場所にはないので,RMS でダウンロードしたものを指定する必要がある. {shop} は店の URL,{name} は店のなまえ,{service_secret},{license_key} は API 使用のための申請でえられる秘密情報だ. {ItemUrl1} などが在庫情報がほしい商品の記号 (番号) だ. 在庫情報は response に格納される.
在庫管理にはもうひとつ,在庫をかきかえるサービスがある. それも追記する (2020-2-18).
updateMethod = getattr(client.service, 'updateInventoryExternal') return updateMethod( externalUserAuthModel = externalUserAuthModel, updateRequestExternalModel = factory.UpdateRequestExternalModel( factory.ArrayOfUpdateRequestExternalItem(items) ), )
items は商品データのリストであり,商品データはたとえばつぎのようなかたちだ.
{'itemUrl': itemUrl, 'inventoryType': 2, 'inventoryUpdateMode': 1, 'inventory': quantity, 'inventoryBackFlag': 1, 'lackDeliveryDeleteFlag': 0, 'lackDeliveryId': 12, 'normalDeliveryDeleteFlag': 0, 'normalDeliveryId': 2, 'orderFlag': 1, 'orderSalesFlag': 1, 'nokoriThreshold': 8, 'restTypeFlag': 0, }
zeep をつかうにはインストールが必要だが,それはつぎの 1 行を実行するだけですむ.
pip install zeep