2010-09-10

【Amazon】Amazon AWS APIについて

AmazonのAPIが変わって「Product Advertising API」というものになったらしい。
名前変わっただけか?と思ったんだけど、どうやらAPIへリクエストを出すときに「認証」する必要があるらしい。
RESTに関してPHPでちょっと作ってみたのでメモ。

ドキュメントURL http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/rest-signature.html

class Request
{
  const    AWS_ACCESS_KEY_ID  = 'AWSのアクセスキー';
  const    AWS_SECRET_KEY_ID  = 'AWSの秘密鍵  AWSに発行してもらうこと';
  const    AWS_END_POINT    = 'ecs.amazonaws.jp';
  const    REQUEST_METHOD    = 'GET';
  const    REQUEST_URI      = '/onca/xml';
 
  const    HASH_ALGO      = 'sha256';
 
  public static function get_hashed_url( $url )
  {
    $url = $url . '&Timestamp=' . self::get_timestamp();
   
    $ret = preg_match( '/^(.*?)\?/i', $url, $domains );
   
    $ret = preg_match( '/\?(.*?)$/i', $url, $params );
    $params[ 1 ] = str_replace( ':', '%3A', $params[ 1 ] );
    $params[ 1 ] = str_replace( ',', '%2C', $params[ 1 ] );
    $temp_request = $params[ 1 ];
    $temp_params = explode( '&', $temp_request );
    sort( $temp_params, SORT_STRING );
   
    $request = self::REQUEST_METHOD . "\n";
    $request .= self::AWS_END_POINT . "\n";
    $request .= self::REQUEST_URI . "\n";
    $request .= implode( '&', $temp_params );
   
    $hash = base64_encode( hash_hmac( self::HASH_ALGO, $request, self::AWS_SECRET_KEY_ID, true ) );
    $hash = urlEncode( $hash );
   
   
    return $domains[ 1 ] . '?' . implode( '&', $temp_params ) . '&Signature=' . $hash;
  }
 
  private function get_timestamp()
  {
    return date( 'Y-m-d', gmmktime() ) . 'T' . date( 'H:i:s', gmmktime() ) . 'Z';
  }
}

---

お知らせメールに
>we pay out hundreds of millions of dollars per year to websites that advertise our products.
とか書いちゃうところがすごいな。なかなかに大変みたい。

ZenBack

WebMoney ぷちカンパ