PHP:アマゾンAPI (AWS)で検索結果を表示

前回の続きです。
取得したXMLから画像、商品名、価格など必要な情報を取り出していきます。

前回のリクエストURLからパラメータを少しいじりました。
下のコードをゴソっとコピペし、Access Key ID、Secret Access Key、AssociateTag辺りをチョチョっと書き換えて実行してみてください。

<?php
$aws_access_key_id = '自分のAccess Key ID';
$aws_secret_key = '自分のSecret Key ID';
$AssociateTag='自分のトラッキングID';

//URL生成
$endpoint = 'webservices.amazon.co.jp';
$uri = '/onca/xml';

for($i=1; $i<=2; $i++){//2ページ取得、ItemSearchの最大値は10まで
	//パラメータ群
	$params = array(
		'Service' => 'AWSECommerceService',
		'Operation' => 'ItemSearch',
		'AWSAccessKeyId' => $aws_access_key_id,
		'AssociateTag' => $AssociateTag,
		'SearchIndex' => 'Books',
		'ResponseGroup' => 'Medium',
		'Keywords' => '進撃の巨人',
		'ItemPage' => $i
	);

	//timestamp
	if (!isset($params['Timestamp'])) {
		$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
	}

	//パラメータをソート
	ksort($params);

	$pairs = array();
	foreach ($params as $key => $value) {
		array_push($pairs, rawurlencode($key).'='.rawurlencode($value));
	}

	//リクエストURLを生成
	$canonical_query_string = join('&', $pairs);
	$string_to_sign = "GET\n".$endpoint."\n".$uri."\n".$canonical_query_string;
	$signature = base64_encode(hash_hmac('sha256', $string_to_sign, $aws_secret_key, true));
	$request_url = 'http://'.$endpoint.$uri.'?'.$canonical_query_string.'&Signature='.rawurlencode($signature);

	$amazon_xml=simplexml_load_string(@file_get_contents($request_url));//@はエラー回避

	foreach($amazon_xml->Items->Item as $item_a=>$item){
		$detailURL=$item->DetailPageURL;//商品のURL
		$image=$item->MediumImage->URL;//画像のURL
		$title=$item->ItemAttributes->Title;//商品名
		$author=$item->ItemAttributes->Author;//著者名
		$price=$item->ItemAttributes->ListPrice->Amount;//価格

		print '<div style="clear:both; margin-bottom:20px;"><a href="'.$detailURL.'" target="_blank"><img src="'.$image.'" align="left"></a><br>
タイトル:<a href="'.$detailURL.'" target="_blank">'.$title.'</a><br>
著者:'.$author.'<br>
価格:'.$price.'<br>
URL:'.$detailURL.'</div>';
		print PHP_EOL;
	}

	//1秒おく
	sleep(1);
}
?>

実際にはパラメータ部分をいじって自分の欲しい情報をゲットします。

上のコードの実行結果はこんな↓感じです。
XML取得結果

以前は価格が出なかったのですが、さすがに修正したようですね。

相変わらず著者名の入り方が一ヶ所だったり、分かれていたり、無料だと価格が空になったりしているので、そこら辺は適宜手を加えてあげてください。

アマゾン側のバグなので修正されているとは思うのですが、いまだにforeach()の部分でエラーを起こすようなら(object)を入れて回避してください。
エラーメッセージは、

Warning: Invalid argument supplied for foreach()

以前は検索結果がオブジェクト形式で入っていないことが多々あり、値が存在しない場合や、プレーンのテキストになっているとエラーを起こしていました。

「objectで取得してね(simplexml_load_string)」と言っているのに、中身がそうでないからエラーになるという。。。

その場合は該当箇所を強制的にオブジェクトにしてしまえば回避できます。

foreach($amazon_xml->Items->Item as $item_a=>$item){

この部分を

foreach((object) $amazon_xml->Items->Item as $item_a=>$item){//(object) を追加

にすれば直ると思います。

もし一般向け商品を前提としているのにアダルト商品が混ざるようでしたら、下記辺りからアダルト商品を探して弾くといいです。

ItemAttributes->Format //「アダルト」の文字がないか
ItemAttributes->IsAdultProduct //アダルトなら「1」が入力されるかも

 
ちなみにKeywordsでOR検索をしたい時はPHPと同様「|」を入れます。

ワード1|ワード2|ワード3

AND検索は一応「,」で区切るらしいですが、全角スペースを入れても同様の結果になってました。

ワード1,ワード2,ワード3
ワード1 ワード2 ワード3

「PHP:アマゾンAPI (AWS)で検索結果を表示」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。


*