動かざることバグの如し

近づきたいよ 君の理想に

Amazon Product Advertising API使ってISBNから書籍検索

やりたいこと

Rubyにて、ISBN投げるだけで書籍名とか出版社が一発でポーンと帰ってくる魔法

用意するもの

キーの取得

これが一番面倒だった

www.ajaxtower.jp

アクセスキーとシークレットキーはrootユーザーでないとダメっぽい ソース

IAMは現在サポートされておりません。ルートアカウントのアクセスキーをご使用ください。

まずは叩いてみる

今回はRailsでの利用を想定している。 先人様が便利なgemを用意してくれたので使わない手はない

jugend/amazon-ecs · GitHub

Gemfilegem 'amazon-ecs'を追加するだけ

次にconfig/initializers/amazon-ecs.rbを新規作成して以下

Amazon::Ecs.configure do |options|
  options[:associate_tag] = 'アフィリエイトID-22'
  options[:AWS_access_key_id] = 'アクセスキー'
  options[:AWS_secret_key] = 'シークレットキー'
end

まずは単純に検索

Amazon::Ecs.debug = true
options = { country: 'jp' }
res = Amazon::Ecs.item_search("new game 2巻", options)
puts res.doc.to_s

実行結果は以下

Adding AWSAccessKeyId=************
Adding AssociateTag=********-22
Adding Keywords=new game 2巻
Adding Operation=ItemSearch
Adding SearchIndex=Books
Adding Service=AWSECommerceService
Adding Timestamp=2015-12-02T23:15:32Z
Adding Version=2011-08-01
Request URL: http://ecs.amazonaws.jp/onca/xml?AWSAccessKeyId=AKIAILDBTZAKHZP5QIEQ&AssociateTag=*****-22&Keywords=new%20game%202%E5%B7%BB&Operation=ItemSearch&SearchIndex=Books&Service=AWSECommerceService&Timestamp=2015-12-02T23%3A15%3A32Z&Version=2011-08-01&Signature=tYCJ0YdbzcwsVRukVwfKb%2FNFinZJnE%2Fx05TU7et4gjI%3D
<?xml version="1.0" encoding="UTF-8"?>
<ItemSearchResponse>
  <OperationRequest>
    <HTTPHeaders>
      <Header Name="UserAgent" Value="Ruby"/>
    </HTTPHeaders>
    <RequestId>26ee7f67-fca5-48bc-8a95-05627249bd81</RequestId>
    <Arguments>
      <Argument Name="AWSAccessKeyId" Value="**********"/>
      <Argument Name="AssociateTag" Value="*******-22"/>
      <Argument Name="Keywords" Value="new game 2巻"/>
      <Argument Name="Operation" Value="ItemSearch"/>
      <Argument Name="SearchIndex" Value="Books"/>
      <Argument Name="Service" Value="AWSECommerceService"/>
      <Argument Name="Timestamp" Value="2015-12-02T23:15:32Z"/>
      <Argument Name="Version" Value="2011-08-01"/>
      <Argument Name="Signature" Value="tYCJ0YdbzcwsVRukVwfKb/NFinZJnE/x05TU7et4gjI="/>
    </Arguments>
    <RequestProcessingTime>0.0245360000000000</RequestProcessingTime>
  </OperationRequest>
  <Items>
(略)
      <ItemAttributes>
        <Author>得能正太郎</Author>
        <Manufacturer>芳文社</Manufacturer>
        <ProductGroup>eBooks</ProductGroup>
        <Title>NEW GAME! 1巻 (まんがタイムKRコミックス)</Title>
      </ItemAttributes>
    </Item>
  </Items>
</ItemSearchResponse>

まぁ要領はわかった

ISBNを投げる

    # Amazon::Ecs.debug = true
    res = Amazon::Ecs.item_search(
      "9784797372274",
      search_index: 'Books',
      response_group: 'Medium',
      country: 'jp'
    )
    info = {
      title: res.first_item.get('ItemAttributes/Title'),
      author: res.first_item.get('ItemAttributes/Author'),
      publisher: res.first_item.get('ItemAttributes/Manufacturer'),
      published_date: res.first_item.get('ItemAttributes/PublicationDate')
    }
    puts info.to_s

結果

{:title=>"たのしいRuby第4版", :author=>"高橋 征義", :publisher=>"SBクリエイティブ", :published_date=>"2015-04-24"}

response_groupはどれほどの情報量を持ってくるかの値で指定できる値はSmall, Medium, Largeの三種類。Smallが一番スマートだけどpublished_dateが取得できないので断念。