PHPでAmazon Product Advertising APIを使う
概要:
今回は、Amazon のProduct Advertising APIを使って、簡単な検索結果を表示したいと思います。
Product Advertising APIは、アクセスする際に、URLコードの中に、ユーザのAccess Key ID(アクセスキー) と
Secret Access Key(秘密アクセスキー) を埋め込み、その情報をもとに認証し、検索などの承認作業を行います。
その承認がOKで、パラメータに誤りがなければ、要求された操作(たとえば、検索など)の結果をXMLの形式で出力します。
出力結果のXML情報を解析することで、自分が表示したい情報を取得し、HTML情報へ変換し、出力できます。
例えば、Amazonで提供されているアフィリエイトのウィジェットのようなものを自分用に作成することもできるわけです。
では、早速、PHPのサンプルコードを作成して試してみましょう。
参照ページ :
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/
まず、準備をしましょう。
Amazon Product Advertising APIを利用するためには、まず、以下のIDを取得する必要があります。
また、アフィリエイトも同時に行う場合は、アフィリエイトIDも必要です。
Access Key ID(アクセスキー) 、 Secret Access Key(秘密アクセスキー) を取得、確認します。
- http://aws.amazon.com/へアクセスします。
- 右の"Sign Up Now"をクリックしてサインインします。
もし、サインインするIDを持っていない場合は、"I am a new user. "をクリックして、新規ユーザIDを作成します。
- サインインしたら、最初のメイン画面に戻ります。
右上から [Your Account] - [Access Identifiers] をクリックします。
以下のような画面へ遷移します。
- 画面下方に、以下のような表が表示されいます。
既に作成されていれば、Access Key ID は表示されています。Secret Access Key は"Show"をクリックすることで表示されます。
まだ作成していない場合は、そのしたの"Create Key"をクリックして作成します。
アフィリエイトキーは、日本のページから作成できます。
https://affiliate.amazon.co.jp/へアクセスして、"無料アカウント作成"をクリックして作成します。
作成したアカウントが、アフィリエイトキーとなります。
アクセスキーと秘密アクセスキーで、直接、検索してみましょう。
Amazon のProduct Advertising APIは、URLに操作パラメータを指定し、アクセスすることでXMLの情報を返信してくれます。
そのため、WEBブラウザで、直接URLアドレスを指定すれば確かめることができます。
ただ、アクセスキーと秘密アクセスキーを使って、Amazonでは、認証を行い、スパム対策をしています。
そのため、URLのアドレス情報に、先に取得したアクセスキーと秘密アクセスキーを埋め込んで、Amazonへアクセスする必要があります。
そのURLコードへアクセスキーと秘密アクセスキーを埋め込むソフトを、Amazonの以下のウェブサイトで提供しています。
http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html
では、このページを使って、URLコードを作ってみましょう。
- アクセスキーと秘密アクセスキーを画面上部へ入力します。
- Unsigned URLには、元のURLコードを指定します。ここでは、サンプルとして以下のをそのまま入力します。
http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService
&Version=2009-03-31
&Operation=ItemSearch
&SearchIndex=Books
&Keywords=harry+potter
- 入力を終えたら、下方へ移動し、"Dispaly Signed URL"をクリックすると、上の欄の"Signed URL"へURLコードが表示されます。
- "Signed URL"のURLコードをコピーし、WEBブラウザのアドレスへ貼り付けます。
すると、以下のような返信情報(XML情報が)が表示されるとおもいます。
このような画面が表示されればOKです。
PHPの動作環境を確認しましょう。
PHPが動作可能か確認します。
以下は、Windowsのコマンドプロンプトで確認した例です。
UNIXでも同様のコマンドを入力して確認できます。
1
2
3
4
| C:\> php -v
PHP 5.1.2 (cli) (built: Jan 11 2006 16:40:00)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
|
今回の記事では、バージョンが
PHP5以上でなければなりません。
これで準備が整いました。
次に、PHPのサンプルコードを元に、試してみましょう。
PHPのサンプルソースを使って、試してみましょう。
以下は、簡単なソフトウェアの検索を行うためのPHPのサンプルソースです。
[sample.php]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
| //-------------------------------------------------------------------
// Define your id.
//-------------------------------------------------------------------
// user id information
define("ACCESS_KEY_ID" , 'Your Access id. ' );
define("SECRET_ACCESS_KEY" , 'Your Secret Access id. ');
define("ASSOCIATE_TAG" , 'Your Associate id.' );
// access url(Jpanan)
define("ACCESS_URL" , 'http://ecs.amazonaws.jp/onca/xml' );
// define("ACCESS_URL", 'https://aws.amazonaws.jp/onca/xml');
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// this function is encode with RFC3986 format.
//-------------------------------------------------------------------
function urlencode_RFC3986($str)
{
return str_replace('%7E', '~', rawurlencode($str));
}
//-------------------------------------------------------------------
// Main routine.
//-------------------------------------------------------------------
$base_param = 'AWSAccessKeyId='.ACCESS_KEY_ID;
$params = array();
$params['Service'] = 'AWSECommerceService';
$params['Version'] = '2009-10-01';
$params['Operation'] = 'ItemSearch';
$params['SearchIndex'] = 'Software';
$params['Sort'] = 'salesrank';
$params['Keywords'] = 'Windows'; // search key ( UTF-8 )
$params['AssociateTag'] = ASSOCIATE_TAG;
$params['ResponseGroup'] = 'ItemAttributes,Offers, Images ,Reviews ';
$params['SignatureMethod'] = 'HmacSHA256'; // signature format name.
$params['SignatureVersion'] = 2; // signature version.
// time zone (ISO8601 format)
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
// sort $param by asc.
ksort($params);
// create canonical string.
$canonical_string = $base_param;
foreach ($params as $k => $v) {
$canonical_string .= '&'.urlencode_RFC3986($k).'='.urlencode_RFC3986($v);
}
// create signature strings.( HMAC-SHA256 & BASE64 )
$parsed_url = parse_url(ACCESS_URL);
$string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
$signature = base64_encode(
hash_hmac('sha256', $string_to_sign, SECRET_ACCESS_KEY, true)
);
// create URL strings.
$url = ACCESS_URL.'?'.$canonical_string.'&Signature='.urlencode_RFC3986($signature);
// request to amazon !!
$response = file_get_contents($url);
// response to strings.
$parsed_xml = null;
if(isset($response)){
$parsed_xml = simplexml_load_string($response);
}
$err_count=0;
// print out of response.
if( $response &&
isset($parsed_xml) &&
!$parsed_xml->faultstring &&
!$parsed_xml->Items->Request->Errors ){
// total results num.
$total_results = $parsed_xml->Items->TotalResults;
// total results pages.
$total_pages = $parsed_xml->Items->TotalPages;
print("All Result Count:".$total_results." | Pages :".$total_pages );
print("<table>");
foreach($parsed_xml->Items->Item as $current){
$nerr=0;
print("<tr><td><font size='-1'>");
print('<a href="'.$current->DetailPageURL.'"><img src="'.$current-- alt="" />SmallImage->URL.'" border="0"></a><br />');
print('<a href="'.$current->DetailPageURL.'">'.$current->ItemAttributes->Title.'</a><br />');
print($current->ItemAttributes->Manufacturer.'<br />');
if(isset($current->Offers) && isset($current->Offers->Offer)){
print( $current->Offers->Offer->OfferListing->Price->FormattedPrice.'<br />');
} else {
print($current->ItemAttributes->ListPrice->FormattedPrice.'<br />');
}
if(isset($current->CustomerReviews->TotalReviews) && $current->CustomerReviews->TotalReviews>0){
print('Rate:<a href="'.$current->ItemLinks->ItemLink[2]->URL.'">');
print($current->CustomerReviews->AverageRating.'('. $current->CustomerReviews->TotalReviews .')'.'<br />');
print('</a><hr />');
}
print("</td></tr>");
}
print("</table>");
}
|
もし、そのまま利用する場合は、以下の3項目を設定すれば、Windowsというキーワードで検索したソフトウェアを人気順で取得します。
6行目:あなたのアクセスキーを設定します。
7行目:あなたの秘密アクセスキーを設定します。
8行目:あなたのアソシエイトキーを設定します。
設定したphpファイルをあなたのWEBサーバ上でアクセスできるところへアップロードします。
WEBブラウザから、アップロードしたphpへアクセスしてみてください。
例えば、WEBサーバのカレントから、amazonディレクトリの配下へアップロードした場合は、以下のようなURLでアクセスします。
http://www.example.com/amazon/sample.php
以下のような画面が表示されるはずです。
簡単な説明でしたが、こんな感じでAmazonの検索を行うことができます。
少しのPHPの知識があれば、自分用のAmazonウィジェットを作成できます。
このようにAmazon のProduct Advertising APIへアクセスするPHPのライブラリは、既にあります。
たとえば、
tarzanや
Services_Amazonなども参照されると良いと思います。
今回は、わかりやすいように、ベタで作成してみました。
自分で、いろいろと触ってみると、理解も深まると思います。一度、試されてみてはいかがでしょうか。
(以下に表示される本の紹介は、このAmazon のProduct Advertising APIを使って検索された結果を表示しています。)
今回の記事では、PHPについて、少し知識が必要です。詳しく知りたい方は、以下の本なども良いと思います。
本から学ぶことは多いと思います。ネットだけでは判らない様々な事に気づかされます。
2011年02月04日 @ 16:10:46
In Amazon web services sorting by price doesn’t work or we can say useless!!!
2011年07月19日 @ 16:37:39
はじめまして。
紹介されてるsample.phpについての質問です。
商品の情報を取得するために、
このページのsample.phpのサンプルを動かそうとしたのですが、ローカル環境では「Parseerror: syntax error, unexpected ‘;’ in /Applications/…../amazon_sample.php on line89」というエラーが表示されている状況です。
私の設定の仕方に問題があるのかもしれませんが、表示させるための方法をご存知でしたら、アドバイス頂けたら嬉しいです。
ちなみに、アクセスキー、秘密アクセスキー、アソシエイトキーの3つのキーは、自分のものを入れて試してみました。
(webサーバに上げた場合は、ページが空白になってエラーなどの表記はありませんでした。)
また、ページ上部に書かれていました「アクセスキーと秘密アクセスキーで、直接、検索してみましょう。」の部分のXMLの表示は成功しました。このXMLのURLについて、sample.phpのファイル上に記述する必要があるのかどうかについても、教えて頂けたらと思います。ちなみに、いまのところ私がsample.phpに修正をしたのは、上記の3つの自分のキーのみです。
自分でもいろいろ調べているのですが、Amazon Product Advertising APIが変更になった際に『署名入り』の仕様に変わったことなども、一因なのでしょうか。
http://www.allinthemind.biz/markup/php/amazon_product_advertising_api.html
お忙しいなかと思いますが、sample.phpを動かすための方法について、アドバイス頂けたら幸いです。
どうぞよろしくお願い致します。
2011年07月19日 @ 22:55:42
kenさん
こんにちわ、管理人です。
「Parseerror: syntax error, unexpected ‘;’ in /Applications/…../amazon_sample.php on line89」
これは、単純にphpの文法エラーなので、まだ、amazonへのアクセスの段階ではないような感じだと思います。
89行目あたりに ‘;’ が抜けてないですか?間違って削除したりしてないですか?
そんな感じのエラーだと思います。今一度、ご確認されると良いかなぁと思います。
まずは、このエラーをとることだと思います。
2011年07月20日 @ 16:01:04
管理人さま
返答いただき大変ありがとうございます。
無事表示されました。
ささいな注意ミスでした。
有難うございました!!
2011年08月01日 @ 13:09:34
管理人さん…
いちおアクセスキーなどは記入したんですが…
サーバーにあげてみると画面が真っ白になってしまい全然使えません…
サーバーもphp5のものを使っています。
やっと見つけた超参考になりそうなサンプルだったのでとても使ってみたいんですが、動かなくて困ってます。
2011年08月01日 @ 18:30:57
ゲーム失速さん
こんにちわ、管理人です。
真っ白になってしまうのであれば、何かしらエラーになっていると思います。
まずは、そのエラー内容を画面表示するようにしてはいかがでしょうか?
phpのエラー表示は、php.iniで設定できるのであれば、以下のような記述を行えば良いでしょう。
また、詳しくはGoogleで検索してみてください。いっぱいありますから。
display_errors = On
error_reporting = E_ALL & ~E_NOTICE
2011年08月01日 @ 18:47:00
即座の回答ありがとうございます!!
まだphp初心者なので頑張ってみます。
あと、少し気になったのですが
define(“ACCESS_KEY_ID” , ‘Your Access id. ‘ );
define(“SECRET_ACCESS_KEY” , ‘Your Secret Access id. ‘);
define(“ASSOCIATE_TAG” , ‘Your Associate id.’ );
ACCESS_KEY_IDとSECRET_ACCESS_KEYとASSOCIATE_TAGの所を書き換えるんですよね?
2011年08月02日 @ 00:42:15
ゲーム失速さん
こんにちわ、管理人です。
そうです。
ゲーム失速さん
define(“ACCESS_KEY_ID” , ‘Your Access id. ‘ );
define(“SECRET_ACCESS_KEY” , ‘Your Secret Access id. ‘);
define(“ASSOCIATE_TAG” , ‘Your Associate id.’ );
‘Your Access id. ‘ ← ここにあなたのアクセスキーを設定します。
‘Your Secret Access id. ‘ ← ここにあなたの秘密アクセスキーを設定します。
‘Your Associate id.’ ← ここにあなたのアソシエイトキーを設定します。
です。
2011年08月02日 @ 19:57:52
今日もすみませんm(_ _)m
結局
Parse error: syntax error, unexpected T_DEC in /home/a9684409/public_html/amazon.php on line 85
2つのサーバーで二つともこのメッセージが出てきました。管理人さんに教えていただいた所だけ書き換えたのですが、T_DECってたしか–のことですよね??
別に間違ってるようには見えないんですが…
ほんとにど素人ですみません…なにかわかることがあれば教えていただけると幸いです
2011年08月03日 @ 04:08:29
ゲーム失速さん
こんにちわ、管理人です。
エラー内容は、
85行目あたりに +,- の演算子で構文エラー(PHPの文法エラー(記述誤り))がありますよ・・・という意味です。
原因は様々です。
書き換えたときに全角文字列や +,- の記号が間違って入力されてしまったり、逆に削除してしまったり・・・・などなど。
そんな感じのエラーだと思います。今一度、ご確認されると良いかなぁと思います。
まずは、このエラーをとることだと思います。
2012年03月06日 @ 16:36:19
はじめまして。
上記sample.phpのコードをそのままコピペして使ってみたのですがゲーム失速さんとまったく同じエラーが出ます。
上記コードをで囲ってそのままアップしました。
エラーが出たので3つのamazonAPIkeyを設定して確認しましたが同じエラーが出ました。
Parse error: syntax error, unexpected T_DEC in /home/a9684409/public_html/amazon.php on line 85
Ecripseで見てみると85行目
!$parsed_xml–>Items–>Request–>Errors ){
の「Items–>Request」の「–」に赤い下線が付いてそれ以降の行にも「–」のところはほとんどエラーになっているみたいです。
何回もコピペから試してみたのですが同じエラーが出てしまいます。
どうすればいいでしょうか?
PHPのバージョンは
PHP: 5.3.8
です。
2012年03月06日 @ 23:21:51
すみません。解決しました。
コピペではなくダウンロードして使ったら
何事もなかったように・・・
お騒がせしました。
こんな有益な情報を公表してくれた管理人さんに感謝です。
2012年05月18日 @ 16:17:29
とても有益な内容と分かりやすいページ、とても素晴らしいです。
早速、試してみましたところ、表示は上手くされるのですが、結果の日本語が全て文字化けになってしまいます。
UTF-8で保存してアップロードしており、分かる範囲で色々と試していますが、解決しません。
素人ですみませんが、アドバイス下さいませんでしょうか。
よろしくお願いいたします。
2012年05月18日 @ 17:05:55
ピーチ姫さん、コメントありがとうござます。
こちらは管理人です。
文字化け?ですが、まず、
出力される文字列が何か?確認されると良いと思います。ブラウザで見て文字化け?と判断されているなら、ブラウザの機能に文字コードを変換する機能がありますから、例えば、EUCないしShift-JIS、UTF-8で表示してみられたらいかがでしょうか?
UTF-8に切り替えて見れるなら、
おそらくは、デフォルトの文字コードがUTF-8にならないだけじゃないかなぁと思いますが・・・・。あくまで想像でしかありませんが。
2012年06月29日 @ 19:15:41
とても勉強になるサンプルソース
感謝しています。ただ上記のリンク先「PHPサンプル1」からダウンロードができないようです。別の場所など引っ越しをされましたでしょうか?
ダウンロードしようとしているソースは以下です。
「PHPサンプル5 amazon_sample (397)」
なぜでしょう、、
2012年06月29日 @ 22:50:39
匿名A さん
コメントありがとうございます。
ご指摘のとおり画面からリンク先をクリックできないようになっていたようです。
一応、修正しておきました。リロードしてみてください。また、何か変なところがありましたらご指摘ください。
2012年07月02日 @ 18:24:24
いえいえ、とんでもありません、無事にダウンロードができるようになりました。ありがとうございました。
少し教えていただきたいのですが、amazonのサンプルソースで10件の表示となっていますが、もっともっと
表示件数を増やしたい場合などは、どのように書けば
よいのかで、今悩んでいます。
もしもヒントなどいただけましたら、とても助かります。
2012年07月05日 @ 18:16:27
やはり自分で調べて確認するものですね、すみませんでした。
ItemPageをセットしてループさせることで100件まで
一度に取得できるようには、なりましたが、これ以上
取得する制限がamazonにかかっているようです。
この100件以上の制限を超えて取得する方法が
思い当りません、なにか名案はございませんでしょうか?
2015年10月10日 @ 22:23:42
Keywordsに全角文字を指定すると、
Warning: file_get_contents(
): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in sample.php on line 71
と警告が出て検索できません。
どうやれば全角文字を指定できるでしょうか?