Amazon の Product Advertising API で遊んでみた

昨日は[@7404](http://qiita.com/7404)さんによる[非エンジニアがおくる 関数ゴリ押しデータ抽出&集計](http://qiita.com/7404/items/506e0f31e93c8ad2219d)でした。

はじめまして。masahixixiです。
お前、初日に3枚書いてたよなって？人生色々あるみたいです。4枚とは気でも狂ったとしか思えません。

さて、昨日の記事でもご紹介頂いておりましたとおり、クレイジーな土日にしましょうと誓いあったんですがいかんせんネタがありません。[ネタがないというネタ](http://qiita.com/masahixixi/items/b5d162a4d106bb567d5a)まで使いました。お互いにこんなネタでいこうかと思うんですが...と話し合ったりもしたんですがこれがなかなか大っぴらに記事にするのはダメでしょうというネタばかりで「」こんな感じでした。楽しいネタはグレーゾーンと世知辛い世の中です。（ぉぃ

# ぼくはもう疲れたんだ
すいません、軽めに流させてください。4枚ですよ、4枚。
主催者だろうー！どうなってんだー！気合入れろー！筋トレはどうしたー！と野次が聞こえてきそうですが、まぁそう言わんでください。あと筋トレはやってます。
ほんとは rails5 へのアップデートを土日でやるはずでした。けどNetflixが攻殻機動隊を配信しやがりくださったおかげで打ち砕かれました。とりあえずゴーストのせいにしておきます。この記事を書いている今（土曜日の22:30） 時点で10話くらいまで消化。ほんと、幸せ♡

# 楽しいネタじゃないと記事書けない
言い訳が長い？もう少し付き合ってください。どうかお願いします。
4枚目なんですよ...なんせ...さすがに書いていて心から楽しいと思える記事じゃないと気がもちません。

# そうか、やはり筋肉か
なるほど、ここでマッスルエンジニアリングか。着想は得た。いざ実装だ。
筋肉はすべてを解決するというのはどうやらアドベントカレンダーにも通用するらしい。

# 皆に問おう、こんなことはなかろうかと
買おうと思ったサプリやプロテインがアマゾンで売り切れていた、なんてことはなかろうか？
ちなみに、ぼくはまだない。なのでリスクヘッジという意味合いが強い。
万に一つこのようなことが起こってしまってはいけないし、もし起こったとするなら愛すべき我が筋肉への打撃を考えるだけで会社を休んでしまうリスクすらある。想像するだけで涙が溢れてしまうような悲劇、必ずや回避せねばならん。

## 準備運動
まずは軽めに筋トレをしてください。話はそれからです。

* [Product Advertising API（リンク作成用API）](https://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html)

愚直にクロールして終わろうかなと思ってたんですけど、こんなのがあるみたいです。初めて知りました。正直これの存在知れただけでも4枚目やった価値がありました。

> Product Advertising API は、Amazon の商品情報や関連コンテンツをプログラムを通してアクセスできるサービスを提供することで、Web 開発者の皆様が、ご自分の Web サイトでAmazon の商品を紹介することによる紹介料の獲得を可能とします。

むむ。イケそうな気がするな。追加調査のお時間です。

* [【AmazonAPI】APIを使ってAmazonの在庫状況を取得しよう（Amazon Product Advertising API）] (http://blog.malor.net/entry/2016/03/17/000000)

おぉ！！これだぁぁ！！~~丸パクりできるやつ！！（ぉぃ~~
ruby っていいですよねぇ。

どうやら専用の登録がいるようですね。ささっとやっちゃいましょう。無料のようですし。

シークレットキーの登録等もいるみたいです。上記ブログと [Amazon Product Advertising APIで使うシークレットアクセスキーを取得する](http://blog.makotokw.com/2014/05/21/get-aws-secret-access-key-for-amazon-product-advertising-api/)　あたりを参考に。公式読めって？まぁまぁ。

## ワークアウト開始
準備が出来ましたか、ではまずジムで高負荷トレーニングをして筋繊維をブチブチに引きちぎってください。話はそれからです。

さくさくっと動かしてみましょう。ちなみに動いたら終わる予定でいます。早く草薙素子に会いたい（ぁ

```ruby
require 'amazon/ecs'
require 'pp'
require 'rexml/document'

Amazon::Ecs.configure do |options|
  options[:AWS_access_key_id] = '筋肉っていいよ'
  options[:AWS_secret_key]    = '筋肉サイコー！'
  options[:associate_tag]     = '取得したタグ'
  options[:search_index]      = 'テキトーに探す'
  options[:response_group]    = 'ItemAttributes'
  options[:country]           = 'jp'
end

xml = Amazon::Ecs.item_search('ホエイプロテイン').doc.to_s
doc = REXML::Document.new(xml)
puts doc
```

超雑。もうこれでいいや。

```
<ItemSearchResponse>
  <OperationRequest>
    <HTTPHeaders>
      <Header Name='UserAgent' Value='Ruby'/>
    </HTTPHeaders>
    <RequestId>a52e677b-c6f6-4ee2-9e1c-4ce263d4ff73</RequestId>
    <Arguments>
      <Argument Name='AWSAccessKeyId' Value='hogehoge'/>
      <Argument Name='AssociateTag' Value='fugafuga'/>
      <Argument Name='Keywords' Value='ホエイプロテイン'/>
      <Argument Name='Operation' Value='ItemSearch'/>
      <Argument Name='ResponseGroup' Value='ItemAttributes'/>
      <Argument Name='SearchIndex' Value='Books'/>
      <Argument Name='Service' Value='AWSECommerceService'/>
      <Argument Name='Timestamp' Value='2016-12-10T15:03:25Z'/>
      <Argument Name='Version' Value='2013-08-01'/>
      <Argument Name='Signature' Value='EH+ESZrMazDcRG1pQnkoFCG5twthmOXRJOQfvkgLeOM='/>
    </Arguments>
    <RequestProcessingTime>0.0225743190000000</RequestProcessingTime>
  </OperationRequest>
(~snip~)
```

キーワードは正しそうです。検索結果も返ってきました。SearchIndexがBooksのままなのはなんでだろうか。。キャッシュなんでしょうか。まぁいいです。とりあえず使えることはわかりました。

検索できて満足しちゃいました。在庫管理とかどうなってるんだろうかという肝心なところを調べずに息切れです。そろそろ筋肉のために寝ないといけません。（日曜日、現在0時11分)

ハマりどころですが、アクセスキーは root じゃないといけないところと、コードが悪いのか特定してないのですが、Bad Request で稀に怒られたりとか、本格的に作り込んで定期処理させようと思うと嫌だなぁと思う箇所がちらほらと。

# さいごに
本当にお疲れ様でした。今年のアドベントカレンダーは完全燃焼した感あります。もう立てません。

僕は日曜日を攻殻機動隊に捧げるんだ・・・。