Amazon ECS 4対応

この日記の右側にある買う物/買った物リストは,Amazon ECSからrubyスクリプトでデータ拾ってきて作ってます.で,そのAmazon ECSに送ってるリクエストのバージョンが3.0で,この3.0が3月末で終わってしまうというので4.0へ移行しなければならないと.
んで,現在のrubyスクリプトはネットで調べたら出てきた↓のライブラリを使ってました.
RAA - ruby-amazon http://raa.ruby-lang.org/project/ruby-amazon
つまり,自分はろくにAmazon ECSのことを考えずに使えていたのですが….このライブラリの新バージョンもパッと見だとなさそうだし,自分で4.0用のリクエストを出してやらないと,となったわけです.とはいえ,仕組みが一切わかってなくて,Amazonから送られてきたメールに書いてある3.0と4.0の違いだけ見てもさっぱりわからんので,ぐぐってみた.

http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=Amazon+ECS+4

2番目うちの日記じゃないかw 役にたたねーw

で,探していくうちにAmazon ECS 4用のrubyライブラリもあるっぽいことがわかったんですが,なんかSVNリポジトリから拾えない….というわけでライブラリを使うのはあきらめて,自前でリクエストを送ることにした.

Amazon ECS 4.0 解説1 RESTリクエストのパラメータ:Goodpic http://www.goodpic.com/mt/archives2/2004/10/amazon_ecs_401.html

このページを参考にしてみた.今まで全然こういうWebService系のことわかってなかったんですが,URLにパラメータをいっぱいくっつけてリクエストを送ると,諸々のデータがくっついたXMLが帰ってくる,っていう感じなのね.いや,Amazonがこうだからみんなどこもそうだとは思わないけど,でもみんなこんな感じなのではないかと推測.

で,リクエストのURLはこんな感じ.

http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&SubscriptionId=登録したID&AssociateTag=アソシエイトのID&Operation=ItemLookup&IdType=ASIN&ItemId=商品のASIN

で返ってくるのが↓になると.

  <?xml version="1.0" encoding="UTF-8" ?> 
  <ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
  <OperationRequest>
  <HTTPHeaders>
  <Header Name="UserAgent" Value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) Sleipnir/2.6.2" /> 
  </HTTPHeaders>
  <RequestId>1V9ZKXEQG10XXWA6EYFX</RequestId> 
  <Arguments>
  <Argument Name="AssociateTag" Value="neshackfactor-22" /> 
  <Argument Name="ItemId" Value="B0012DUDWO" /> 
  <Argument Name="Service" Value="AWSECommerceService" /> 
  <Argument Name="SubscriptionId" Value="" /> 
  <Argument Name="Operation" Value="ItemLookup" /> 
  <Argument Name="IdType" Value="ASIN" /> 
  </Arguments>
  <RequestProcessingTime>0.0133321285247803</RequestProcessingTime> 
  </OperationRequest>
  <Items>
  <Request>
  <IsValid>True</IsValid> 
  <ItemLookupRequest>
  <IdType>ASIN</IdType> 
  <ItemId>B0012DUDWO</ItemId> 
  </ItemLookupRequest>
  </Request>
  <Item>
  <ASIN>B0012DUDWO</ASIN> 
  <DetailPageURL>http://www.amazon.co.jp/gp/redirect.html%3FASIN=B0012DUDWO%26tag=neshackfactor-22%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/B0012DUDWO%253FSubscriptionId=</DetailPageURL> 
  <ItemAttributes>
  <Artist>KOTOKO</Artist> 
  <Creator Role="アーティスト">KOTOKO</Creator> 
  <Creator Role="その他">高瀬一矢</Creator> 
  <Creator Role="その他">C.G mix</Creator> 
  <Manufacturer>Geneon =music=</Manufacturer> 
  <ProductGroup>Music</ProductGroup> 
  <Title>BLAZE(DVD付初回限定盤)</Title> 
  </ItemAttributes>
  </Item>
  </Items>
  </ItemLookupResponse>

で,あとはこれを適当に解釈してやればいいわけだ.まあこれだと情報が少ないので&ResponseGroup=Mediumをくっつけてやって発売日とかも拾うんですが.
ただ,Amazonっていちいち作者の種類が細かく分かれてて,上のを見ればわかるように音楽はArtistになってるし,本はAuthorになってるし,おもちゃとかはManufacturerしかない.統一的に取得できないのかなぁ.

まあそんなわけで簡単に対応できました.本当はXMLのパーサとか通すんだろうけど,また調べるのもめんどくさいので↓みたいな超やる気のない形に…w 動けば良いんだ!動けば! てか必要な情報の抜き出ししてる部分にしても,もっときれいに書けるよなw

$search_url = "http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&SubscriptionId=" + $AWS_KEY + "&AssociateTag=" + $ASSOCIATE_ID + "&Operation=ItemLookup&IdType=ASIN&ResponseGroup=Medium&ItemId="

################################################################################
# Amazon Web Serviceを利用したデータ取得
# data[0] = date
# data[1] = URL
# data[2] = Name
# data[3] = artist or author
################################################################################

def search_by_asin(asin)
	data = []
	xml = open($search_url + asin).read

	data[0] = xml[/<[a-zA-Z]+Date>[0-9\-]*<\/[a-zA-Z]+Date>/]
	if data[0] != nil then
		data[0] = data[0].sub(/<[a-zA-Z]+Date>/, "").sub(/<\/[a-zA-Z]+Date>/, "")
	else
		data[0] = "xxxx-xx-xx"
	end

	data[1] = "http://www.amazon.co.jp/exec/obidos/ASIN/" + asin + "/" + $ASSOCIATE_ID

	data[2] = xml[/<Title>[^<]+<\/Title>/]
	if data[2] != nil then
		data[2] = data[2].sub(/<Title>/, "").sub(/<\/Title>/, "")
	end

	data[3] = xml[/<Artist>[^<]+<\/Artist>/]
	if data[3] != nil then
		data[3] = data[3].sub(/<Artist>/, "").sub(/<\/Artist>/, "")
	else
		data[3] = xml[/<Author>[^<]+<\/Author>/]
		if data[3] != nil then
			data[3] = data[3].sub(/<Author>/, "").sub(/<\/Author>/, "")
		else
			data[3] = "xx"
		end
	end
	return data
end