Amazonから電子書籍の新着ラノベを取得する

下準備

アソシエイトプログラムだの、Product Advertising APIの登録だの、めんどくさい事が待ち受けている。

ここでは省略するが(俺がもうやることはないだろうから)、かわりに、よくまとまっているリンクを置いておく。

  1. http://www.ajaxtower.jp/ecs/pre/
  2. http://blog.makotokw.com/2014/05/21/get-aws-secret-access-key-for-amazon-product-advertising-api/

言うことがあるとしたら、ほとほとうんざりだ、ということぐらいか。

Product Advertising APIRubyから叩く

直接叩きたくはないので、先人のありがたいGemを使わせてもらう。 https://github.com/jugend/amazon-ecs

シンプルでなかなかよい。

config/initializers/amazon-ecs.rbに設定を置く。

Amazon::Ecs.configure do |options|
  options[:associate_tag] = 'your associate tag'
  options[:AWS_access_key_id] = 'your access key'
  options[:AWS_secret_key] = 'your secret key'
end

ひとまず商品検索してみた

何はともあれ、検索できなければお話しにならない。

適当にgeneratorでtaskを作って、中身を書く。

namespace :hello do
  desc "Sample"

  task :my_puts => :environment do
    options = { country: 'jp' }
    res = Amazon::Ecs.item_search("惑星のさみだれ", options)
    puts res.doc.to_s
  end
end

データは取れた。ちゃんとリスト返ってきてるっぽい。

KindleStoreから新着順で取得する

新着順で取得する

新着にするには、オプションにSortをdaterankで指定すれば良い。厳密には、商品のカテゴリ(と国?)によって指定できるsortが異なるが、本(BooksとKindleStore)ならdaterankはあるので、細かいことは考えずに済む。

http://docs.aws.amazon.com/AWSECommerceService/latest/DG/JPSortValuesArticle.html

KindleStoreから取る方法

KindleStoreのみから情報を取るには、SearchIndexかBrowseNodeを指定して、特定のカテゴリで絞る必要がある。

SearchIndexではKindleStoreでざっくり絞ることができるが、どうせこの後にラノベで細かく絞るのであまり意味がない。細かく絞るのはBrowseNodeで指定できるので、今回のケースだとこちらだけ使っておけば良い(と思う)。

別の観点で言うと、先ほどは検索ワード(惑星のさみだれ)を入れたものの、最終的には検索ワードなしで新着順で取りたい。この場合はSearchIndex単体だと取れないので、BrowseNodeを指定する。何故かは記述が面倒なので省略。

BrowseNodeのID

実は、KindleStoreのラノベのNodeIDは何か、ということをプログラム等で割り出す必要がある。

公式のNodeID一覧ページがどれもこれも腐っており、役に立つ資料が無い(いくつかページがあるが、JP用のIDリストでKindleStoreのラノベまで載っているものは2014/06/02時点では存在しないと思う)。

割り出し方はここでは省略するが、BrowseNodeLookupを使う。もしくは、Amazonのサイトに行って注意深くURLを見れば、そのページのタグIDが分かるかもしれない。

http://docs.aws.amazon.com/AWSECommerceService/latest/DG/BrowseNodeIDs.html

出来上がったもの

options = {
  country: 'jp',
  sort: 'daterank',
  browse_node: '2410280051'
}
res = Amazon::Ecs.item_search("", options)
puts res.doc.to_s

俺が見てるAmazonの新着と同じだ。よしよし。

あとは

ページネーションして数ページ入手したいところだが、ニートはもう寝る時間である。寝る。