kaeruspoonのamazon機能で使用するサービスをAWS3.0からECS4.0に移行しました。当然Ruby/Amazonは使えないので、net::httpでXMLを取得してREXMLでパースしています。

require 'net/http'
require "rexml/document"
 
class AmazonList < ActiveRecord::Base
  include REXML
 
  ASSOCIATE_TAG = 'アソシエートID'
  AWS_ACCESS_KEY_ID = 'AWSのアクセスID'
  SEARCH_ELEMENT = 'ItemLookupResponse/Items/Item/'
 
  def self.find_web(asin)
    Net::HTTP.version_1_2
 
    item = self.find_by_asin(asin)
    if (item == nil) || (item.updated_on.to_time.since(7.days) < Time.now)
      amazon_list = Hash.new
      Net::HTTP::start('webservices.amazon.co.jp') do |http|
        response = http.get("/onca/xml?Service=AWSECommerceService&\
                             AWSAccessKeyId=#{AWS_ACCESS_KEY_ID}&\
                             AssociateTag=#{ASSOCIATE_TAG}&\
                             Operation=ItemLookup&\
                             ItemId=#{asin}&\
                             ResponseGroup=Medium")
        elements = Document.new(response.body).elements
 
        elements.each("#{SEARCH_ELEMENT}MediumImage/URL")  do |element|
          amazon_list[:image_url_medium] = element.text
        end
 
        elements.each("#{SEARCH_ELEMENT}SmallImage/URL") do |element|
          amazon_list[:image_url_small] = element.text
        end
 
        elements.each("#{SEARCH_ELEMENT}ItemAttributes/Title") do |element|
          amazon_list[:product_name] = element.text
        end
 
        elements.each("#{SEARCH_ELEMENT}DetailPageURL") do |element|
          amazon_list[:url] = element.text
        end
 
        elements.each("#{SEARCH_ELEMENT}ItemAttributes/Manufacturer") do |element|
          amazon_list[:manufacturer] = element.text
        end
 
        elements.each("#{SEARCH_ELEMENT}ItemAttributes/Binding") do |element|
          amazon_list[:media] = element.text
        end
 
        elements.each("#{SEARCH_ELEMENT}ItemAttributes/ReleaseDate") do |element|
          amazon_list[:release_date] = element.text
        end
 
        elements.each("#{SEARCH_ELEMENT}ItemAttributes/PublicationDate") do |element|
          amazon_list[:release_date] = element.text
        end
 
        authors = Array.new
        elements.each("#{SEARCH_ELEMENT}ItemAttributes/Author") do |element|
          authors << element.text
        end
        amazon_list[:authors] = authors.join(',') unless authors.empty?
 
        artists = Array.new
        elements.each("#{SEARCH_ELEMENT}ItemAttributes/Artist") do |element|
          artists << element.text
        end
        amazon_list[:artists] = artists.join(',') unless artists.empty?
      end
 
      if item
        item.update_attributes(amazon_list)
      else
        amazon_list[:asin] = asin
        item = self.new(amazon_list)
        item.save
      end
    end
 
    return item
  end
end

とりあえず動くようにしただけですが、ちょっとなんとかしたいです。あまり美しくない感じ。REXMLをもうちょっと調べてみようかな。ちらりとオンライン上のドキュメントを見ただけなので。続きは今度です。検索機能も早くつけてしまおう。

 kaeruspoonに関しては、Ajaxチャットも作ろうと考えていたのでした。忘れてたよ。執筆と開発とを一日ごとにやりながらぼちぼち進めていきましょう。