Mashupを作ろう

RoRでAmazon Associate Web Serviceを使う

  • Currently 0.00/5
  • 1
  • 2
  • 3
  • 4
  • 5
(回数:0)

Picture 12-1

では前回の続きで、まずはAmazon ECS改め、Amazon Associates Web Serviceを使った検索を行えるようにします。利用するのはamazon-ecsライブラリで、gemを使ってインストールできます。

$ sudo gem install amazon-ecs

このライブラリを使えばAmazon Associates Web Serviceへのアクセスはごく簡単になります。まず、config/environment.rbに次のように記述します。

# Include your application configuration below
require ‘amazon/ecs’
Amazon::Ecs.debug = true
Amazon::Ecs.options = {
:aWS_access_key_id => “[your access key]”,
:associate_tag => “[associate id]-22″,
:country => :jp
}

この状態で、consoleを実行します。

$ ruby script/console
>> res = Amazon::Ecs.item_search(”HTML”)
>> res.items.length
=> 10
>> res.items.each do |item|
?> p item.get(”itemattributes/title”)
>> end
“できる大事典 HTML & CSS (できる大事典)”
“できるホームページHTML入門 Windows対応 (できるシリーズ)”
“HTML&スタイルシートレイアウトブック 改訂版”
“HTMLとスタイルシートによる最新Webサイト作成術―ホームページでなにを伝える?どう作る?”
“ケータイHTMLコンパクトリファレンス (Compact Reference)”
“詳解HTML&XHTML&CSS辞典 第3版”
“HTML/XHTML&スタイルシートレッスンブック―ステップバイステップ形式でマスター##きる”
“WebクリエイティブのためのDOM Scripting (Web Designing Books)”
“スタイルシート スタンダード・デザインガイド―SEO/ユーザビリティ/アクセシビリティを考慮した実践的HTML&CSSデザイン術”
“速習Webデザイン HTML&スタイルシート (Quick master of web design)”

このようにごく簡単にデータが取得できるようになります。この結果のオブジェクトについては以下のようになっています。

# 正しいリクエストかどうか
res.is_valid_request?

# エラーがあるかどうか。なければfalseが返ってきます。
res.has_error?

# エラーのメッセージ
res.error

# トータルページ数
res.total_pages

# 結果の数
res.total_results

# 表示している結果ページ
res.item_page

また、各商品の情報についてはXPathを使って取得できます。したがって、

# Amazonの商品番号
asin

# 詳細ページのURL
detailpageurl

# 著者
author

# 制作者
creator

# 製造者
manufacturer

# 商品種別
productgroup

# 商品名
title

さらに検索時の条件として「:response_group => ‘Large’」を付与することで、結果の内容に以下が追加されます。

# 売り上げ順位
salesrank

# 小さな画像
smallimage
url
height
width

# 中くらいの画像
mediumimage

# 大きな画像
largeimage

# イメージセット
imagesets

binding
形式

EANコード
ean

# ISBN
isbn

# ラベル
label

# 金額
listprice/amount

# 金額の単位
currencycode

# フォーマットされた金額
formattedprice

# ページ数
numberofpages

# 商品の形状、重さ
packagedimensions
height
length
weight
width

# 出版日
publicationdate

# 出版社
publisher

# スタジオ
studio

# マーケットプレイスの情報
offersummary
lowestnewprice
amount
currencycode
formattedprice
lowestcollectibleprice
amount
currencycode
formattedprice
totalnew
totalused
totalcollectible
totalrefurbished

offers
totaloffers
totalofferpages
offer
merchant
merchantid
glancepage
offerattributes
condition
subcondition
offerlisting
offerlistingid
price
amount
currencycode
formattedprice
availability
iseligibleforsupersavershipping

# ユーザレビュー
customerreviews
averagerating
totalreviews
totalreviewpages
review
asin
rating
helpfulvotes
customerid
totalvotes
date
summary
content

# 似たような商品の情報
similarproducts
similarproduct
asin
title

# ジャンル情報
ancestors
browsenode
browsenodeid
name

# リストマニアの情報
listmanialists
listmanialist
listid
listname

そして、ユニットテストを書くとすると次のようになります。

def test_amazon
res = Amazon::Ecs.item_search(”HTML”, :response_group => ‘Large’)
assert_equal true, res.is_valid_request?
assert_equal false, res.has_error?
msg = “Your ResponseGroup parameter is invalid. Valid response groups for requests include Request, ItemIds, Small, Medium, Large, Offers, OfferFull, OfferSummary, OfferListings, PromotionSummary, PromotionDetails, VariationMinimum, VariationSummary, VariationMatrix, VariationOffers, Variations, TagsSummary, Tags, ItemAttributes, MerchantItemAttributes, Tracks, Accessories, EditorialReview, SalesRank, BrowseNodes, Images, Similarities, Subjects, Reviews, ListmaniaLists, SearchInside, PromotionalTag, SearchBins, AlternateVersions, Collections.”
res = Amazon::Ecs.item_search(”HTML”, :response_group => ‘Large2′)
assert_equal false, res.is_valid_request?
assert_equal true, res.has_error?
assert_equal msg, res.error
end

では実際にこれを実装してみます。前回と同じく、item_controller.rbに対して実装しますが、一緒にAjax化することにします。RailsであればAjax化するのも簡単です。

<%= form_remote_tag(:update => “search_result”, :url => { :controller => :item, :action => :search }, :loading => ‘$(”loading”).style.display=”inline”;’, :complete => ‘$(”loading”).style.display=”none”;’ ) %>
<p><%= text_field_tag :keyword %></p>
<p><%= radio_button_tag :search_type, ‘rakuten’, true %><%=h _(”Rakuten”) %></p> /
<p><%= radio_button_tag :search_type, ‘amazon’, false %><%=h _(”Amazon”) %></p>
<%= submit_tag _(’Submit’) %>
<%= end_form_tag %>

<div id=”loading” style=”display:none”><%=h _(”Loading…”)%></div>
<div id=”search_result”>
</div>

これで検索開始した時にLoading…と表示されて、検索結果はsearch_resultというIDの中に出るようになります。検索時に楽天、またはAmazonのサービスを指定するようにしました。

item_controller.rbの方は以下のようになります。

case params[:search_type]
when ‘rakuten’
developer_id = RakutenWebService::DEVELOPER_ID
url = RakutenWebService::ItemSearch::URL_Builder.new developer_id
url.keyword = params[:keyword]
rakuten = RakutenWebService::ItemSearch::Result.new url.build
@header = rakuten.header
@items = rakuten.items
when ‘amazon’
res = Amazon::Ecs.item_search(params[:keyword], :response_group => ‘Large’)
@header = res
@items = res.items
end

検索時の指定によって、サービスを変えています。また、GetTextを使って、他言語対応しています。

この結果は次のようになります。

Picture 11-1
楽天(デフォルト)またはAmazonを使って検索します。検索結果は商品名と画像だけの簡単なものになります。

Picture 10-1
次回はデータの登録インタフェースを作って、多少楽しめるようにする予定です。尚、ソースは既にコミットしてありますので、10pockets - Google Codeよりダウンロードできます。また、動作を試すのは10pockets.comにて可能です。

2008-02-04 by Mashupedia運営管理者

関連Web API

Web API 商品検索の代表「Amazon Associates Web Service (A2S)」

Amazonの商品情報を検索する、旧Amazon ECSです。もっと見る