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