サンプル・プログラムの実行例
サンプル・プログラム
解説:準備
0020: //Amazon Web Service
0021: //https://www.pahoo.org/e-soul/webtech/php06/php06-54-01.shtm参照
0022: const ASSOCIATETAG = '**********'; //アソシエイトID
0023: const AWSACCESSKEYID = '**********************'; //アクセスキーID
0024: const AWSSECRETKEY = '**********************'; //シークレットキー
0025: const AWSURL = 'https://ecs.amazonaws.jp/onca/xml';
0026: const AWSVERSION = '2013-08-01'; //APIバージョン
Amazonアソシエイト(アフィリエイト)のアカウントを持っていない方は、まず、「Amazonアソシエイト(アフィリエイト)にようこそ!」から、アカウントを作成する。
Amazonアソシエイト管理画面の上部メニュー「Product Advertising API」をクリックする。
あとは画面の指示にしたがって、必要な情報を記入し、アカウントを作成する。
「アクセスキー情報」にある「こちらのリンク」をクリックする。
ここまでの手順の詳細は、「AWS アクセスキー発行手順」(RTpro)が詳しい。
WebAPI:Amazon Web Service
リクエストURL |
---|
https://ecs.amazonaws.jp/onca/xml |
項目名 | フィールド名 | 型 | 内 容 |
---|---|---|---|
サービス名 | Service | string | 【必須】AWSECommerceService |
アソシエイトID | AssociateTag | string | 【必須】上記で入手したもの。 |
アクセスキーID | AWSAccessKeyId | string | 【必須】上記で入手したもの。 |
APIバージョン | Version | string | 【必須】2013-08-01 |
タイムスタンプ | Timestamp | string | 【必須】世界標準時をRFC3339形式で表現したもの。 例:2016-01-23T00:15:35.000Z |
シグネチャ | Signature | string | 【必須】※後述 |
オペレーション | Operation | string | 【必須】ItemSearch:商品検索 |
絞り込み条件 | SearchIndex | string | 【必須】All(全て)、Books(本)、DVD、Music(ミュージック)、Toy(おもちゃ)、等々 |
レスポンスグループ | ResponseGroup | string | 【必須】ItemAttributes(商品属性、Images(商品画像)、等々 複数指定するときはカンマ ',' で区切る。 例:ItemAttributes,Images |
検索条件 | Keywords, Title, Author, 等々 | string | 【必須】検索条件 |
一番厄介なのはシグネチャであるが、次の手順で求める。
まず、キーのアルファベット順にパラメータを並べる。
AssociateTag=hagehage
AWSAccessKeyId=hogehoge
Operation=ItemSearch
ResponseGroup=ItemAttributes%2CImages
SearchIndex=Books
Service=AWSECommerceService
Timestamp=2016-01-23T00%3A15%3A33.00Z
Title=PHP
Version=2013-08-01
すべてのパラメータを & で接続する。
AssociateTag=hagehage&AWSAccessKeyId=hogehoge
&Operation=ItemSearch&ResponseGroup=
ItemAttributes%2CImages&SearchIndex=Books
&Service=AWSECommerceService&Timestamp=
2016-01-23T00%3A15%3A33.00Z
&Title=PHP&Version=2013-08-01
冒頭に GET, ecs.amazonaws.jp, /onca/xml の3行を加える。
GET
ecs.amazonaws.jp
/onca/xml
AssociateTag=hagehage&AWSAccessKeyId=hogehoge
&Operation=ItemSearch&ResponseGroup=
ItemAttributes%2CImages&SearchIndex=Books
&Service=AWSECommerceService&Timestamp=
2016-01-23T00%3A15%3A33.00Z&Title=PHP
&Version=2013-08-01
このテキストをHMAC-SHA256によりハッシュ化する。
具体的には、関数 hash_hmac の第一引数を "sha256" に、第2引数に上述のテキストを、第3引数に冒頭で入手した シークレットキー を、第4引数に TRUE を指定する。
得られたシグネチャは、 base64_encode と urlencode を通してテキスト化し、リクエストURLの最後に付け加える。
シグネチャを含む呼び出しURLは、Amazon公式サイトにある「Signed Requests Helper」で手作業で作成することができる。プログラムのデバッグ時に役立つだろう。
解説:AWSの呼び出し
0076: /**
0077: * Amazon Web ServiceのURLを取得する
0078: * @param array $reqsリクエスト・パラメータ(キー:変数名)
0079: * @return string URL URL
0080: */
0081: function getURL_AWS($reqs) {
0082: foreach ($reqs as $key=>$val) {
0083: $reqs[$key] = urlencode($val);
0084: }
0085: $reqs['Service'] = 'AWSECommerceService';
0086: $reqs['AWSAccessKeyId'] = self::AWSACCESSKEYID;
0087: $reqs['AssociateTag'] = self::ASSOCIATETAG;
0088: $reqs['Version'] = self::AWSVERSION;
0089: $reqs['Timestamp'] = urlencode(gmdate('Y-m-d') . 'T' . gmdate('H:i:s') . '.000Z');
0090:
0091: //Signature生成
0092: ksort($reqs); //キー順ソート
0093: $str_req = '';
0094: $cnt = 0;
0095: foreach ($reqs as $key=>$val) {
0096: if ($cnt > 0) $str_req .= '&';
0097: $str_req .= $key . '=' . $val;
0098: $cnt++;
0099: }
0100: $arr = parse_url(self::AWSURL);
0101: $message = array('GET', $arr['host'], $arr['path'], $str_req);
0102: $message = join("\n", $message);
0103:
0104: $hash = hash_hmac('sha256', $message, self::AWSSECRETKEY, TRUE);
0105: $reqs['Signature'] = urlencode(base64_encode($hash));
0106:
0107: //リクエストURL生成
0108: $url = self::AWSURL;
0109: $cnt = 0;
0110: foreach ($reqs as $key=>$val) {
0111: if ($cnt == 0) $url .= '?' . $key . '=' . $val;
0112: else $url .= '&' . $key . '=' . $val;
0113: $cnt++;
0114: }
0115:
0116: return $url;
0117: }
解説:書籍検索
0119: /**
0120: * Amazonで書籍検索
0121: * @param string $query書名
0122: * @param array $items情報を格納する配列
0123: * @return intヒットした商品数
0124: */
0125: function searchBooks($query, &$items) {
0126: $reqs = array();
0127: $reqs['Operation'] = 'ItemSearch';
0128: $reqs['SearchIndex'] = 'Books';
0129: $reqs['ResponseGroup'] = 'ItemAttributes,Images';
0130: $reqs['Title'] = $query;
0131: $reqs['Sort'] = 'daterank';
0132: $reqs['ItemPage'] = 1;
0133:
0134: $url = $this->getURL_AWS($reqs); //リクエストURL
0135: $this->webapi = $url;
0136:
0137: $res = @simplexml_load_file($url);
0138: //レスポンス・チェック
0139: if (! isset($res->Items->Request->IsValid) ||
0140: (preg_match('/True/i', $res->Items->Request->IsValid) == 0)) {
0141: $this->error = TRUE;
0142: $this->errmsg = 'AmazonWebServiceのトラブル';
0143: $this->hits = 0;
0144: return FALSE;
0145: }
0146: //合計ページ数
0147: $total_pages = (int)$res->Items->TotalPages;
0148: if ($total_pages > 10) $total_pages = 10; //制限
0149: //データ読み込み
0150: $cnt = 1;
0151: $page = 1;
0152: do {
0153: foreach ($res->Items->Item as $item) {
0154: //電子書籍は除外
0155: if (preg_match('/eBooks/iu', (string)$item->ItemAttributes->ProductGroup) > 0) continue;
0156: //成人向けコンテンツは除外
0157: if ((int)$item->ItemAttributes->IsAdultProduct > 0) continue;
0158: $items[$cnt]['ISBN'] = (string)$item->ItemAttributes->EAN;
0159: $items[$cnt]['ASIN'] = (string)$item->ASIN;
0160: $items[$cnt]['Title'] = (string)$item->ItemAttributes->Title;
0161: $items[$cnt]['Author'] = (string)$item->ItemAttributes->Author;
0162: $items[$cnt]['Publisher'] = (string)$item->ItemAttributes->Publisher;
0163: $items[$cnt]['ReleaseDate'] = (string)$item->ItemAttributes->ReleaseDate;
0164: $items[$cnt]['PublicationDate'] = (string)$item->ItemAttributes->PublicationDate;
0165: $items[$cnt]['Price'] = (int)$item->ItemAttributes->ListPrice->Amount;
0166: $items[$cnt]['ProductGroup'] = (string)$item->ItemAttributes->ProductGroup;
0167: $items[$cnt]['Url'] = (string)$item->DetailPageURL;
0168: $items[$cnt]['LargeImage'] = (string)$item->LargeImage->URL;
0169: $items[$cnt]['MediumImage'] = (string)$item->MediumImage->URL;
0170: $items[$cnt]['SmallImage'] = (string)$item->SmallImage->URL;
0171: $cnt++;
0172: }
0173: $page++;
0174: $reqs['ItemPage'] = $page;
0175: $url = $this->getURL_AWS($reqs); //リクエストURL
0176: $this->webapi = $url;
0177: $res = @simplexml_load_file($url);
0178: if (! isset($res->Items->Request->IsValid) ||
0179: (preg_match('/True/i', $res->Items->Request->IsValid) == 0)) continue;
0180:
0181: } while ($page <= $total_pages);
0182:
0183: $this->error = FALSE;
0184: $this->errmsg = '';
0185: $this->hits = $cnt - 1;
0186:
0187: return $this->hits;
0188: }
Amazon Web Service は同時に1ページ(10件)しか取得できない。そこで、Items->TotalPages のページ数だけ繰り返し Amazon Web Service を呼び出す。
参考書籍
Amazon Web Services実践入門 | |||
著者 | 舘岡守/今井智明 | ||
出版社 | 技術評論社 | ||
サイズ | 単行本 | ||
発売日 | 2015年11月10日頃 | ||
価格 | 2,838円(税込) | ||
ISBN | 9784774176734 | ||
柔軟な開発を可能にするインフラ構築・運用の勘所。ブラウザでの設定もコマンド操作も丁寧に解説。 | |||
Amazon Web Services パターン別構築・運用ガイド | |||
著者 | NRIネットコム株式会社/佐々木拓郎 | ||
出版社 | SBクリエイティブ | ||
サイズ | 単行本 | ||
発売日 | 2015年03月26日頃 | ||
価格 | 3,740円(税込) | ||
ISBN | 9784797382570 | ||
目的に応じたサービスの選び方と導入方法を詳細にわかりやすく解説。構築手順がよくわかる! | |||
Amazon Web Services入門 | |||
著者 | 加藤章 | ||
出版社 | インプレス | ||
サイズ | 単行本 | ||
発売日 | 2014年09月 | ||
価格 | 2,530円(税込) | ||
ISBN | 9784844336471 | ||
Amazon Web Services 徹底活用ガイド | |||
著者 | 日経systems編集部/日経network編集部 | ||
出版社 | 日経BP | ||
サイズ | ムックその他 | ||
発売日 | 2014年12月13日頃 | ||
価格 | 2,640円(税込) | ||
ISBN | 9784822269999 | ||
参考サイト
- Amazon Web Service(AWS)
- PHPで楽天ブックスAPIを使って書籍検索:ぱふぅ家のホームページ
- AWS SDK for PHPのVersion 3が利用可能になりました:Amazon Web Services ブログ
- さあ、AWSをはじめよう! for PHPer:Shin x blog
- Amazon Web Servicesを利用した中規模Webシステムの構築・運用事例について
- Amazonのサービス一覧:PHPプログラマのバリ・ポジ情報ブログ