PHPでAmazon Web Serviceを利用して書籍検索

(1/1)
PHP で Amazon Web ServiceAWS)を利用し、書籍を検索するプログラムを作成する。

サンプル・プログラムの実行例

PHPでAmazon Web Serviceを利用して書籍検索

サンプル・プログラム

解説:準備

0020:     //Amazon Web Service
0021:     //http://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         = 'http://ecs.amazonaws.jp/onca/xml';
0026:     const AWSVERSION     = '2013-08-01';      //APIバージョン

AWS を利用するには、アソシエイト IDアクセスキー IDシークレットキーの 3 つが必要である。いずれも無料で入手できる。ここでは、2013-08-01 バージョンを利用する。

Amazon アソシエイト(アフィリエイト)のアカウントを持っていない方は、まず、「Amazon アソシエイト(アフィリエイト)にようこそ!」から、アカウントを作成する。
AmazonアソシエイトIDを入手
画面右側にある「無料アカウント作成」ボタンをクリックし、必要な情報を記入し、アカウントを作成する。
AmazonアソシエイトIDを入手
管理画面にログインすると、左上にアソシエイト IDが表示される。これを、メモしておく。
次に、アクセスキー IDシークレットキーを入手する。
Amazon アソシエイト管理画面の上部メニュー「Product Advertising API」をクリックする。
AWSアクセスキーID、シークレットキーを入手
すると「Product Advertising API(リンク作成用API)」という画面に遷移する。右側にある「アカウント作成」をクリックする。
あとは画面の指示にしたがって、必要な情報を記入し、アカウントを作成する。
AWSアクセスキーID、シークレットキーを入手
最後に、「Manage Your Accont」をクリックする。
AWSアクセスキーID、シークレットキーを入手
アカウントサービスの管理画面に入る。
「アクセスキー情報」にある「こちらのリンク」をクリックする。
AWSアクセスキーID、シークレットキーを入手
青いボタン「新しいアクセスキーの作成」をクリックすると、アクセスキー IDシークレットキーが作成される。CSV ファイルでダウンロードする。

ここまでの手順の詳細は、「AWS アクセスキー発行手順」(RTpro)が詳しい。

WebAPI:Amazon Web Service

リクエストURL
http://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 【必須】検索条件
入力パラメータは、他の WebAPI と比べると、やや複雑である。すべての入力パラ-メタは、あらかじめ  urlencode  に通しておく。
一番厄介なのはシグネチャであるが、次の手順で求める。

まず、キーのアルファベット順にパラメータを並べる。

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', $messageself::AWSSECRETKEYTRUE);
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: }

上述のシグネチャの作り方を実装したのがユーザー関数 getURL_AWS である。
応答データ構造(xml) ItemSearchResponse OperationRequest HTTPHeaders Header RequestId リクエストID Arguments Argument Argument Argument RequestProcessingTime 処理時間 Items Request IsValid 成功ならTrue ItemSearchRequest ItemPage ページ番号 ResponseGroup レスポンスグループ ResponseGroup レスポンスグループ SearchIndex 絞り込み条件 SearchIndex 絞り込み条件 Sort 並べ替え条件 Title 検索タイトル TotalResults ヒット件数 TotalPages 全ページ MoreSearchResultsUrl 検索結果URL Item ASIN ASINコード DetailPageURL 商品URL ItemAttributes Author 作者 Binding 分類 EAN ISBN(13桁) ISBN ISBN(10桁) IsAdultProduct 成人指定か否か ListPrice Amount 価格 CurrencyCode 通貨:JPYは日本円 NumberOfPages ページ数 ProductGroup 種別 PublicationDate 発行年月日 Publisher 出版社 ReleaseDate 出版年月日 Title タイトル SmallImage URL 画像(小)URL Height 画像(小)高さ Width 画像(小)幅 MediumImage URL 画像(中)URL Height 画像(中)高さ Width 画像(中)幅 LargeImage URL 画像(大)URL Height 画像(大)高さ Width 画像(大)幅 ItemLinks ItemLink Description Add To Wishlist URL Wishlist URL

解説:書籍検索

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 を利用して書籍検索を行うのがユーザー関数 searchBooks である。検索結果を配列 $items に格納する。

Amazon Web Service は同時に 1 ページ(10 件)しか取得できない。そこで、Items->TotalPages のページ数だけ繰り返し Amazon Web Service を呼び出す。

参考書籍

表紙 Amazon Web Services実践入門
著者 舘岡守/今井智明
出版社 技術評論社
サイズ 単行本
発売日 2015年11月10日
価格 2,786円(税込)
rakuten
ISBN 9784774176734
柔軟な開発を可能にするインフラ構築・運用の勘所。ブラウザでの設定もコマンド操作も丁寧に解説。
 
表紙 Amazon Web Services パターン別構築・運用ガイド
著者 NRIネットコム株式会社/佐々木拓郎
出版社 SBクリエイティブ
サイズ 単行本
発売日 2015年03月26日
価格 3,672円(税込)
rakuten
ISBN 9784797382570
目的に応じたサービスの選び方と導入方法を詳細にわかりやすく解説。構築手順がよくわかる!
 
表紙 Amazon Web Services入門
著者 加藤章
出版社 インプレス
サイズ 単行本
発売日 2014年09月
価格 2,484円(税込)
rakuten
ISBN 9784844336471
 
表紙 Amazon Web Services 徹底活用ガイド
著者 日経SYSTEMS/日経NETWORK
出版社 日経BP社
サイズ ムックその他
発売日 2014年12月13日
価格 2,592円(税込)
rakuten
ISBN 9784822269999
 

参考サイト

(この項おわり)
header