Amazon アソシエイト API 調べ(2)

ざっくりと整理したのでサンプルソースをアップ。

Amazon APIのRequestへの電子署名添付(PHP版) | Yama’s Memorandum
http://memorandum.yamasnet.com/archives/Post-320.html

のソースを改変して、画像を表示させるようにしたもの。

サンプルの動作は、http://moonmile.net/php/amazon.php で確認できる。

探したい本のキーワード(例. 増田智明)を入力して、送信ボタンを押すと、画像付きのリストが表示される。先頭の行は、戻されるXMLの確認用で、そのままURLで指定するとamazon apiの返信が見られる。

20100517_01

20100517_02

20100517_03

実際は、複数ページで返されるので、Items/TotalResults, Items/TotalPages をチェックしないといけないだが、今回は省略。

ひとまず、これで物欲webはできそうだ。

<?php
if ($_POST["submit"] == "送信")
{
// Access Key ID と Secret Access Key は必須です

$access_key_id = ''; // ここに Access Key ID を入力';
$secret_access_key = ''; // 'ここに Secret Access Key を入力';

// RFC3986 形式で URL エンコードする関数
function urlencode_rfc3986($str)
{
    return str_replace('%7E', '~', rawurlencode($str));
}

// 基本的なリクエストを作成します
// - この部分は今まで通り
$baseurl = 'http://ecs.amazonaws.jp/onca/xml';
$params = array();
$params['Service']        = 'AWSECommerceService';
$params['AWSAccessKeyId'] = $access_key_id;
$params['Version']        = '2009-03-31';
$params['Operation']      = 'ItemSearch'; // ← ItemSearch オペレーションの例
$params['SearchIndex']    = 'Books';
$params['Keywords']       = $_POST['kw'];     // ← 文字コードは UTF-8
$params['ResponseGroup'] ='Small,Images';

#$params['IdType'] = 'ASIN';
#$params['ItemId'] = '479801382X';

// Timestamp パラメータを追加します
// - 時間の表記は ISO8601 形式、タイムゾーンは UTC(GMT)
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');

// パラメータの順序を昇順に並び替えます
ksort($params);

// canonical string を作成します
$canonical_string = '';
foreach ($params as $k => $v) {
    $canonical_string .= '&'.urlencode_rfc3986($k).'='.urlencode_rfc3986($v);
}
$canonical_string = substr($canonical_string, 1);

// 署名を作成します
// - 規定の文字列フォーマットを作成
// - HMAC-SHA256 を計算
// - BASE64 エンコード
$parsed_url = parse_url($baseurl);
$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 を作成します
// - リクエストの末尾に署名を追加
$url = $baseurl.'?'.$canonical_string.'&Signature='.urlencode_rfc3986($signature);

# echo $url; // ← この URL にアクセスすれば、API リクエストができます

$response = file_get_contents($url);
$root = new SimpleXMLElement($response);
foreach ( $root->children() as $Items ) {
    if ( $Items->getName() == 'Items' ) {
        break;
    }
}

/*
$parsed_xml = simplexml_load_string($response);

  $Image_URL    = $parsed_xml->Items->Item->MediumImage->URL;
  $Title        = $parsed_xml->Items->Item->ItemAttributes->Title;
  $Author       = $parsed_xml->Items->Item->ItemAttributes->Author;
  $Creator      = $parsed_xml->Items->Item->ItemAttributes->Creator;
  $Creator_Role = $parsed_xml->Items->Item->ItemAttributes->Creator['Role'];
  $Publ_date    = $parsed_xml->Items->Item->ItemAttributes->PublicationDate;
*/
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?= $url ?>
<hr />
<table>
<? foreach ( $Items->children() as $Item ) {
    if ( $Item->getName() == 'Item' ) {
?>
<tr>
<td><a href="http://amazon.co.jp/dp/<?= $Item->ASIN ?>"><?= $Item->ASIN ?></a>
<td><img src="<?= $Item->SmallImage->URL ?>"
     width="<?= $Item->SmallImage->Width ?>"
     height="<?= $Item->SmallImage->Height ?>">

<td><?= $Item->ItemAttributes->Title ?>
</tr>
<? }} ?>
</table>

<?php
}
else
{
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
</title>
<body>
<form method="post" action="amazon.php">

<table>
<tr>
    <td>キーワード:</td>
    <td><input type="text" name="kw" /></td>
</tr>
    <td></td>
    <td><input type="submit" name="submit" value="送信" /></td>
</tr>
</table>
<?php
}
?>

カテゴリー: 開発 パーマリンク

Amazon アソシエイト API 調べ(2) への1件のコメント

  1. Hiroshi Ota のコメント:

    1234567890

コメントは停止中です。