質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

5114閲覧

Amazon APIから商品情報を10件以上取得する方法

tuckQ

総合スコア64

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/01/02 09:48

###前提・実現したいこと

  • Amazon Product Advertising APIにリクエストを送信して商品情報を取得
  • 検索結果を10ページ分(100件)まで表示したい

※下記API仕様に準拠することが前提
Product Advertising API
開発者ガイド (API Version 2010-09-01)「結果をページ単位で表示する」

ヒントなど頂ければ幸いです。

###試したこと
下記コードでItemPageパラメータに指定したページの結果10件を表示するところまではできた。

1回のリクエストで10ページ分(100件)のデータを表示させるためには、
$params["ItemPage"] = "1";の値を1から10までインクリメントして処理できればよいのかな?
と推測しているのですが、どう実装すればよいか分からず困っております。

###該当のソースコード

php

1$baseurl = "https://webservices.amazon.co.jp/onca/xml"; 2 3// リクエストのパラメータ作成 4$params = array(); 5$params["Service"] = "AWSECommerceService"; 6$params["AWSAccessKeyId"] = Access_Key_ID; 7$params["Version"] = "2013-08-01"; 8$params["Operation"] = "ItemSearch"; 9$params["SearchIndex"] = $SearchIndex; 10$params["Keywords"] = $Keywords; 11$params["AssociateTag"] = Associate_tag; 12$params["ResponseGroup"] = "ItemAttributes,Offers, Images"; 13$params["MinimumPrice"] = "100"; 14$params["ItemPage"] = "1"; 15 16 17$base_request = ""; 18foreach ($params as $k => $v) { $base_request .= "&" . $k . "=" . $v; } 19$base_request = $baseurl . "?" . substr($base_request, 1); 20 21$params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z"); 22$base_request .= "&Timestamp=" . $params['Timestamp']; 23 24$base_request = ""; 25foreach ($params as $k => $v) { 26 $base_request .= '&' . $k . '=' . rawurlencode($v); 27 $params[$k] = rawurlencode($v); 28} 29$base_request = $baseurl . "?" . substr($base_request, 1); 30 31$base_request = preg_replace("/.*\?/", "", $base_request); 32$base_request = str_replace("&", "\n", $base_request); 33 34ksort($params); 35$base_request = ""; 36foreach ($params as $k => $v) { $base_request .= "&" . $k . "=" . $v; } 37$base_request = substr($base_request, 1); 38$base_request = str_replace("&", "\n", $base_request); 39 40$base_request = str_replace("\n", "&", $base_request); 41 42$parsed_url = parse_url($baseurl); 43$base_request = "GET\n" . $parsed_url['host'] . "\n" . $parsed_url['path'] . "\n" . $base_request; 44 45$signature = base64_encode(hash_hmac('sha256', $base_request, Secret_Access_Key, true)); 46$signature = rawurlencode($signature); 47 48$base_request = ""; 49foreach ($params as $k => $v) { $base_request .= "&" . $k . "=" . $v; } 50$base_request = $baseurl . "?" . substr($base_request, 1) . "&Signature=" . $signature;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ItemSearch
のページを読むと、最大10件と明記されています。

したがって、予想されている通り、例として記述されたコードをclass化またはfunctionにして10回ループ処理するしかなさそうですが、

アプリケーションのトラブルシューティング
のページでは、

引用テキストアプリケーションで、IPアドレスあたり1秒間に1回以上のリクエストを送信している場合、リクエストの送信回数を減らさないと、Product Advertising API からエラーメッセージが返されることがあります。

とあります。
よって、安全な設計を行うなら最低でも表示までに10秒以上かかることになります。

これを回避するには、データベースなどに情報を登録しておき、それを表示するしかないと思います。

投稿2017/01/19 02:32

編集2017/01/19 02:48
namimon

総合スコア726

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namimon

2017/01/19 02:49

ありがとうございます。修正しました。
tuckQ

2017/01/22 14:33

namimonさんアドバイスありがとうございます。DBへのデータ保存も必要になりそうなんですね。やり方考えてみます!
tuckQ

2017/01/22 14:33

KiyoshiMotokiさん、コメントありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問