UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

Amazon APIの使い方、Pythonで商品情報を取得してみる

Amazon Product Advertising APIをご存知でしょうか?

それはAmazonアソシエイトに参加している人が利用できるAPIで、

  1. 事前にアクセストークンを取得して
  2. 特定のクエリで
  3. 商品情報をXML形式で取得することができる

APIのことです。

仕組み自体は簡単なのですが、検索汚染がひどいのと、意外な落とし穴があるので今回の記事を書きました。

他の言語で実装するときに参考になると思うので

注意点を並べておきます。

  • エンドポイントは “webservices.amazon.co.jp/onca/xml”
  • 事前にAmazonアソシエイトに関連づけたアクセスキーとアクセスシークレットが必要
  • タイムスタンプはUTC形式で、"%Y-%m-%dT%H:%M:%SZ"
  • クエリは頭文字をABC順で並べる必要がある
  • 当然クエリはエンコードする必要がある
  • アクセスシークレットを利用してのSHA256-HMACでの署名(base64化)が必要

で、実際に実装したのがこれ、あくまで適当に書いたコードなので参考程度に、ちゃんと動作は確認済みです。

使い方は

python3 amazon.py {ACCESS_KEY} {ACCESS_KEY_SECRET} {ASSOCIATE_TAG} {SEARCH_INDEX} {QUERY}

と入力するとURLが出力される

なお、ASSOCIATE_TAGはAmazonアソシエイトで利用するタグのこと、SEARCH_INDEXはカテゴリのこと、例えば"Books"ならば “本"のカテゴリで検索できる

import sys
import time 
from urllib.parse import quote
import hmac
import hashlib
import base64


END_POINT = "webservices.amazon.co.jp"

URI = "/onca/xml"

def issueURI(ACCESS_KEY, ACCESS_KEY_SECRET, ASSOCIATE_TAG, SEARCH_INDEX, QUERY):

    params = {
        "Service": "AWSECommerceService", 
        "Operation": "ItemSearch", 
        "AWSAccessKeyId": ACCESS_KEY, 
        "AssociateTag": ASSOCIATE_TAG,
        "Title": QUERY,
        "SearchIndex": SEARCH_INDEX, 
        "ResponseGroup": "Images,ItemAttributes,Offers"
    }

    params["Timestamp"] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
    keys = sorted(params)

    q = []

    for key in keys:
        q.append(quote(key) + "=" +  quote(params[key]))

    q = "&".join(q)

    sign = "GET\n" + END_POINT + "\n" + URI + "\n" + q

    signature = hmac.new(bytes(ACCESS_KEY_SECRET, "ascii"), bytes(sign, 'ascii'), hashlib.sha256).digest()

    signature = base64.b64encode(signature)

    request_url = 'http://' + END_POINT + URI + '?' + q + "&Signature=" + quote(signature) 

    return request_url

if "__main__" == __name__:

    print(issueURI(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5]))