【サンプルコード付き】AmazonMWSをPythonのrequestsで使う。



MWSとは?


AmazonマーケットプレイスWebサービス(MWS)は、統合WebサービスAPIであり、Amazonの出品者がプログラムを使用して、出品、注文、支払い、レポート、その他についてデータを交換できるよう支援するものです。

https://developer.amazonservices.jp/

簡単に言うとAmazonの商品データや注文データを自作のツールで取扱いしやすい形で提供してくれるAPIです。

AmazonのAPIは二種類存在しており、MWSはその中でも出品者向けのAPIになります。対になるもう一つのAPIはProduct Advertising API(PA-API)と言い、アフィリエイター向けのAPIです。

Pythonのrequestsを使ったMWSサンプルコード

import base64
import datetime
import hashlib
import hmac
import urllib.parse
import requests
import six


AMAZON_CREDENTIAL = {
    'SELLER_ID': '★',
    'ACCESS_KEY_ID': '★',
    'ACCESS_SECRET': '★',
}

DOMAIN = 'mws.amazonservices.jp'
ENDPOINT = '/Products/2011-10-01'


#Idlistは最大5 回復レートは5商品/秒 最大20リクエスト 1時間あたり18000
def GetMatchingProductForId(IdList):
    q= {
        'Action': 'GetMatchingProductForId',
        'MarketplaceId': 'A1VC38T7YXB528',
        'Version': '2011-10-01',
        'IdType': 'ASIN',
    }
    [q.update({'IdList.Id.' + str(i + 1):Id}) for i,Id in enumerate(IdList)]
    
    return q

#Idlistは最大20 回復レートは10商品/秒 最大20リクエスト 時間最大36000リクエスト
#新品のカートボックス価格と中古のカートボックス価格を返す
def GetCompetitivePricingForASIN(IdList):
    q= {
        'Action': 'GetCompetitivePricingForASIN',
        'MarketplaceId': 'A1VC38T7YXB528',
        'Version': '2011-10-01',
    }
    [q.update({'ASINList.ASIN.' + str(i + 1):Id}) for i,Id in enumerate(IdList)]
    
    return q
    
#Idlistは最大20 回復レートは10商品/秒 最大20リクエスト 時間最大36000リクエスト
#最低価格	
#ItemCondition値:#New #Used #Collectible #Refurbished #Club #デフォルト:All
def GetLowestOfferListingsForASIN(IdList,ItemCondition='New',ExcludeMe=True):
    q= {
        'Action': 'GetLowestOfferListingsForASIN',
        'MarketplaceId': 'A1VC38T7YXB528',
        'Version': '2011-10-01',
        'ItemCondition': ItemCondition,
        'ExcludeMe': ExcludeMe
    }
    [q.update({'ASINList.ASIN.' + str(i + 1):Id}) for i,Id in enumerate(IdList)]
    
    return q

#Idlistは最大20 回復レートは1リクエスト/5秒 最大20リクエスト 時間最大720リクエスト
def ListMatchingProducts(Query,QueryContextId='All'):
    q= {
        'Action': 'ListMatchingProducts',
        'MarketplaceId': 'A1VC38T7YXB528',
        'Version': '2011-10-01',
        'Query': Query,
        'QueryContextId': QueryContextId
    }
    
    return q
    
#最大20 回復レートは1リクエスト/5秒 最大20リクエスト 時間最大720リクエスト
def GetProductCategoriesForASIN(ASIN):
    q= {
        'Action': 'GetProductCategoriesForASIN',
        'MarketplaceId': 'A1VC38T7YXB528',
        'Version': '2011-10-01',
        'ASIN': ASIN
    }
    
    return q

def PostMWS(q):
    
    timestamp = datetime_encode(datetime.datetime.utcnow())
    last_update_after = datetime_encode(
        datetime.datetime.utcnow() - datetime.timedelta(days=1)
    )
    
    data = {
        'AWSAccessKeyId': AMAZON_CREDENTIAL['ACCESS_KEY_ID'],
        'MarketplaceId': 'A1VC38T7YXB528',
        'SellerId': AMAZON_CREDENTIAL['SELLER_ID'],
        'SignatureMethod': 'HmacSHA256',
        'SignatureVersion': '2',
        'Timestamp': timestamp,
    }
    
    data.update(q)
    query_string = urllib.parse.urlencode(sorted(data.items()))
    canonical = "{}n{}n{}n{}".format(
        'POST', DOMAIN, ENDPOINT, query_string
        )
    h = hmac.new(
        six.b(AMAZON_CREDENTIAL['ACCESS_SECRET']),
        six.b(canonical), hashlib.sha256
        )
    signature = urllib.parse.quote(base64.b64encode(h.digest()), safe='')
    url = 'https://{}{}?{}&Signature={}'.format(
        DOMAIN, ENDPOINT, query_string, signature)
        
    res = requests.post(url)
    
    return res

if __name__ == '__main__':
    asin = ['B07G2DLKYL','B0784GLG4V']
    q = GetLowestOfferListingsForASIN(asin)
    res = PostMWS(q)
  print(res)

MWSサンプルコード解説

いくつかのエンドポイントに対してアクセスしやすいように、各エンドポイントへの振り分けを関数化しています。

メインルーチンでは例としてGetLowestOfferListingsForASINへのアクセスをしています。

各エンドポイント名の関数でアクセス用の構造化データを作り、辞書型として返しています。

受け取った辞書データをPostMWS関数に渡すとそのデータを使ってエンドポイントにアクセスします。