11/03/2011

amazon/ecs rubyでISBNを検索する(改訂版)

以前のエントリ「 rubyでISBNを検索する (2009/10/17)」で作ったスクリプトが、昨日から動かなくなった。そう言えば、Amazonから何か連絡が来ていたような気がする。あわてて検索すると、確かに、
重要:アマゾンProduct Advertising APIの仕様変更について
(途中略)
全てのAPIへのリクエストにおいて、AssociateTagが必須パラメータとなり、リクエスト処理時の確認対象となります。
(以下略)
となっている。
仕方が無いので、リクエストにAssosicate Tagを追加して送るように書き換えてみたが、動かない。同時に、検索結果として戻って来るxml (WSDL)の体系も変更になったようだ。それも書き換えて、さあどうだ!と思ったが、今度は検索結果が文字化けしている。
(2012年6月29日追記:amazon/ecsの最新バージョン(2.2.4)では、文字化けは解消されている)

いろいろググったあげく、使っているモジュール(amazon/ecs)の一部を直に書き換えれば対応できることが分かった。(ここに辿り着くまで約1日)
備忘のために、手順を記しておく。

  1. githubからamazon/ecsのソース(ecs.rb)をダウンロードし、保存
  2.  ecs.rbの141行目を書き換え
    @doc = Nokogiri::XML(xml)
     ↓
    @doc = Nokogiri::XML(xml, nul, 'UTF-8')
  3. オリジナルのスクリプトに記載しているrequire文もそれに合わせ修正

(2011年11月13日追記)
予想外に何件かのアクセスがあったので、簡単なソースを紹介。スクリプト名は"test.rb"。

require 'rubygems'
require 'amazon/ecs'

# パラメータ設定( associate tag, access key, secret key)
Amazon::Ecs.options = {
 :associate_tag => '[your associate tag]',
 :AWS_access_key_id => '[your developer token]',       
 :AWS_secret_key => '[your secret access key]'
}

# amazon-ecsの呼び出し
# ruby スクリプト名 ISBNの形式で実行する
#(ARGV[0]にはISBNが入る)
res = Amazon::Ecs.item_search(
        ARGV[0],
        {:search_index => 'Books', 
         :response_group => 'Medium',
          :country => 'jp'})

#結果の表示(著者名等は適宜追加)
res.items.each do |item|
    print "ASIN= ", item.get('ASIN'), "\n"
    print "Title= ",   item.get('ItemAttributes/Title'), "\n"
end


結果:
$ ruby test.rb 9784101181066
ASIN= 4101181063
Title= マキアヴェッリ語録 (新潮文庫)