完成形

広告

最後にAPIのバージョンを最新版の「2009-07-01」に変更し、リクエストの送信先を日本用である「ecs.amazonaws.jp」に変更しました。

またAccess KeyとSecret Keyを画面から入力できるように変更してあります。

URLエンコードに関してはencodeURIComponentだけでは不十分なものもあり、現在確認しているだけでも「(」「)」「!」は手動で変換しないと駄目でした。下記のコードではその部分を追加してあります。

sample7_1.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>署名認証テスト</title>
<script type="text/javascript" src="./js/jssha256.js"></script>
<script type="text/javascript" src="./js/base64.js"></script>
<script type="text/javascript" src="./js/script7_1.js"></script>
<link rel="stylesheet" href="./form.css" type="text/css" />
</head>
<body>

<div class="box">
<div class="subbox"><span>キーワード</span>
<input type="text" name="keyword" class="text" id="keyword" />
</div>
<div class="subbox"><span>アソシエイトID</span>
<input type="text" name="associate_tag" class="text" id="associate_tag" />
</div>
<div class="subbox"><span>AWS Access Key</span>
<input type="text" name="access_key" class="text" id="access_key" />
</div>
<div class="subbox"><span>Secret Access Key</span>
<input type="text" name="secret_key" class="text" id="secret_key" />
</div>
<div class="subbox"><span> </span>
<input type="button" name="checkbutton" value="check" onclick="getSignature()" />
</div>
</div>

</body>
</html>

script7_1.js

function getSignature(){
  var str_imestamp = getISO8601Timestamp();
  var access_key = document.getElementById("access_key").value;
  var secret_key = document.getElementById("secret_key").value;
  var keyword = document.getElementById("keyword").value;
  var associate_tag = document.getElementById("associate_tag").value;
  var url = "ecs.amazonaws.jp";

  var para = {
    "Service":"AWSECommerceService",
    "AWSAccessKeyId":access_key,
    "Operation":"ItemSearch",
    "ResponseGroup":"ItemAttributes",
    "Keywords":keyword,
    "AssociateTag":associate_tag,
    "ItemPage":"1",
    "SearchIndex":"Books",
    "Version":"2009-07-01",
    "Timestamp":str_imestamp
  };

  var para_array = [];

  for(var pname in para){
    var tmp = encodeURIComponent(para[pname]);
    tmp = tmp.replace("(", "%28");
    tmp = tmp.replace(")", "%29");
    tmp = tmp.replace("!", "%21");
    para_array.push(pname + "=" + tmp);
  }

  para_array.sort();

  var str_para = para_array.join('&');
  var str_signature = "GET" + "¥n" + url + "¥n" + "/onca/xml" + "¥n" + str_para;

  HMAC_SHA256_init(secret_key);
  HMAC_SHA256_write(str_signature);
  var array_hash = HMAC_SHA256_finalize();

  var str_hash = "";
  for (var i = 0; i < array_hash.length; i++) {
    str_hash += String.fromCharCode(array_hash[i]);
  }

  var signature = Base64.encode(str_hash);
  var para_signature = "&Signature=" + encodeURIComponent(signature);

  location.href = "http://" + url + "/onca/xml?" + str_para + para_signature;
}

function getISO8601Timestamp(){
  var d = new Date();

  var ye = d.getUTCFullYear();
  var mo = zeroPlus(d.getUTCMonth() + 1);
  var da = zeroPlus(d.getUTCDate());
  var ho = zeroPlus(d.getUTCHours());
  var mi = zeroPlus(d.getUTCMinutes());
  var se = zeroPlus(d.getUTCSeconds());

  return ye + "-" + mo + "-" + da + "T" + ho + ":" + mi + ":" + se + "Z";
}

function zeroPlus(value){
  return ("0" + value).slice(-2);
}

上記を実際にブラウザ見てみると次のように表示されます。

完成形

必要項目を入力して「check」ボタンを押すと次のように表示されます。

完成形

XSLTで整形してませんのでXSLデータそのままですが、一応結果は取得できるようになりました。

( Written by Tatsuo Ikura )