AWSのサンプルコード

AWS > ウェブサービス > サンプルコード > AWSのサンプルコード

AWSを単体で利用するより、バリューコマースWEBサービスで、ヤフー等、他の商品も対象にしたほうが効率が良くお勧めなのは前回、お話ししたとおりなのですが、とりあえず、AmazonのWEBサービスに触れてみたいと思われている方むけに、AmazonアソシエイトをAWS経由で行う場合のサンプルコードを用意しました。

まずは動作デモページをお試しください。

サンプルコードをご自分の環境下で動作させるには当然ながらPHPが動作するサーバー環境が必要で、AmazonアソシエイトIDの他、AWSの公式サイトでアカウントを作成してアクセスキー、シークレットキーを取得する必要があります。

AWS自体は、本家アメリカのAmazonが管理してる様子ですので、日本のAmazonで既にアカウントを持っていても、新たに作成する必要があります。

実際に動作させてみると、個々の商品によって、レスポンスデータ項目の有無や、商品画像サイズのバラつき等があり、あまり、期待したレスポンスが得られない印象を受けます。

サンプルコードは下記になります。

<?php

	// Amazon APIのアクセスキー
	define("Access_Key_ID", "");
	
	// シークレットキー
	define("Secret_Access_Key", "");
	
	// アソシエイトID
	define("Associate_tag", "");

echo '<div style="width:80%;margin:5% auto;">';

echo '<div style="margin:0; padding:0">';

?>
<div style="margin:0 0 2% 0;">
<form name="searchform" id="itemsearchform" method="get" action="">
<input type="text" name="Keywords" id="itemkeyword" value="" />
<input type="submit" id="itemsubmit" value="検索" />
</form>
</div>
<?php
	
	// キーワードをセット
	$Keywords = htmlspecialchars($_GET['Keywords'], ENT_QUOTES);
	
	// URLエンコード(ページャー用)
	$e_Keywords = urlencode($Keywords);
	
	// 現在のページ番号を取得、設定
	$ItemPage = (empty($_GET['ItemPage'])) ? 1 : $_GET['ItemPage'];
	
	// カテゴリの設定 参考(http://docs.aws.amazon.com/AWSECommerceService/latest/DG/LocaleJP.html)
	$SearchIndex = "All"; // 全カテゴリ対象
	
	$baseurl = "https://webservices.amazon.co.jp/onca/xml";
	
	// リクエストのパラメータ
	$params = array();
	$params["Service"]          = "AWSECommerceService";
	$params["AWSAccessKeyId"]   = Access_Key_ID;
	$params["Version"]          = "2013-08-01";
	$params["Operation"]        = "ItemSearch";
	$params["SearchIndex"]      = $SearchIndex;
	$params["Keywords"]         = $Keywords;
	$params["AssociateTag"]     = Associate_tag;
	$params["ResponseGroup"]    = "ItemAttributes, Medium, Images";
	$params["MinimumPrice"]     = "100";
	$params["XMLEscaping"]      = " Double";
	$params["ItemPage"]         = $ItemPage;
	
	$base_request = "";
	
	foreach ($params as $k => $v) { $base_request .= "&" . $k . "=" . $v; }
	
	$base_request = $baseurl . "?" . substr($base_request, 1);
	
	$params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z");
	
	$base_request .= "&Timestamp=" . $params['Timestamp'];
	
	$base_request = "";
	
	foreach ($params as $k => $v) {
		$base_request .= '&' . $k . '=' . rawurlencode($v);
		$params[$k] = rawurlencode($v);
	}
	
	$base_request = $baseurl . "?" . substr($base_request, 1);
	
	$base_request = preg_replace("/.*\?/", "", $base_request);
	
	$base_request = str_replace("&", "\n", $base_request);
	
	ksort($params);
	
	$base_request = "";
	
	foreach ($params as $k => $v) { $base_request .= "&" . $k . "=" . $v; }
	
	$base_request = substr($base_request, 1);
	
	$base_request = str_replace("&", "\n", $base_request);
	
	$base_request = str_replace("\n", "&", $base_request);
	
	$parsed_url = parse_url($baseurl);
	
	$base_request = "GET\n" . $parsed_url['host'] . "\n" . $parsed_url['path'] . "\n" . $base_request;
	
	$signature = base64_encode(hash_hmac('sha256', $base_request, Secret_Access_Key, true));
	
	$signature = rawurlencode($signature);
	
	$base_request = "";
	
	foreach ($params as $k => $v) { $base_request .= "&" . $k . "=" . $v; }
	
	$base_request = $baseurl . "?" . substr($base_request, 1) . "&Signature=" . $signature;
	
	$amazon_xml = simplexml_load_string(file_get_contents($base_request));
	
	$TotalResults = $amazon_xml->Items->TotalResults;
	
	$TotalPages = $amazon_xml->Items->TotalPages;
	
	foreach($amazon_xml->Items->Item as $item) {
		
		$item_image = $item->MediumImage->URL; // 商品画像
		
		$item_title = $item->ItemAttributes->Title; // 商品名
		
		$item_url = $item->DetailPageURL; // 商品のURL
		
		$item_formattedprice = $item->OfferSummary->LowestNewPrice->FormattedPrice; // 商品価格
		
		$item_author = $item->ItemAttributes->Author; // 著者
		
		$item_publicationdate = $item->ItemAttributes->PublicationDate; // 発売日
		
		$item_publisher = $item->ItemAttributes->Publisher; // 出版社
		
		$item_content = $item->EditorialReviews->EditorialReview->Content; // レビュー ?>
		
<div style="padding:5px 0 6px 0;"><div style="width:160px; height:160px; float:left;"><a href="<?php echo $item_url; ?>" target="_blank"><img class="img-responsive" src="<?php
if (isset($item_image)) {
echo $item_image; // サムネイル画像がある場合
} else {
echo "http://bit.ly/29Ikwlm"; // サムネイル画像がない場合
}
?>"></a></div>
<div style="margin-left:170px;">
<span style="font-weight:bold;"><a href="<?php echo $item_url; ?>" target="_blank"><?php echo $item_title; ?></a></span>
<?php
if (isset($item_formattedprice)) {
echo '<span style="color:#ff0000; font-weight:bold;">価格'.$item_formattedprice.'円</span><br />';
}
if (isset($item_author)) {
echo "<span>".$item_author."</span>";
}
if (isset($item_publisher)) {
echo "<span>".$item_publisher."</span>";
}
if (isset($item_publicationdate)) {
echo "<span>".$item_publicationdate."</span>";
}
if (isset($item_content)) {
echo "<span>".mb_strimwidth($item_content, 0, 380, '...', 'UTF-8')."</span>";
}
?>
</div>
<div style="clear:both; visibility:hidden; width:100%; height:10px;">クリア</div>
<hr style="width:100%; border:0; border-bottom:1px dashed #ccc; background-color:#999;" />
</div>
<?php } // foreach end
if(isset($item)){ echo "<span>全 ".number_format($TotalResults)." 数</span>"; }

// ページャー
echo '<p>';

$link_range = '2';

$url_a ="<a style='background-color: #ffffff; color: #ff0000; margin: 0; padding: 0.2em 0.5em; border: solid 1px; text-decoration: none;' href=\"?Keywords=$e_Keywords&ItemPage=";

$url_b ="\"";

$html_Page_Link = Page_Link($TotalPages,$ItemPage,$link_range,$url_a,$url_b);

echo $html_Page_Link;

function  Page_Link($TotalPages,$ItemPage,$link_range,$url_a,$url_b){

	$html = "";

	if($TotalPages < 1) return $html;

	if($ItemPage > 1) $html .= $url_a.($ItemPage-1).$url_b.' style="background-color: #ffffff; margin: 0; padding: 0.2em 0.5em; border: solid 1px; text-decoration: none;"'.">&laquo;</a>";

	$prevpage = $ItemPage - $link_range;

	while ($prevpage < $ItemPage) {

		$prevpage++;

		if($prevpage > 1) $html .= $url_a.($prevpage-1).$url_b.">".($prevpage-1)."</a>";

	}

	$html .= '<span style="	background-color: #ff0000; color: #ffffff; margin: 0; padding: 0.2em 0.5em; border: solid 1px #ff0000; text-decoration: none;">'.$ItemPage.'</span>';

	if($ItemPage < $TotalPages){

		$TotalPages = $TotalPages - $ItemPage;

		if($TotalPages > $link_range) $TotalPages=$link_range;

		$plus=0;

		while ($plus < $TotalPages) {

			$nextpage=$ItemPage+$plus+1;

			$html .= $url_a.$nextpage.$url_b.">".$nextpage."</a>";

			$plus++;
		
		}
		
	$html .= $url_a.($ItemPage+1).$url_b.' style="background-color: #ffffff; color: #ff0000; margin: 0; padding: 0.2em 0.4em; border: solid 1px; text-decoration: none;"'.">&raquo;</a>";
	
	}

return $html;

}

echo '</p>';

echo '</div>';

echo '</div>';

?>

タグ内に直接CSSを記述していますが、環境に応じて外部CSSファイルに移すなり、ご自由に改変してお使いください。

あくまでベースとしてご利用くだされば幸いです。

バリューコマースWEBサービスのサンプルコードのページでも解説しましたが、ワードプレス投稿欄でPHPを有効にするプラグインが導入されていれば、上のサンプルコードを貼り付けるだけで動作させるこができますが、ページ送りも含めて動作させるには、ワードプレスのURLリダイレクト機能の介入を回避する必要があります。

回避する方法についてはデモページで解説していますので、AWSの動作状況と合わせてご確認ください。

尚、ワードプレスの投稿欄に直接、上のサンプルコードを貼り付け、動作させる場合は、
サンプルコード冒頭の

echo '<div style="width:80%;margin:5% auto;">';
echo '<div style="margin:0; padding:0">';

サンプルコード最下部の

echo '</div>';
echo '</div>';

を削除してください。