アフィリエイト広告を利用しています

HugoでAmazonアソシエイトの画像リンクをProduct Advertising API(PA-API)を使って作成しました

Twitterでも書いていた通り、2024年1月1日からAmazonアソシエイトの画像リンクが利用出来なくなっていました。

今回はProduct Advertising API(PA-API)を使ってHugoのブログで画像リンクを作成出来るようにしたので、方法を紹介したいと思います。

前提

AmazonアソシエイトでPA-APIを利用する場合、過去30日以内に発送済み売上商品が発生している必要があります。
2019/01/23 - Product Advertising API 利用ポリシーの変更について

自分はなんとか😅この状態にして、アソシエイトのレポートで発送済み商品が計上されてから一日過ぎたぐらいにPA-APIがリクエストできる状態になりました。 PA-APIのAPI TokenはAmazonアソシエイトのサイトから発行することが出来ます。
AWSのAPI Tokenでも実行出来るような記述も見かけたので試そうと思ったのですが、アソシエイトのユーザーを追加してAmazon.co.jpのアカウントと紐づけることが必要そうだったのでやめました。

Amazonのアカウントってメールアドレス再利用出来ないと思っていたのですが、今は出来るっぽい🤔
Amazonのアカウント閉鎖(削除)後に再度同じメールアドレスでアカウント作成する方法

この確認だけで同じメールアドレスが利用出来なくなるAmazonアカウント作るのもなと思ったのですが、試してみるのも手ですね。(が、どのみちAmazonアソシエイトのアカウントに紐づくのでアソシエイトの30日間の発送済み商品がああるかは参照して制限されそうですが…)

PA-APIのSDKのセットアップ

PA-APIのSDKは以下で公開されています。
https://webservices.amazon.com/paapi5/documentation/quick-start/using-sdk.html

なんとなくHugoがGolangなのでgoのSDKがないかな~と思いましたが、公式のGolangのSDKは無さそうで、開発されている方はいました。
https://github.com/goark/pa-api

PA-APIのOpenAPIがあれば、NSX-T APIをswagger-codegenでSDK(Python)から実行してみた の記事の様に、SDK作成出来るかなーと思いましたが公開はされていないようでした。 とりあえず今回はPythonのSDKでリクエストしてみます。
以下環境はFreeBSDです。

fetch https://webservices.amazon.com/paapi5/documentation/assets/archives/paapi5-python-sdk-example.zip
unzip paapi5-python-sdk-example.zip
cd paapi5-python-sdk-example
python3.9 setup.py install

PA-APIの実行

PythonのSDKがインストール出来たら、SDKに付随しているsample scriptがあるのでこちらを実行してみます。 PA-API自体はアソシエイトのフッターにリンクされている、Scratchpadからブラウザ上で実行出来ます。(が、なぜかCode snippetsにPythonだけ無い😇)
今回画像リンクを生成するため、 GetItemsを実行するsample_get_items_api.pyのサンプルscriptを実行してみます。
script内のaccess_key, secret_key, partner_tag, item_idsあたりを自分の環境に合わせて変更すれば、PA-APIのGetItemsを実行出来ます。

私はsample scriptを元にこんな感じでscriptを書きました。

from paapi5_python_sdk.api.default_api import DefaultApi
from paapi5_python_sdk.models.condition import Condition
from paapi5_python_sdk.models.get_items_request import GetItemsRequest
from paapi5_python_sdk.models.get_items_resource import GetItemsResource
from paapi5_python_sdk.models.partner_type import PartnerType
from paapi5_python_sdk.rest import ApiException
import json
import argparse

def get_items(ak, sk, asin):
    """ Following are your credentials """
    """ Please add your access key here """
    access_key = ak

    """ Please add your secret key here """
    secret_key = sk

    """ Please add your partner tag (store/tracking id) here """
    partner_tag = "webprog-22"

    """ PAAPI host and region to which you want to send request """
    """ For more details refer: https://webservices.amazon.com/paapi5/documentation/common-request-parameters.html#host-and-region"""
    host = "webservices.amazon.co.jp"
    region = "us-west-2"

    """ API declaration """
    default_api = DefaultApi(
        access_key=access_key, secret_key=secret_key, host=host, region=region
    )

    """ Request initialization"""

    """ Choose item id(s) """
    item_ids = asin.split(",")

    """ Choose resources you want from GetItemsResource enum """
    """ For more details, refer: https://webservices.amazon.com/paapi5/documentation/get-items.html#resources-parameter """
    get_items_resource = [
        GetItemsResource.ITEMINFO_TITLE,
        GetItemsResource.OFFERS_LISTINGS_PRICE,
        GetItemsResource.IMAGES_PRIMARY_SMALL,
        GetItemsResource.IMAGES_PRIMARY_MEDIUM,
        GetItemsResource.IMAGES_PRIMARY_LARGE
    ]

    """ Forming request """

    try:
        get_items_request = GetItemsRequest(
            partner_tag=partner_tag,
            partner_type=PartnerType.ASSOCIATES,
            marketplace="www.amazon.co.jp",
            condition=Condition.NEW,
            item_ids=item_ids,
            resources=get_items_resource,
        )
    except ValueError as exception:
        print("Error in forming GetItemsRequest: ", exception)
        return
    try:
        """ Sending request """
        response = default_api.get_items(get_items_request)

        print("API called Successfully")
        print("Complete Response:", response)
    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"])

    except TypeError as exception:
        print("TypeError :", exception)

    except ValueError as exception:
        print("ValueError :", exception)

    except Exception as exception:
        print("Exception :", exception)

    with open(asin + ".json",'w') as f:
      json.dump(response.to_dict(),f, indent=2)

parser = argparse.ArgumentParser()
parser.add_argument('-a','--accesskey', required=True)
parser.add_argument('-s','--secretkey', required=True)
parser.add_argument('--asin', required=True)
args = parser.parse_args()
get_items(args.accesskey, args.secretkey, args.asin)

こんな感じで使えます。

python3.9 get_item.py -a $ACCESSKEY -s $SECRETKEY --asin B018GUTE1G,B0CM8QNBB5,B0CH9TK2L8

複数の商品をまとめてasinで,区切りで実行すれば、B018GUTE1G,B0CM8QNBB5,B0CH9TK2L8.jsonのファイル名でPA-APIのレスポンスをjsonで保存します。
tagはハードコードしているので適宜書きかえる必要があるのと、Scratchpadからリクエストしてみると分かるのですが、hostをwebservices.amazon.co.jpにリクエストする場合にはregionがus-west-2なのが注意ポイントです。(sample script内のコメントのリンク先にちゃんと書いてありましたね😅)

Hugoでの利用

PA-APIで取得したjsonをHugoのshortcodeで表示してみます。
こんな感じでshortcodeを作成しました。
PA-APIで取得したjsonファイルをdata/amazon/配下に置くことを前提としています。

{{- $tag := .Site.Params.amazonJpAffiliate }}
{{- $file := .Get "file" -}}
{{- $size := .Get "size" -}}
{{- $asin := "" -}}
{{- $img_url := ""  -}}
{{- if  $file -}}
  {{ range (index $.Site.Data.amazon $file).items_result.items }}
    {{- $asin = .asin -}}
    {{- $img_url = (index .images.primary $size).url -}}
    {{- $title = .item_info.title.display_value -}}
  <div class="amazon-widget">
    <a href="https://www.amazon.co.jp/gp/product/{{ $asin }}/?tag={{ $tag }}">
    <div class="amazon-widget-img">
      <img src="{{ $img_url }}" />
    </div>
    <div class="amazon-widget-info">
      <span class="amazon-widget-title">
        {{ $title }}
      </span>
      <span class="amazon-widget-via">
        <img src="https://www.amazon.co.jp/favicon.ico" />
        amazon.co.jp
      </span>
    </div>
    </a>
  </div>
  {{- end -}}
{{- end -}}

以下の様にshortcodeで表示する事が出来ます。

{{< amazon file="B018GUTE1G,B0CM8QNBB5,B0CH9TK2L8" size="large" >}}

実際の表示例

最近Twitterで話題になっている商品を表示してみます。

上から先日クーポンで1万円を切っていたINNOCNのモバイルモニター(INNOCNというメーカーを初めて知ったのですが、良さそうだったものの買いそびれた😂)、その次が別のメーカーの商品になりますがクーポンで1万円以下で購入出来る(記事執筆時点)商品です。
B018GUTE1GのAmazonコインは以下レスポンスでPA-APIから取得出来ませんでした。

  "errors": [
    {
      "code": "ItemNotAccessible",
      "message": "The ItemId B018GUTE1G is not accessible through the Product Advertising API."
    }
  ],

アソシエイトツールバーで確認してみると紹介不可の商品になっていたので、上記APIレスポンスになるようです。

この商品はアソシエイト・プログラムでの紹介不可となっている商品のため、リンクの作成ができません。

ちなみになぜAmazonコインが話題なのかというと、サービス終了に伴い返金対応になるようです。
(詳細はTwitterで「Amazonコイン」で検索してみてください。)

まとめ

今回PA-APIでAmazonアソシエイトの画像リンクをjsonで取得し、取得したjsonをHugoのshortcodeで表示する方法を紹介しました。Data templatesでDataファイルを元にHugoでbuildするたびに最新化、動的なWebサイトが作成出来るので便利ですね😆
またこのブログに掲載しているAmazonアソシエイトリンク経由で商品を購入して頂いた方がいらっしゃいました。ドメイン費用や自宅サーバ代がかかっているので助かります😭この場でお礼いたします🙇‍♂️
この記事が参考になれば幸いです。

Share Comments こ>のエントリーをはてなブックマークに追加
comments powered by Disqus