2019年9月9日に実装が発表された「Amazon Product Advertising API 5.0」に関して、最低限の対応の目処がつきましたのでお知らせ致します。
もくじ
Amazon Product Advertising APIとは?
Amazon Product Advertising API(以下、PA-API)と言っても、当サイトを利用して頂いている方にとっては「なんのこっちゃ?」と言う感じだと思うので軽く説明を。
簡単に言うと「Amazonが提供する、Amazon以外のサイトで、Amazonの商品情報の検索結果や商品情報のデータを取得して表示出来る仕組み」だと思って下さい。
例えば、うちのブログでは…
このような表示を実装するのに使用されています。
この(↑)表示はWordPressの無料テーマ「Cocoon」が実装している機能なので、当サイトで調整する必要はないのですが…。
うちのメインコンテンツである「お酒の価格比較サイト 酒楽-SAKERAKU-」では、このPA-APIをガッツリと使用して価格比較情報を表示しているので現在対応中。
取り敢えず、2019年11月30日までに最低限のPA-APIv5対応を行わないとAmazonに出品されている商品情報が全く取得できない状態に陥るため、まずはPA-APIv5対応を最優先で行っております。
この対応中に発生している問題点は以下の通り。
■Amazonの商品が価格比較情報に表示されにくくなっている。
PA-APIv5の実装に伴ってAmazon.co.jpのデータベースや検索エンジンにも何らかの変更があったのか?
2019年9月3日頃から「これまで設定していた検索ワードでは狙った検索結果が返って来なくなった」と言う不具合が発生しています。
これを解消するには5000アイテム近くの検索ワードを再設定しないのですが、取り急ぎ期限が設定されているPA-APIv5対応をまずは行わなければいけないのが現状です。
ですので、優先順位としてキーワード調整は最終段階の対応となります。
よって「Amazonで出品されている商品が表示されない可能性が高い」と言う不具合が2019年9月14日現在において継続して発生している事をご理解頂ければ幸いです。
以前から「Amazon.co.jp(特に「お酒」カテゴリ)」では、普通に思いつく検索ワードでの絞り込み検索が出来ない状態・難しい状態でしたが、2019年9月3日以降は更に絞り込みが難しい状態になっています。
何かしら、絞り込める方法は無いか施行は行ってまいりますが、PA-APIv5の対応後もまともにAmazonの検索エンジンが機能しない可能性も…。
取り敢えず、新システムのPA-APIv5の最低限の対応には目処が立ちましたので、まずは最低限の運用が出来るように当サイト側のシステムを準備をして、検索用キーワードの再設定を行っていきますので今しばらくお待ち下さい。
私が「Amazon Product Advertising API 5.0」で行っている対応について
さて、ここからはおまけです。
PA-APIv5に関する情報を検索エンジンで探してたどり着かれた方のために、PA-APIv5対応で私が何を行っているかを記載しておこうと思います。
ただ、私はプロではなく、検索した情報を元にPHPを何となく組んでいるだけなの「なんちゃって日曜プログラマー(と言うのもおこがましい)」なので、有用な情報は少ないと思いますが参考程度に。
その1|テーマの機能やプラグインでPA-APIを利用している方向け
多分、PA-APIv5への移行でわちゃわちゃしているのはテーマの機能やプラグインを利用するためにPA-APIのアクセスキーとシークレットキーを取得している方だと思います。
テーマの機能やプラグインでPA-APIを利用している方は特に何もしなくても問題有りません。
テーマの機能やプラグインが対応するのを待って下さい。
最近のアップデート情報を見て対応の可能性が無いと感じているなら、ブログのテーマや他のプラグインを探しておくのも良いかも知れません。
ただ、一つだけ注意点が。
移行ガイドなどを読んでいれば、既に知っていると思いますが…。
PA-APIv5以降では「過去にAWSで発行したAWS認証キー」は使えなくなりますので注意して下さい。
PA-APIがAWSでサービスの提供を行われていた時代を知らない方にとっては「AWS認証キーってなんじゃ!?」「何を指してAWS認証キーって言ってるの!?」と思われる方も居ると思いますので一応解説しておきますね。
現在、PA-APIのアクセスキー・シークレットキーは、Amazonアソシエイトの「ツール→Amazon Product Advertising API→認証キーの管理」で取得出来るのはご存知でしょう。
Amazonアソシエイトでアクセスキー・シークレットキーを取得している方にはそのままでOK。
その昔「PA-API」は「Amazon Web Service」で配信されていたんですね。
知らない方も居るかも知れませんが「Amazon Web Service」って言うとストレージやらデータベースやらIOTのAPIを配信しているアレです。
現在、AmazonアソシエイトでPA-APIの認証キーの取得が行えるので、AWSで認証キーを発行している人は少ないと思いますが、Amazonアソシエイトの「認証キーの管理」で認証キーを取得していないと言う方はAmazonアソシエイトにて認証キーを取得して下さい。
もし、「分からない!」とか「不安だ!」と言う方は、Amazonアソシエイトの「ツール→Amazon Product Advertising API→認証キーの管理」から新たに認証キーを取得して、取得した認証キーを設定しておけば良いでしょう。
Amazonアソシエイトも「アクセスキーは90日ごとに変更することを推奨しております。」と言ってますからね。
その2|なんやかんやと開発してる方向け
正直、コピペプログラミングな私でもスクラッチパッドをイジってれば、ある程度は理解出来たので書く必要が有るのか…。
どっちかと言うと教えて頂きたいくらいです…。
取り敢えず、私が行った事と言うと「スクラッチパッドで設定の出来る項目は全部設定してどんな情報が取得できるのかを確認」→「スクラッチパッドで出力されるサンプルを自分の組んだシステムに合うように分割してコピペ」→「取得したJSONをPHPのforeachで回して自分のサイトで必要な変数に代入」くらいです。
で、終わってしまっては情報としてあまりにも薄いのでPA-APIv5をスクラッチパッドなどを触っていて気がついた点をまとめていこうと思います。
1.「SearchItems」でカテゴリー指定する際のカテゴリー名が変わってる。
うちのサイトの様にジャンルを絞り込んでいる場合には「ALL」ではなくカテゴリーを設定して「SearchItems」で検索をかける方も多いと思います。
試しにスクラッチパッドで「SearchItems」を試した方はお気づきでしょうが、カテゴリー名が変わっていますね。
例えばうちの場合だと、カテゴリー名「Grocery」で検索をしていましたが「GroceryAndGourmetFood」に変更されています。
詳しくは「Locale Information for JP > Marketplace Search Index」に掲載されているので、カテゴリを指定して検索していた方は確認が必要かも知れません。
また、サブカテゴリのノードID(数字)も一応確認しておいた方が良いかも知れません。
サブカテゴリに関しては、私が指定していた範囲では変更が無いように感じましたが、さらに細かく指定されている部分が増えていたので再確認する事でより絞った検索が出来るかも知れません。
ただ、カテゴリを絞ってても初心者の分かってないマーチャントがワケの分からない所にカタログを作ったりする場合が有るからレンジを広くとってしまいがちなんですけどね…。
2.「MaxPrice」「MinPrice」は小数点第二位まで考えて指定しなくてはならない。
USDならセントが普通に使われているので何となくイメージ出来るけど、JPYでは普段は銭とか使わないから意識しませんよね。
ただ、Amazon.co.jpを使っている時に「¥2,350(1本/97.91円)」と言う表示を見た事が有るのではないでしょうか。
これは、日本円を前提とした「MaxPrice」「MinPrice」の設定でも有効です。
リファレンスやスクラッチパッドで「MaxPrice」「MinPrice」を設定した際の注意書きで書かれている「3241 is $32.41」の部分を日本円で表現するなら「Amazon.co.jpでは「9791」は「97.91円」です。」と言う事になります。
もし、取得するデータに「MaxPrice」「MinPrice」で最低価格や最高価格を設定したい場合、「9000円」を下限や上限に設定するなら「MaxPrice」「MinPrice」に設定する値は「900000」に設定しないといけません。
この設定を理解していなくて、SearchItemsでキーワードに「アサヒ スーパードライ 350ml 24」を、「MaxPrice」に「10000円」のつもりで「10000」を設定してエラーが返ってきて「なんじゃこりゃ!?「MaxPrice」が機能してねーじゃねーか!!」と思っていた時期が私にもありました…。
少し考えれば分かったのかも知れませんが、「MaxPrice」で「10000」と設定したら「100円」とAPI側は認識してるので、当然「上限100円のスーパードライは無いぜよ!」とエラーが返ってくるワケです。
皆さんも「MaxPrice」「MinPrice」を使う場合には指定したい金額に「00」を付け加えて下さい…。
3.「SearchItems」だけではバリエーション情報が取得出来なくなった!
新機能!GetVariations!!ババーン!!!!
と、「What’s new in PA-API 5.0 Guide」やら「API Reference」やらを読んでたら、バリエーション情報は別途「GetVariations」で取得しないといけなくなったと解説されているのでご存知だと思います。
え?ダウングレードかな?
ただでさえ、Amazon.co.jpの検索エンジンは検索精度が低くて、半角マイナスで排除検索をしても、SearchItemsで目的の商品に辿り着けない事が多々あるのにね。
同じ親にぶら下がってるカタログの、欲しいサイズじゃない商品が検索結果に出力されているのに、バリエーションを別途で取得しないといけないとか正気だろうか…。
情報を取得して、if文でASINを元にGetVariationsして、バリエーションが有ったら欲しいサイズが有るのかをmb_stristr辺りで確認して、欲しいサイズが有ればforeachで回して自分のサイトで必要な変数に代入すればいいのだろうけど…。
2019年の1月に初期リクエスト可能数を1日あたり8640リクエストに制限したのはどちらさまだっけ…。
バリエーションを取得しようとするとGetVariationsの分だけリクエスト数を消費すると言う…。
一応、通常のSearchItems対応が落ち着いてからSearchItemsとGetVariationsの組み合わせは試してみようと思いますが、リクエスト数がもったいない気がします。
ぶっちゃけ、今回のPA-APIv5へのアップデートはAmazonのコストを下げるための更新な気がしてならないですね…。
4.JSONをPHPでforeachすると一定の深度で値を取得出来なくなったけど、そこからforeachすると取得できなかった値が取得出来た件
JavaScriptとか苦手なんですよね…。
もっと触れば理解出来そうな気がするけど、結構適当でも動いちゃうPHPが好き…。
なので、JSONとかも触った事がなかったんですけど、多分こういうモノなんでしょうね。
うん。私のJSONの展開の仕方とか、なんか余計な事をしていてスマートにforeachが行えてない可能性もありますけど。
ここで詰まって結構な時間を無駄にしたのでメモとして掲載しておきます。
$jsonforeach = json_decode($amazonjson, true);
foreach($jsonforeach['SearchResult']['Items'] as $i => $arrayjsonforeach){
//▼ASIN(浅い場所にあるデータを代入)
$temp[$i]['ASIN'] = (string)$arrayjsonforeach['ASIN'];
//▼商品タイトル(ここまでは階層順に指定していけば代入できた)
$temp[$i]['Title'] = (string)$arrayjsonforeach['ItemInfo']['Title']['DisplayValue'];
//▼商品価格(ここでは代入できなかった)
$temp[$i]['PRICE'] = (string)$arrayjsonforeach['Offers']['Listings']['Price']['Amount'];
//▼商品価格(多分、この処理で深い位置に有るデータも取り出せる)
//価格情報の事前処理
foreach($arrayjsonforeach['Offers']['Listings'] as $arrayjsonPrice){
$arrayjsonPrice_in = $arrayjsonPrice['Price']['Amount'];
}
//処理した商品価格を代入
$temp[$i]['PRICE'] = (string)$arrayjsonPrice_in;
}
$ItemArray[] = $temp;
こうすればもっとスマートに書けるよ!と教えて頂ける方が居れば教えてもらえると嬉しいです…orz
と、言うか階層順に重ねて行ってデータを取り出せないのがよくわかんない…。
->{‘Offers’}->とかで指定してみたけど、どうして上手くいかなかったのもよく分かってません。
JSONをforeachで回す際の注意点とか分かりやすく解説されてるページとかあったら教えて頂けると嬉しいです…。
まとめ
取り敢えず、当サイトとしてはPA-APIv5に対応をして最低限の表示が出来るようにすると言うのが当面の目標です。
ただ、旧オペレーションの「ItemSearch」でも検索挙動がおかしかったのですが、新しくなった「SearchItems」では更に挙動がおかしくなっている気がします。
これまで通り、ある程度の精度で価格比較情報を表示出来るかは難しいかも知れません。
当サイトで表示させている「ジャンル:お酒関連」で感じた実感ですが、新しくなった「SearchItems」では、半角マイナスで排除検索をすると排除の為に設定したキーワードを含む商品だけが残ったり、「アサヒ スーパードライ 350ml 24」で検索して「アサヒ スーパードライ 350ml 24」以外の容量や本数の商品が多数引っかかったりと検索キーワードを工夫するだけではどうにもならなくなってきています。
先の項目の「気がついた点」では書きませんでしたが、ソート順を「関連性(Relevance)」から「安い順(Price:LowToHigh)」にすると「アサヒ スーパードライ 350ml 24」で検索して「スーパードライ」もしくは関連商品の「350ml×6本」の商品が多数ヒットする上に、半角マイナス(-350ml×6本)で排除検索すると「アサヒ スーパードライ 350ml 24本」の商品情報まで排除されてしまうと言う有様。
この現象は「タグ」や「検索ヒット用のキーワード」などで無関係なワードが設定されていて検索阻害が行われている可能性も高いようにも思えます。
これが、検索エンジンがローカライズしきれておらずに日本語がちゃんと処理されていないからなのか(少なくとも日本語ローカライズが出来てないのではと思う挙動は有る)、データベースに登録されているタグなどに無駄な情報が設定されていて巻き込まれるカタチで、半角マイナスで排除検索した際に必要な商品情報も排除されてしまっているのか…。
対策をAmazon.co.jpの中の人に聞いても教えてくれませんし、要望を出してもあまり効果が無いのでどうにもできない状態です。
出来るだけの事はしますが、Amazon.co.jpに関しては情報精度を求めるには限界が有るかも知れません。
ここをご覧になったPA-APIを利用して何かを開発しようとしている方も、ASINを利用してカエレバやCocoonの機能のような特定の商品を表示する仕組みや、ざっくりとした商品情報を取得して表示するサービスを目指した方が良いかも知れません。
情報精度をPA-APIで求めるのは難しくなってきている気がします。
取り敢えず、当サイトでは最低限の情報表示から行い、商品情報の精度を上げて行こうとは考えています。
どこまで出来るか分かりませんが「商品購入の際の参考にして下さい」と言える程度まで精度を上げられると嬉しいのですが…。
今の所、そう言えるほどの精度が得られるか自信が有りません。
継続して当サイトを利用して下さっている方がいらっしゃるなら長い目で見て頂ければ幸いです。