Amazonへの商品情報取得APIが動かなくなった話 (原因:PA-API 売上不足の「TooManyRequestsException」)

久しぶりにシステムを使うとだめだねぇ〜
ちゃんと定期的に動作を確認しなきゃ
今回はAmazonアフィリエイトの売上がなくPA-APIへのアクセス権が剥奪されていたことが原因でした。
エラーメッセージはマギワらしく「TooManyRequestsException」が発生。

はじめに

今回は、「ツンデレ本管理システム」の管理側の書籍情報登録画面で発生しました。

いつものとおりに書籍新規登録からのバーコードスキャン…
はい、リクエストが返るはずだがうんともスンとも言いません;;

Console確認すると500エラーが発生していました。

GUIでの例外処理が入れていませんでしたw
自分用なのでしょうがないですが、これはだめだよ

早速、Amazonへの問い合わせをしているAPIの動作チェック…

[2022-02-14 07:01:18] local.DEBUG: AWSControllerService@getItems GetItemsRequest (  asin : 4798054488)  
[2022-02-14 07:01:18] local.DEBUG: [AWSApiService]@getitems try asin: 4798054488  
[2022-02-14 07:01:18] local.DEBUG: [AWSApiService] target : com.amazon.paapi5.v1.ProductAdvertisingAPIv1.GetItems  
[2022-02-14 07:01:18] local.DEBUG: [AWSApiService][cache] mode true  
[2022-02-14 07:01:18] local.DEBUG: [AWSApiService] connecting ... url : https://webservices.amazon.co.jp/paapi5/getitems payload : { "ItemIds": [  "4798054488" ], "Resources": [  "ItemInfo.Title" ], "PartnerTag": "******-22", "PartnerType": "Associates", "Marketplace": "www.amazon.co.jp"}  
[2022-02-14 07:01:19] local.DEBUG: [AWSApiService] connecting retry ... url : https://webservices.amazon.co.jp/paapi5/getitems payload : { "ItemIds": [  "4798054488" ], "Resources": [  "ItemInfo.Title" ], "PartnerTag": "*****-22", "PartnerType": "Associates", "Marketplace": "www.amazon.co.jp"}  

GetItems検索(Amazon内の一意キー(ASIN)での検索)を行っているが…
結果なくretryしているな…(リクエストが取れない場合は1回だけリトライしているようですw)
ってかリクエストの結果が保存されていないな…

SearchItems検索もNGですのでAmazon側の仕様が変わったかな?

「アソシエイト・リンク作成機能を廃止」の通知がアフィリエイトのページに表示されているのが気になった。
https://affiliate.amazon.co.jp/help/node/topic/G4WVNKFZTGPXW39F
機能廃止されているなら手動リクエストできないだろう…

手動リクエストはProduct Advertising API 5.0 Scratchpadでできるので、そちらで確認します。

Product Advertising API 5.0 Scratchpad : https://webservices.amazon.co.jp/paapi5/scratchpad

使い方は… 略…

GetItems検索を利用します
接続情報をCommon parameters(PartnerTagと認証キー周り)を設定します。
ItemIdsにASINキーを指定します。
Resources : ItemInfo.Title
[Run Request]にてリクエスト送信

「Error! TooManyRequests」 
HTTP Status: 429: Too Many Requests | Response Time: 163 ms | Request ID: ***-***-***

え!?久しぶりなのにToo Many Requests?

調べると…

TooManyRequestsException

Error Code: TooManyRequests
HTTP Status Code: 429 Too Many Requests

If the requests at which Product Advertising API 5.0 is being hit is too high, it will result in this exception.	The request was denied due to request throttling. Please verify the number of requests made per second to the Amazon Product Advertising API.

https://webservices.amazon.com/paapi5/documentation/troubleshooting/error-messages.html

う、うん、普通にリクエスト多いから切っちゃうよのメッセージですね…
開発テストでリクエスト多すぎたからかな…
でも、半年以上前だしな…

Amazonへの問い合わせ

Amazonへ問い合わせします。
私の場合は日本語のアフィリエイトを使っていますので、日本語の問い合わせフォームから送信しました。
広告収入とか表示されるページの問い合わせからしました。
※ PAAPIの上のconect usは.comのアカウント用です。こちらは使えません。

Amazonさん(日本語)に問い合わせると…

誠に申し訳ございませんが、PA-APIはシステム開発者などの専門的な知識を持つユーザー様向けのサービスとなっております。
このため、PAAPIはセルフサービスでのご利用を前提としており、不明点がある場合も、ユーザー様ご自身で解決をいただくことを前提に提供しております。
今回頂いたご質問についても、カスタマーサービスでのサポートは行っておりません。何卒ご容赦いただきますようお願いします。

う、うん…
とりあえず、技術的なことではなくアクセス頻度がどれくらいでロックされるのか!
と無理して問い合わせると…

念の為のご案内となりますが、「Too Many Requests」が表示される場合は、以下に該当していないか、確認をしてください。
-過去30日以内で売上実績があるか(過去30日売上がない場合、アクセス権はなくなります。この場合、PA-API以外のリンクで売上実績を獲得してください)
-ご利用のアソシエイト・プログラムアカウントで十分な売上があるか(売上が少なければ、リクエストできる回数も少なくなります)
また、上記に該当しない場合であっても、PA-APIは世界中から毎秒大量のリクエストを受信しております。
よって、リクエスト可能範囲内であっても、その時点での世界中からの同時アクセス数によってはリクエストを承れない場合があり、その場合も、「Too Many Requests」というメッセージが返ってきます。この点をご留意の上、PA-APIのご利用をお願いいたします。

ありがとう!

売上がないとアクセス権なくなるのか!
ってかエラーメッセージに出せよ;;

売上か…

ないねw

右の本の情報とかも広告なので、早速ポチってみましたw

ってか自分のアカウントでは紐付いているので売上にならない orz

タイミングよく?どこかの誰かさんがポチってくれて売上が入りました。ありがとう

数日後…

無事に動くようになりました!!

具体的なアクセス頻度

アクセス頻度をチェックしていたらこんな投稿を確認

初期リクエスト可能数 : 1日あたり 8,640リクエスト(API利用開始より60日間)
PA-APIより取得した商品リンクより発生した、過去30日間の発送済み商品売上$0.05(日本円で約5円)ごとに1リクエスト追加
1日の最大リクエスト可能数は、1日あたり864,000リクエスト
売上実績の発生がない場合は、PA-APIの利用開始はできません。

https://affiliate.amazon.co.jp/help/node/topic/GW65C7J2CSK7CA6C

終いに

今回学んだことは、PA-APIのリクエストは売上がないとアクセス権がなくなります…

売上、ワシには売上が必要なようです;;

あと売上があっても価格が安いだろうから、リクエストは大切にしなきゃ…

ついでに、以下の内容はシステム側の修正が必要ですね。
「GUI側の500番だったらアラートを表示する」
「リクエスト結果をログに出す」

おまけ

今回のGetItemsでのリクエストに一つバグを発見しました。
リクエスト出して結果をDBに格納するタイミングにおいて、
SearchItems結果を格納していましたが…
GetItemsだったら、集計で落ちていまいたw
なので、リクエストを解消してもExceptionでしたw
早速修正と合わせてリクエストの解析を追加しました
結構修正は大きかったです

技術的なメモとしては、リクエスト種別により結果のエレメント名が違いますねん

SearchItemsは

[2022-02-25 14:49:58] testing.DEBUG: [AWSApiService]@searchItems result: stdClass Object
(
    [SearchResult] => stdClass Object
        (
            [Items] => Array

GetItemsは

[2022-02-27 17:02:57] testing.DEBUG: [AWSApiService]@getitems result: stdClass Object
(
    [ItemsResult] => stdClass Object
        (
            [Items] => Array

JSONで返るエレメント名がSearchResultとItemsResultが違いますねん

そんだけぇ〜