2009年6月24日水曜日

AWSの署名に対応してみようかと

AmazonアソシエイトWebサービス(AWS)がProduct Advertising APIに変更になるのにあたり、リクエストに署名を付ける必要が生じます。Product Advertising APIへの完全移行まで2ヶ月を切ったので、そろそろ署名に対応しようと思いました。



私の運営しているWebサイトでAWSを利用しています。私のWebサイトはPHPで開発しています。AWSへのリクエストはfile_get_contents()で行い、SAXパーサでレスポンスを分解、処理しています。既存のロジックを変更しなくてもいいように、file_get_contents()に渡すURLを署名付きのURLに変換する関数を作ってみました。



define ('SECRET_KEY', 'みなさんの秘密鍵');
function SignAWSRequest($url) {
  $purl = parse_url($url);
  $scheme = $purl['scheme'];
  $host = $purl['host'];
  $path = $purl['path'];
  $query = $purl['query'];
  parse_str($query, $pquery);
  $pquery['Timestamp'] = gmdate("Y-m-d")."T".gmdate("H:i:s")."Z";
  ksort($pquery);
  $querystring = '';
  $keys = array_keys($pquery);
  for ($i = 0;$i < count($keys);$i++) {
    if ($i != 0) $querystring .= '&';
    $querystring .= $keys[$i] . "=" . rawurlencode($pquery[$keys[$i]]);
  }
  $sign = base64_encode( hash_hmac("sha256", "GET\n{$host}\n{$path}\n{$querystring}", SECRET_KEY, "TRUE"));
  return "{$scheme}://{$host}{$path}?{$querystring}&Signature={$sign}";
}



PHPなので簡単ですね。もっとエレガントな書き方があるかもしれませんが、諸先輩方にアドバイスをいただけると助かります。



ただ気になるのは、署名付きのリクエストを送信すると、かなりの確率で403エラーが発生します。作りの問題なのかどうか調べているところです。どなたかご助言をいただけると助かります。


今話題のエコポイント対象商品の表示に対応!!
ポイント数も一目でわかります。
検索機能もご提供開始!!



よりタイムリーに激安掘り出し物情報をお届け!メルマガ「”あまたつ”のAmazon価格急落激安速報!」創刊しました!!
【メルマで購読】
【まぐまで購読】



進化し続けるネットショップ”あまたつ”のAmazon特価検索で、最新特価商品を発掘しよう!!



0 件のコメント:

コメントを投稿