投稿者 itouhiro
タグ [ Amazon blog Ruby ]

Amazon Webサービスを使ってみる

Amazonアソシエイトを使って、このブログでアフィリエイトをしようと思います。 本の画像のURLなどを得るために、Amazon Webサービスを使用する必要があります。

Amazon Webサービスについて調べると、 いまは ECS4.0 というのを使う必要があるようです。ECS(AWS) 3.0というのは2008/3/31で廃止されるので。

私はこのブログを Ruby言語で作成しているので、Amazon Webサービス(A2S)もRubyから使いたい。

Ruby で A2S

RubyでAmazonにアクセスするサンプルをgoogle検索したら、 ruby-amazon というのがありましたが、 これはECS(AWS)3.0を使っているのでパスです。

ライブラリに頼らず直接アクセスしてみよう……、すごく簡単でした。

ITmedia エンタープライズ:第5回 Amazon Webサービスを料理してみる で Amazon Webサービスの使いかたの概要がわかりました。

「HTTPのGETメソッドでアクセス」ていうと難しそうだけど、単にブラウザの URL欄に http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&Operation=ItemLookup&AWSAccessKeyId=XXXXXXX&AssociateTag=YYYYYYY-22&ItemId=4873113008&ResponseGroup=Large って入力することなんだよね。(このURLはAWSAccessKeyId のとこだけ書き換えてあります)

このURLをブラウザで見ると XMLが返ってくるのですが、Firefoxではこんな感じで表示されます。

XML_in_Firefox

これをファイルに落として、XML解析して情報を取り出す Rubyプログラムを作成しました。(『Rubyレシピブック』に書いてあったサンプルを参考にしました)

a2s_http_client.rb:

# for Cygwin: export http_proxy=http://proxy.foo.co.jp:10080
require 'open-uri'
AMAZON_ACCESS_KEY='XXXXXXX'
AMAZON_ASSOCIATE_ID='YYYYYYY-22'
amazon_asin='4873113008'
xml = ''
open("http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&Operation=ItemLookup&AWSAccessKeyId=#{AMAZON_ACCESS_KEY}&AssociateTag=#{AMAZON_ASSOCIATE_ID}&ItemId=#{amazon_asin}&ResponseGroup=Large"){|f|
  xml += f.read()
}
print(xml)

a2s_parse_xml.rb:

require 'rexml/document'
AMAZON_ASSOCIATE_ID='YYYYYYY-22'
amazon_asin='4873113008'
fin = STDIN.gets
doc = REXML::Document.new(fin)

title = doc.elements["/ItemLookupResponse/Items/Item/ItemAttributes/Title"].text
author = doc.elements["/ItemLookupResponse/Items/Item/ItemAttributes/Author"].text
publisher = doc.elements["/ItemLookupResponse/Items/Item/ItemAttributes/Publisher"].text
date = doc.elements["/ItemLookupResponse/Items/Item/ItemAttributes/PublicationDate"].text
img_url = doc.elements["/ItemLookupResponse/Items/Item/SmallImage/URL"].text
img_w = doc.elements["/ItemLookupResponse/Items/Item/SmallImage/Width"].text
img_h = doc.elements["/ItemLookupResponse/Items/Item/SmallImage/Height"].text
review = doc.elements["/ItemLookupResponse/Items/Item/CustomerReviews/Review/Summary"].text
rating = doc.elements["/ItemLookupResponse/Items/Item/CustomerReviews/AverageRating"].text

STDOUT.puts %Q@<a href="http://www.amazon.co.jp/exec/obidos/ASIN/#{amazon_asin}/#{AMAZON_ASSOCIATE_ID}/ref=nosim"><img src="#{img_url}" width="#{img_w}" height="#{img_h}" /> #{title}</a><br />#{author}<br />#{publisher} #{date[0,7]}<br />#{rating}<br />#{review}@

a2s_http_client.rbを実行すると XMLを出力します。 a2s_parse_xml.rbを実行すると、入力された XMLから取り出した情報を HTMLとして出力します。文字コードはUTF-8なので、HTMLファイルを開いたあと、[表示 - エンコード] を UTF-8 にする必要があるかもしれません。

使い方:

[cygwin]$ ruby a2s_http_client.rb >amz.xml
[cygwin]$ ruby a2s_parse_xml.rb <amz.xml >test.html

取得したHTMLの例

RESTリクエスト生成法

で、問題はその URLの作り方です。 先ほどのURLをわかりやすく分割すると、

http://webservices.amazon.co.jp/onca/xml
?Service=AWSECommerceService
&Operation=ItemLookup
&AWSAccessKeyId=XXXXXXX
&AssociateTag=YYYYYYY-22
&ItemId=4873113008
&ResponseGroup=Large

こうなります。AWSAccessKeyIdは「登録ID」、AssociateTagはアソシエイトIDで、この2つは人によってちがうものを使います。 ItemIDは ASINといわれる Amazonの商品番号です。

いちばん知りたいのは ResponseGroup で、これが商品のどの情報を取り出すか指定しています。 日本語だと Memo - Amazon APIがまとまっていましたが、 最新版の情報はどこにあるのか探しました。

Amazon Web Services Developer Connection : Technical Documentation の いちばん新しい 'Docs: Amazon Associates Web Service' 文書を開いて、[A2S API Reference - A2S Response Groups] を見るといいようです。

でもそこに載ってる ResponseGroup 使っても以下のエラーが出てしまった。何かまちがえてる?

<Error>
<Code>AWS.InvalidResponseGroup</Code>
<Message>
Your ResponseGroup parameter is invalid. Valid response groups for  requests include
Request, ItemIds, Small, Medium, Large, Offers, OfferFull, OfferSummary, OfferListings,
PromotionSummary, PromotionDetails, Variations, VariationImages, VariationMinimum,
VariationSummary, TagsSummary, Tags, VariationMatrix, VariationOffers, ItemAttributes,
MerchantItemAttributes, Tracks, Accessories, EditorialReview, SalesRank, BrowseNodes,
Images, Similarities, Subjects, Reviews, ListmaniaLists, SearchInside, PromotionalTag,
AlternateVersions, Collections, ShippingCharges.
</Message>
</Error>

この商品 'Perlベストプラクティス' の通常のAmazonページにある 文字列で、XMLで取れないのがあるんですよ。
[商品の説明 - 内容(「BOOK」データベースより)] の内容、すなわち以下の文字列

著者の22年間にわたるプログラミング経験による200を超えるガイドラインで学ぶ真のテクニック。

なのですが、RequestGruop をいろいろ変えてみたけど見つからなかった。これを取得するのはムリなのかな?

itemRubyレシピブック 第2版 268の技
青木 峰郎
ソフトバンク クリエイティブ (2007-02)
「プログラム言語一つにつきレシピ本は持っておくべき。」

タグ [ Amazon blog Ruby ]
固定リンク http://ai11.net/2007/11/28/
ブックマーク はてなブクマ登録 Yahoo!ブクマ登録