投稿者 itouhiro
タグ [ Amazon blog Ruby ]
Amazonアソシエイトを使って、このブログでアフィリエイトをしようと思います。 本の画像のURLなどを得るために、Amazon Webサービスを使用する必要があります。
Amazon Webサービスについて調べると、 いまは ECS4.0 というのを使う必要があるようです。ECS(AWS) 3.0というのは2008/3/31で廃止されるので。
私はこのブログを Ruby言語で作成しているので、Amazon Webサービス(A2S)もRubyから使いたい。
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解析して情報を取り出す 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
で、問題はその 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 をいろいろ変えてみたけど見つからなかった。これを取得するのはムリなのかな?
![]() | Rubyレシピブック 第2版 268の技 |
| 青木 峰郎 ソフトバンク クリエイティブ (2007-02) 「プログラム言語一つにつきレシピ本は持っておくべき。」 |
タグ [ Amazon blog Ruby ]
固定リンク http://ai11.net/2007/11/28/
ブックマーク ![]()