Ruby 1.9.3向けwillnet-amazon-ecsのHMAC/SHA256処理部分の修正

RubyRailsでamazonの商品情報を使いたいと思い、amazon Web APIを調査した。

サービスの利用準備については、以下が参考となる。

Amazon Web サービス入門(Product Advertising API) (http://www.ajaxtower.jp/ecs/)

Gemにはamazon-ecsというライブラリがあり、それを使うと楽できそうだと分かる。

# gem install amazon-ecs

[Ruby][Gems]amazon-ecsを使用する (http://rubyist.g.hatena.ne.jp/pulscope/20070319/p2)

を参考として動作確認を試みるが、400 ERRORで動かない。原因は、リクエストメッセージに秘密鍵を使った署名が付いていない事のようだ。記事が古いことに気づく。

http://demenaoto.blogspot.jp/2009/08/ruby-on-rails-amazon-ecs-amazon-product.html

http://demenaoto.blogspot.jp/2009/08/ruby-on-rails-amazon-ecs-amazon-product_19.html

によると、amazon-ecsが署名認証をサポートしたような感じがするが、

http://blog.u-kipedia.com/blogs/10

によると、2012/02/28時点でやっぱりサポートしてないようだ。

そこで、署名認証をサポートしたwillnet-amazon-ecsを試す。

http://d.hatena.ne.jp/willnet/20090716/1247737270

指示に従ってインストールする。

これで大丈夫かと思いきや、hmac_sha256処理でエラーが発生する。

http://midorex.blogspot.jp/2009/06/amazon-web-with-ruby-191.html

によると、原因はRubyのバージョン違い(1.8系と1.9系)による変更に対応していないためのようである。Ruby初心者の私には、この理由を見つけるのに苦労した。

HMAC処理部分を以下のように修正する。

(Ruby 1.9.3, willnet-amazon-ecs 0.5.6) 

ecs.rbの225, 226行目

  ikey[i] = key[i] ^ ikey[i]

  okey[i] = key[i] ^ okey[i]

  ikey[i] = (key[i].ord ^ ikey[i].ord).chr

  okey[i] = (key[i].ord ^ okey[i].ord).chr

に修正する。

これでAmazon::Ecs.item_searchとかが使えるようになった。良かった。。