[ トップページ ]
Web とインターネット:Web サーバと Web サービス・管理

楽天の在庫 API を Python でつかう方法がようやくわかった

楽天の在庫 API を Python でつかおうとして,あれこれさがしまわり,複雑怪奇なプログラムをながめてきた. 結論としては zeep というなまえの python による SOAP のライブラリをつかえば在庫情報の検索は 10 数行で書けるということだった.

Rakuten API を Python でつかおうとしているが…」に書いたように,楽天の在庫管理のために API でアクセスしようとして,あれこれさがしまわった. 参考にした rakuten-ws 0.4.4 は比較的ちいさなプログラムだが,それでもドキュメントはほとんどないし,必要以上に複雑なことをしていて,なかなか理解できなかった. ようやくそれを必要最低限にちぢめたのが,つぎのプログラムだ (2020-2-18 改訂).

import zeep, base64

client = zeep.Client(wsdl = "{WSDL}")

ArrayOfString = client.get_type('ns0:ArrayOfString')
factory = client.type_factory('ns1')
externalUserAuthModel = factory.ExternalUserAuthModel(
     authKey = b"ESA " + base64.b64encode(b"{service_secret}" + b':' +b"{license_key}")
     userName = "{name}",
     shopUrl = "{shop}",
 ),

getMethod = getattr(client.service, 'getInventoryExternal')
response = getMethod(
    externalUserAuthModel = externalUserAuthModel,
    getRequestExternalModel = factory.GetRequestExternalModel(
        itemUrl = ArrayOfString(["{itemUrl1}", ..., "{itemUrlN}"])
    )
)

ここで {WSDL} は楽天の RMS API の WSDL ファイルがある場所 (URL) だが,これは楽天の公開された場所にはないので,RMS でダウンロードしたものを指定する必要がある. {shop} は店の URL,{name} は店のなまえ,{service_secret},{license_key} は API 使用のための申請でえられる秘密情報だ. {ItemUrl1} などが在庫情報がほしい商品の記号 (番号) だ. 在庫情報は response に格納される. "itemUrl = ..." のかわりに "inventorySearchRange = 99999" と書くと,在庫数が 99999 以下の商品をすべてもとめることができる.

在庫管理にはもうひとつ,在庫をかきかえるサービスがある. それも追記する(2020-2-14).

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
キーワード:

トラックバック

このエントリーのトラックバックURL:
https://www.kanadas.com/mt/mt-tb.cgi/7532

コメント (4)

質問:

上記のコードを参考にやってみたのですが、
下記エラーがでてしまいます。
認証情報は、繰り返し確認したので、
間違いないと思いますが、他になにか原因考えられますでしょうか?

'errCode': 'E02-101',
'errMessage': 'ユーザー認証に失敗しました',
'getResponseExternalItem': {
'GetResponseExternalItem': []

Kanada:

コメント (1) について: 認証情報はわずかにちがっても失敗するのだとおもいます.どこがちがっているのかこれだけではわかりませんが,空白文字やみえない文字などで問題がおこっている可能性もあるのではないかとおもいます.

uwasa:

お世話になっております。
RMS API の WSDL ファイルのダウンロードする場所を教えていただきたいです・・・。
勉強不足で申し訳ございません。
ご確認よろしくお願い致します。

uwasa:

お世話になっております。
RMS API の WSDL ファイルのダウンロードする場所を教えていただきたいです・・・。
勉強不足で申し訳ございません。
ご確認よろしくお願い致します。

コメントを投稿

Google でブログを検索:

メインページアーカイブページも見てください.
Creative Commons License
このブログはつぎのライセンスで保護されています. クリエイティブ・コモンズ・ライセンス.
Powered by Movable Type