Tech Blog - mixross
Amazonからのお知らせ
アソシエイトのページに行くとこんな通知が
Product Advertising API(以下、PA-API)をバージョンアップしろという内容認証情報作成
まずは新しい認証鍵を作成する。
メニューの「ツール」->「Product Advertising API」
https://affiliate.amazon.co.jp/assoc_credentials/home
「認証キーの管理」の「新しい認証キーを取得する」
「移行の確認」ダイアログが出てきたら「続ける」
アクセスキーとシークレットキーが表示されるので控えておく
(シークレットキーは後で確認ができないので注意)
Product Advertising API Scratchpad
https://webservices.amazon.co.jp/paapi5/scratchpad/index.html
Amazonが提供してくれているPA-API Ver5の検証ツール。
左側にある「Select operation」にある4種類のAPIを確認できる。
- GetBrowseNodes
- GetVariations
- GetItems
- SearchItems
必要な情報を入力し、「Run Request」とするとAPIのレスポンスとともに、Java、PHP、curlのコードも生成してくれる。
GCP - Cloud Functions
旧バージョンではbottlenoseを使用していましたが、今回はAmazonが提供しているPython用のSDKをラップしたライブラリamightygirl.paapi5-python-sdkを使用しました。
requirements.txtに以下のコードを追加
amightygirl.paapi5-python-sdk == 1.0.0
main.pyの頭の方に以下のコードを追加し、以下の3つの定数にはここで作成したアクセスキーとシークレットキー、パートナータグ(トラッキングID)をそれぞれ設定する。
- PAAPI_ACCESS_KEY
- PAAPI_SECRET_KEY
- PAAPI_PARTNER_TAG
import paapi5_python_sdk
from paapi5_python_sdk.api.default_api import DefaultApi
from paapi5_python_sdk.search_items_request import SearchItemsRequest
from paapi5_python_sdk.search_items_resource import SearchItemsResource
from paapi5_python_sdk.partner_type import PartnerType
from paapi5_python_sdk.rest import ApiException
PAAPI_ACCESS_KEY = '<access-key>'
PAAPI_SECRET_KEY = '<secret-key>'
PAAPI_PARTNER_TAG = '<partner-tag>'
下のコードはキーワードを受け取ってPA-APIのSearchItemsを呼び出す関数のサンプル。main.pyに記述することになる。
ここではsearch_indexにHobbies、resourcesにSearchItemsResource.IMAGES_PRIMARY_MEDIUMを指定しているので、
「おもちゃカテゴリー内をkeywordで検索し、基本情報にプラスして中サイズの画像URLを取得する」仕様となっている。
def searchItems(keyword):
api = DefaultApi(
access_key=PAAPI_ACCESS_KEY, secret_key=PAAPI_SECRET_KEY, host='webservices.amazon.co.jp', region='us-west-2'
)
page = 1;
total_page = 0;
while True:
try:
search_items_request = SearchItemsRequest(
partner_tag=PAAPI_PARTNER_TAG,
partner_type=PartnerType.ASSOCIATES,
keywords=keyword,
search_index='Hobbies',
item_count=10,
resources=[SearchItemsResource.IMAGES_PRIMARY_MEDIUM],
)
except ValueError as exception:
print("Error in forming SearchItemsRequest: ", exception)
sys.exit(1)
try:
res = api.search_items(search_items_request)
if res.errors is not None:
print("\nPrinting Errors:\nPrinting First Error Object from list of Errors")
print("Error code", res.errors[0].code)
print("Error message", res.errors[0].message)
sys.exit(1)
if res.search_result is not None:
if page == 1:
total_page = (res.search_result.total_result_count // 10) + 1;
print('total_page', total_page)
for item in res.search_result.items:
# ここで取得した商品(item)毎に任意の処理を行う
# 例えばresourcesに設定した中サイズ画像のURLはitem.images.primary.medium.urlで参照できる
if page >= total_page: break
if page >= 10: break
page += 1
except ApiException as exception:
print("Error calling PA-API 5.0!")
print("Status code:", exception.status)
print("Errors :", exception.body)
print("Request ID:", exception.headers["x-amzn-RequestId"])
sys.exit(1)
except TypeError as exception:
print("TypeError :", exception)
sys.exit(1)
except ValueError as exception:
print("ValueError :", exception)
sys.exit(1)
except Exception as exception:
print("Exception :", exception)
sys.exit(1)
search_indexに設定できる値の一覧は
https://docs.aws.amazon.com/AWSECommerceService/latest/DG/LocaleJP.html
で確認できる
resourcesに設定する値は
https://webservices.amazon.com/paapi5/documentation/search-items.html#resources-parameter
で確認できるので、文字列の配列にして設定する。
上のサンプルのようにSDKのSearchItemsResourceの変数を使用する場合は、文字列の値を.(ドット)を_(アンダーバー)に置換し、全て大文字に変換にしたものが変数名になる。