PHPでISBNを用いてAmazonAPIから本の情報を取得

パラメータについての説明や書き方について詳しくは触れません(｡-人-｡)
が、できるだけ基本はコピペで、パラメータや設定についてはリンク先へ行ってもらえると取得できるようになってるつもりです…
※ISBNは本のバーコードの下にある数字のこと。今回は上段のバーコードの数字13桁(978…)を使う

##手順
1．事前準備(Amazonでキーの取得)
2．必要なパラメータの設定
3．パラメータを用いてアクセス用URLの作成
4．Amazonへアクセスし情報取得

##1．事前準備
まずはじめにAmazonで
・[アクセスキー](https://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html)
・[シークレットキー](https://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html)
・[アソシエイトタグ](https://affiliate.amazon.co.jp)
を取得しておく

##2．必要なパラメータの設定
```php
// ※は自分で設定してください
define("ACCESS_KEY_ID"     , '※アクセスキー');
define("SECRET_ACCESS_KEY" , '※シークレットキー');
define("ASSOCIATE_TAG"     , '※アソシエイトタグ');
define("ACCESS_URL"        , 'https://aws.amazonaws.jp/onca/xml');

$base_param = 'AWSAccessKeyId='.ACCESS_KEY_ID;

$params = array(); 
$params['Service']        = 'AWSECommerceService';
$params['Version']        = '2011-08-02'; //Versionは基本的には最新のものでOK
$params['Operation']      = 'ItemLookup';
$params['ItemId']         = '※欲しい本のISBN';
$params['IdType']         = 'ISBN'; //今回はISBNから情報を取得するのでISBN
$params['SearchIndex']    = "Books"; //今回は本の情報なのでBooks 
$params['AssociateTag']   = ASSOCIATE_TAG;
$params['ResponseGroup']  = 'ItemAttributes,Offers, Images ,Reviews '; // 必要なレスポンスを設定(詳しくは下で説明)
$params['Timestamp']      = gmdate('Y-m-d\TH:i:s\Z');

//パラメータを自然順序付け・昇順で並び替え
ksort($params);

$canonical_string = $base_param;
foreach ($params as $k => $v) {
    $canonical_string .= '&'.urlencode_RFC3986($k).'='.urlencode_RFC3986($v);
}

function urlencode_RFC3986($str)
{
    return str_replace('%7E', '~', rawurlencode($str));
}
```
1で取得しておいたキーとタグをそのままコピペ

また、ほしい本のISBNを設定
ResponseGroupはAmazonの[Product Advertising API](https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html?RG_ItemAttributes.html)にあるので、必要に応じて呼び出す

##3．パラメータを用いてアクセス用URLの作成
```php
$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)
				);
 
$url = ACCESS_URL.'?'.$canonical_string.'&Signature='.urlencode_RFC3986($signature);
```
echoなどで$urlを出力し、そのURL先へ行くと入力したISBNの本のAmazonページへ行ける…はず

##4．Amazonへアクセスし情報取得
```php
$response = file_get_contents($url); //Amazonへレスポンス

$parsed_xml = null;
// レスポンスを配列で取得
if (isset($response)) {
	$parsed_xml = simplexml_load_string($response);
}

// Amazonへのレスポンスが正常に行われていたら
if ($response && 
    isset($parsed_xml) && 
    !$parsed_xml->faultstring &&
    !$parsed_xml->Items->Request->Errors) {

	foreach ($parsed_xml->Items->Item as $current) {
		// 2で設定したResponseGroupから呼び出したい情報を取得
		$title 			= $current->ItemAttributes->Title; // タイトル
		$author 		= $current->ItemAttributes->Author; // 著者
		$manufacturer 	= $current->ItemAttributes->Manufacturer; // 出版社
		$imgURL			= $current->MediumImage->URL; // 本の表紙の中サイズのURL(サイズは小中大から選べる)  
		$bookURL 		= $current->DetailPageURL; // Amazonの本のページのURL

		// 管理しやすいように文字コードの宣言やスペースの削除等を行う
		$title = mb_convert_kana($title, "as", "UTF-8");

		$authors = $author[0];
		// 著者が複数いる場合
		if (count($author) > 1) {
			for ($i = 1; $i < count($author); $i++) {
				$authors = $authors. ",". $author[$i];
			}
		}

		// amazonへのURLを短縮(詳しくは下で)
		$URL = substr($bookURL, 0, 24). "dp/". substr($bookURL, -10);
	}
}
```
Amazonの[Product Advertising API](https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html?RG_ItemAttributes.html)で必要な情報(今回は本のタイトルや著者など)を呼び出す

著者は複数いる場合があるので、繰り返し処理で取得(今回は文字列)

また、本のURLはそのままだと長いので省略する
詳しくは「[AmazonのURLは短縮できる](http://qiita.com/na1412/items/9bfa9c92bd32d70ec86c)」で書いてあるので知りたければ見てね

##おわりに
今回PHPで行った理由はDBを使うためでした。
なので本の情報取得の際に、DBへの処理を組み込んでいただけるとできるかなと思います！

カテゴリの取得などをしたいと思う人もいるかもしれませんが、カテゴリは１つの本に対して複数あり階層も深いので、ちょっと大変だと思います…

以上で、『PHPでISBNを用いてAmazonAPIから本の情報を取得』ができると思います！