Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

AmazonとSOAP4Rで遊ぼう

NaHiに構成力があればなぁ。

wiki:AmazonとSOAP4R?と日本語で遊ぼう

Googleに引き続き、 Amazon.comも検索やショッピングカート機能をWebサービスで提供 しています。soap4rでいじってみましょう。

以前はGoogleと同じく、Amazon.comのWeb Servicesを利用する場合にも、まずAmazon.comでの 開発者登録が必要だったんですが、今はなくても使えるようです。機能に制限があるのかな? もし心配でしたら、以下のサンプルを動かす前に http://associates.amazon.com/exec/panama/associates/ntg/browse/-/1067662 を読み、(2)のリンク先からdeveloper's tokenを入手して、~/.amazon_keyに保存しておいてください。

ではAmazon.com内を検索するコードを書いてみます。 wiki:GoogleとSOAP4R?で遊ぼう のときは、WSDLを読ませてメソッドを叩けばいきなり 検索できましたが、Amazon.comの場合はちょっと準備が必要です。

GoogleWebAPIは、提供サービスの呼び出しパラメータが全て文字列や数値などの基本的な型だったのですが、 Amazon.com Web Servicesの場合は呼び出しパラメータが構造体になっています。 そのため、専用のクラス定義が必要になります。 Googleの場合はたくさんのパラメータを送りつける、という形でしたが、 Amazon.comは呼び出しパラメータ構造体に検索パラメータをセットし、 それを1つ送りつけると返事が返ってくる、という形になります。

ではキーワード検索呼び出しパラメータクラスを以下に。 どんなメソッドにどんなパラメータを渡すかについては、 Amazon.com Web Servicesのページから、Developer's Kitをダウンロードしてくると まとめられています。もちろん英語だけどね。

  class KeywordRequest
    def initialize( keyword = nil,
        page = nil,
        mode = nil,
        tag = nil,
        type = nil,
        devtag = nil,
        sort = nil )
      @keyword = keyword
      @page = page
      @mode = mode
      @tag = tag
      @type = type
      @devtag = devtag
      @sort = sort
    end
  end

↑では自分でクラスを定義しましたが、 ((<Amazon.comのWSDL|URL:http://soap.amazon.com/schemas2/AmazonWebServices.wsdl>)) から自動生成させる方法もあります。

  $ bin/wsdl2ruby.rb --wsdl http://soap.amazon.com/schemas2/AmazonWebServices.wsdl --classDef --force
  I, [2003-01-19T12:54:05.931448 #112]  INFO -- app: Start of app.
  I, [2003-01-19T12:54:08.260448 #112]  INFO -- app: Creating class definition.
  I, [2003-01-19T12:54:08.269448 #112]  INFO -- app: Creates file 'AmazonSearch.rb'.
  I, [2003-01-19T12:54:08.318448 #112]  INFO -- app: End of app. (status: 0)

AmazonSearch?.rbができているのでその中を見て、上記のKeywordRequest?クラスが定義されていること を確認してください((-他にもいろいろクラスができています。全65クラス…。 一通りクラスを見ると、どんな情報が取り出せるかがわかるでしょう-))。

では準備ができたので検索プログラムです。

  $ cat search.rb
  require 'soap/wsdlDriver'
  searchBook = ARGV.shift or raise
  # AmazonSearch.rbを生成しなかった場合、↓のかわりに、自分でKeywordRequestクラスを定義してください。
  require 'AmazonSearch.rb'

  devtag = "" # File.open(File.expand_path("~/.amazon_key")).read.chomp
  AMAZON_WSDL = 'http://soap.amazon.com/schemas2/AmazonWebServices.wsdl'
  amazon = SOAP::WSDLDriverFactory.new(AMAZON_WSDL).createDriver
  amazon.generate_explicit_type = true
  #amazon.wiredump_dev = STDERR

  # Show sales rank.
  req = KeywordRequest.new(searchBook, "1", "books", "webservices-20", "lite", devtag, "+salesrank")
  amazon.KeywordSearchRequest(req).Details.each do |detail|
    puts "== #{detail.ProductName}"
    puts "Author: #{detail.Authors.join(", ")}"
    puts "Release date: #{detail.ReleaseDate}"
    puts "List price: #{detail.ListPrice}, our price: #{detail.OurPrice}"
    puts
  end

KeywordRequest?クラスインスタンスに検索パラメータをセットし、KeywordSearchRequest?を 呼び出しています。sortパラメータに"+salesrank"を指定すると、売り上げ数順に並べ替えてくれるそうです。 では実行。

  $ ruby search.rb 'ruby programming'
  == Programming Ruby: A Pragmatic Programmer's Guide
  Author: David Thomas, Andrew Hunt, Dave Thomas
  Release date: 15 December, 2000
  List price: $42.95, our price: $42.95
  
  == The Ruby Way
  Author: Hal Fulton
  Release date: 17 December, 2001
  List price: $39.99, our price: $27.99
  
  == Sams Teach Yourself Ruby in 21 Days
  Author: Mark Slagell
  Release date: 22 March, 2002
  List price: $39.99, our price: $27.99
  
  == Making Use of Ruby
  Author: Suresh Mahadevan, Rashi Gupta, Shweta Bhasin, Madhushree Ganguly, Ashok Appu
  Release date: 15 July, 2002
  List price: $35.00, our price: $24.50
  
  == Solving Data Mining Problems Through Pattern Recognition (Bk/CD)
  Author: Ruby L. Kennedy, Yuchun Lee, Benjamin Van Roy, Christopher D. Reed, Richard P. Lippmann, Staff Unica Technology Incorpor
  Release date: 04 December, 1997
  List price: $69.93, our price: $69.93
  
  == Ruby Developer's Guide
  Author: Robert Feldt, Lyle Johnson, Michael Neumann, Lyle Johnson, Jonothon Ortiz
  Release date: 18 January, 2002
  List price: $49.95, our price: $34.97
  
  == Ruby In A Nutshell
  Author: Yukihiro Matsumoto, David L. Reynolds
  Release date: November, 2001
  List price: $24.95, our price: $17.47
  
  == Word Processing Applications for Microcomputers
  Author: Ralph, Ruby
  Release date: October, 1986
  List price: $19.10, our price: $19.10

やはりProgramming Rubyが一番でした。 む。Ruby Developer's Guideの作者にLyle Johnsonが2人居るようですが、 Amazon.comに連絡したほうがいいのかしらん。