AmazonのAPIを使ったサービスを運営しているのですが、これまでv4で運営していたところ、v4廃止のアナウンスがありましたので、v5への切り替えを行いました。初心者でもわかるような視点からv5の実装の方法を備忘録的に共有できたらと思います。
そもそもAPIとは?
API(Application Programming Interface)とは、ウェブやアプリの開発で広く使われている技術で、ウェブサービスに直接アクセスして情報を取得したり、特定の機能を利用したりするための仕組みです。例えば、Google Maps APIやAmazon Product Advertising API(PA API v5)などが有名です。
1. Amazon Product Advertising API (PA API v5) とは?
今回ご紹介するAmazon Product Advertising API(PA API v5)は、Amazonが提供する数億点以上の商品カタログから商品情報を取得するための仕組みです。このAPIを活用することで、オンラインショップやウェブサイトにAmazonの商品詳細、価格、レビュー、画像などの情報を簡単に埋め込むことができます。また、そのリンクを通じて購入された商品に対してインセンティブを得ることができる仕組みです。
2. Amazon Product Advertising API v5の使用準備
(1) Amazonアソシエイトプログラムへの参加
PA APIを利用するためには、まずAmazonアソシエイトプログラムに参加し、アフィリエイトアカウントを作成する必要があります。登録後、以下の情報を取得します。
- アクセスキーID(Access Key ID)
- シークレットアクセスキー(Secret Access Key)
- アソシエイトタグ(Associate Tag)
これらの情報は、APIにリクエストを送る際に必要となります。
(2) AWS(Amazon Web Services)アカウントの作成
PA APIはAWSのサービスを利用して動作するため、AWSアカウントを作成する必要があります。AWSコンソールにログインし、**IAM(Identity and Access Management)**を使用してAPIを利用するための「ユーザー」を作成し、適切な権限を付与します。
(3) PA API v5の設定
AWSコンソールでPA APIを有効化し、必要なアクセス権限を設定します。
3. 商品情報を取得するための基本的な手順
(1) リクエストURLの作成
Amazon PA API v5では、リクエストURLにパラメータを追加してAPIリクエストを作成します。例えば、特定の商品を検索する場合、以下のようなパラメータをURLに組み込みます。
リクエストURLの例(商品検索)
plaintextコピーするhttps://api.amazon.com/products?Keywords=search_term&ItemCount=10&Locale=jp&AssociateTag=your-associate-tag
Keywords
: 検索したい商品やキーワードItemCount
: 取得する商品数Locale
: 言語と国情報(日本の場合はjp
)AssociateTag
: 自分のアソシエイトタグ(アフィリエイトのリンクを追跡するため)
(2) リクエストを送信してレスポンスを取得
AmazonのPA APIにリクエストした結果は、JSON形式で返ってきます。JSONとは、JavaScript Object Notationの略で、データを扱う記述法の一つです。Web APIでの情報のやりとりでもよく使われる形式です。
試しにASINコード4061592998の商品情報を、リクエストしてみます。JSON形式で情報が返ってきて、中身を表示すると以下の情報が格納されています。
本のタイトル、著者、ジャンル、価格、画像のURL、アマゾンの詳細ページのURLなど、アマゾンのサーバーから送られてきた本に関するさまざまな情報が階層化されていることがわかります。
{
"ItemsResult": {
"Items": [
{
"ASIN": "4061592998",
"BrowseNodeInfo": {
"BrowseNodes": [
{
"Ancestor": {
"Ancestor": {
"Ancestor": {
"Ancestor": {
"ContextFreeName": "本",
"DisplayName": "本",
"Id": "465392"
},
"ContextFreeName": "ジャンル別",
"DisplayName": "ジャンル別",
"Id": "465610"
},
"ContextFreeName": "人文・思想",
"DisplayName": "人文・思想",
"Id": "571582"
},
"ContextFreeName": "本・図書館関連書籍",
"DisplayName": "本・図書館",
"Id": "500062"
},
"ContextFreeName": "読書法",
"DisplayName": "読書法",
"Id": "492114",
"IsRoot": false,
"SalesRank": 32
},
{
"Ancestor": {
"Ancestor": {
"Ancestor": {
"Ancestor": {
"ContextFreeName": "本",
"DisplayName": "本",
"Id": "465392"
},
"ContextFreeName": "ジャンル別",
"DisplayName": "ジャンル別",
"Id": "465610"
},
"ContextFreeName": "人文・思想",
"DisplayName": "人文・思想",
"Id": "571582"
},
"ContextFreeName": "本・図書館関連書籍",
"DisplayName": "本・図書館",
"Id": "500062"
},
"ContextFreeName": "図書館情報学",
"DisplayName": "図書館情報学",
"Id": "562894",
"IsRoot": false,
"SalesRank": 22
},
{
"Ancestor": {
"Ancestor": {
"ContextFreeName": "本",
"DisplayName": "本",
"Id": "465392"
},
"ContextFreeName": "ジャンル別",
"DisplayName": "ジャンル別",
"Id": "465610"
},
"ContextFreeName": "ノンフィクション",
"DisplayName": "ノンフィクション",
"Id": "492152",
"IsRoot": false
},
{
"Ancestor": {
"Ancestor": {
"Ancestor": {
"ContextFreeName": "本",
"DisplayName": "本",
"Id": "465392"
},
"ContextFreeName": "By Publishers",
"DisplayName": "By Publishers",
"Id": "465614"
},
"ContextFreeName": "講談社",
"DisplayName": "講談社",
"Id": "10805001"
},
"ContextFreeName": "全書籍",
"DisplayName": "全書籍",
"Id": "316850011",
"IsRoot": false
},
{
"Ancestor": {
"ContextFreeName": "本",
"DisplayName": "本",
"Id": "465392"
},
"ContextFreeName": "Featured Categories",
"DisplayName": "Featured Categories",
"Id": "202188011",
"IsRoot": false
}
],
"WebsiteSalesRank": {
"ContextFreeName": "本",
"DisplayName": "本",
"SalesRank": 10912
}
},
"DetailPageURL": "https://www.amazon.co.jp/dp/4061592998?linkCode=ogi&th=1&psc=1",
"Images": {
"Primary": {
"Large": {
"Height": 500,
"URL": "https://m.media-amazon.com/images/I/410JJdO3KvL.jpg",
"Width": 352
},
"Medium": {
"Height": 160,
"URL": "https://m.media-amazon.com/images/I/410JJdO3KvL._SL160_.jpg",
"Width": 113
},
"Small": {
"Height": 75,
"URL": "https://m.media-amazon.com/images/I/410JJdO3KvL._SL75_.jpg",
"Width": 53
}
},
"Variants": [
{
"Large": {
"Height": 500,
"URL": "https://m.media-amazon.com/images/I/41yh0Qwv+iL.jpg",
"Width": 348
},
"Medium": {
"Height": 160,
"URL": "https://m.media-amazon.com/images/I/41yh0Qwv+iL._SL160_.jpg",
"Width": 111
},
"Small": {
"Height": 75,
"URL": "https://m.media-amazon.com/images/I/41yh0Qwv+iL._SL75_.jpg",
"Width": 52
}
}
]
},
"ItemInfo": {
"ByLineInfo": {
"Brand": {
"DisplayValue": "講談社",
"Label": "Brand",
"Locale": "ja_JP"
},
"Contributors": [
{
"Locale": "ja_JP",
"Name": "J・モーティマー・アドラー",
"Role": "著",
"RoleType": "author"
},
{
"Locale": "ja_JP",
"Name": "V・チャールズ・ドーレン",
"Role": "著",
"RoleType": "author"
},
{
"Locale": "ja_JP",
"Name": "外山 滋比古",
"Role": "翻訳",
"RoleType": "translator"
},
{
"Locale": "ja_JP",
"Name": "槇 未知子",
"Role": "翻訳",
"RoleType": "translator"
}
],
"Manufacturer": {
"DisplayValue": "講談社",
"Label": "Manufacturer",
"Locale": "ja_JP"
}
},
"Classifications": {
"Binding": {
"DisplayValue": "文庫",
"Label": "Binding",
"Locale": "ja_JP"
},
"ProductGroup": {
"DisplayValue": "Book",
"Label": "ProductGroup",
"Locale": "ja_JP"
}
},
"ContentInfo": {
"Languages": {
"DisplayValues": [
{
"DisplayValue": "日本語",
"Type": "発行済み"
}
],
"Label": "Language",
"Locale": "ja_JP"
},
"PagesCount": {
"DisplayValue": 266,
"Label": "NumberOfPages",
"Locale": "en_US"
},
"PublicationDate": {
"DisplayValue": "1997-10-09T00:00:01Z",
"Label": "PublicationDate",
"Locale": "en_US"
}
},
"ExternalIds": {
"EANs": {
"DisplayValues": [
"9784061592995"
],
"Label": "EAN",
"Locale": "en_US"
},
"ISBNs": {
"DisplayValues": [
"4061592998",
"9784061592995"
],
"Label": "ISBN",
"Locale": "en_US"
}
},
"ProductInfo": {
"IsAdultProduct": {
"DisplayValue": false,
"Label": "IsAdultProduct",
"Locale": "en_US"
},
"ItemDimensions": {
"Weight": {
"DisplayValue": 0.31085178942,
"Label": "Weight",
"Locale": "ja_JP",
"Unit": "ポンド"
}
},
"UnitCount": {
"DisplayValue": 1,
"Label": "NumberOfItems",
"Locale": "en_US"
}
},
"Title": {
"DisplayValue": "本を読む本 (講談社学術文庫)",
"Label": "Title",
"Locale": "ja_JP"
}
},
"Offers": {
"Listings": [
{
"Availability": {
"Message": "一時的に在庫切れ; 入荷時期は未定です。注文確定後、入荷時期が確定次第、お届け予定日をEメールでお知らせします。万が一、入荷できないことが判明した場合、やむを得ず、ご注文をキャンセルさせていただくことがあります。商品の代金は発送時に請求いたします。",
"MinOrderQuantity": 1,
"Type": "Now"
},
"Condition": {
"SubCondition": {
"Value": "New"
},
"Value": "New"
},
"DeliveryInfo": {
"IsAmazonFulfilled": true,
"IsFreeShippingEligible": true,
"IsPrimeEligible": true
},
"Id": "",
"IsBuyBoxWinner": true,
"LoyaltyPoints": {
"Points": 20
},
"MerchantInfo": {
"Id": "AN1VRQENFRJN5",
"Name": "Amazon.co.jp"
},
"Price": {
"Amount": 1177,
"Currency": "JPY",
"DisplayAmount": "¥1,177"
},
"ProgramEligibility": {
"IsPrimeExclusive": false,
"IsPrimePantry": false
},
"ViolatesMAP": false
}
],
"Summaries": [
{
"Condition": {
"Value": "New"
},
"HighestPrice": {
"Amount": 4760,
"Currency": "JPY",
"DisplayAmount": "¥4,760"
},
"LowestPrice": {
"Amount": 1177,
"Currency": "JPY",
"DisplayAmount": "¥1,177"
},
"OfferCount": 3
},
{
"Condition": {
"Value": "Used"
},
"HighestPrice": {
"Amount": 12600,
"Currency": "JPY",
"DisplayAmount": "¥12,600"
},
"LowestPrice": {
"Amount": 355,
"Currency": "JPY",
"DisplayAmount": "¥355"
},
"OfferCount": 44
}
]
}
}
]
}
}
PA API v5のjsonを処理する
上記のJSONの形式の情報を、PHPの関数であるjson_decodeで処理をします。
$obj = json_decode( $response , false ) ;
json_decodeしたあとは、本のタイトルは$booktitleへ、著者名は$authorへ、といった具合に情報を細分化し、用意した任意の変数にそれぞれ格納します。
具体的にコードを記述してみましょう。
echo $obj->ItemsResult->Items[0]->ItemInfo->Title->DisplayValue ;
echo $obj->ItemsResult->Items[0]->ItemInfo->ByLineInfo->Contributors[0]->Name ;
echo $obj->ItemsResult->Items[0]->DetailPageURL ;
echo $obj->ItemsResult->Items[0]->Images->Primary->Medium->URL ;
ここでは、タイトル、著者、詳細ページURL、表紙イメージなどの情報を変数に格納しています。これを実行すると、ブラウザ上に取得した情報が表示されます。