2014年7月18日金曜日

コマンドラインからAmazonアソシエイトの広告リンクを作成してみた

AmazonアソシエイトのHTMLリンクを1商品分だけコマンドで簡単に生成できたらいいなーと思って作ってみました
Rubyの「amazon-ecs」というGemを使っています

■環境
Mac OS X 10.8.5
Ruby 2.1.2p95
Gem 2.2.2
amazon-ecs 2.2.5

■設定
gem install amazon-ecs
gem install launchy

■ソースコード
touch call_amazon_api.rb

# -*- coding: utf-8 -*-
require 'amazon/ecs'
require 'launchy'

if ARGV.length != 1
then 
  p "Please input search keyword using the argument"
  exit 1
end
keyword = ARGV[0];

amazon_tracking_id = "Please input your amazon asociate tracking id"
access_key = "Please input your aws access_key or specified evn ACCESS_KEY at executing"
secret_key = "Please input your aws access_key or specified evn SECRET_KEY at executing"

if ENV["ACCESS_KEY"]
then
  access_key = ENV["ACCESS_KEY"]
end

if ENV["SECRET_KEY"]
then
  secret_key = ENV["SECRET_KEY"]
end

Amazon::Ecs.options = {
  :associate_tag => amazon_tracking_id,
  :AWS_access_key_id => access_key,
  :AWS_secret_key => secret_key
}

res = Amazon::Ecs.item_search(keyword, :response_group => 'Small, ItemAttributes, Images', :search_index => 'All', :country => 'jp')

#puts res.marshal_dump

res.items.each do |item|
  element = item.get_element('ItemAttributes')
  
  data = {
    :asin => item.get('ASIN'), 
    :title => element.get("Title"), 
    :page_url => "http://www.amazon.co.jp/dp/#{item.get('ASIN')}?tag=#{amazon_tracking_id}", 
    :isbn => element.get("ISBN"), 
    :author => element.get_array("Author").join(", "), 
    :product_group => element.get("ProductGroup"), 
    :manufacturer => element.get("Manufacturer"), 
    :publication_date => element.get("PublicationDate"), 
    :small_image => item.get_hash("SmallImage"), 
    :medium_image => item.get_hash("MediumImage"), 
    :large_image => item.get_hash("LargeImage")
  }
  image_info = data[:medium_image]
  html_file = "index.html"
  file_path = File.dirname(__FILE__) + "/" + html_file
  f = File::open(File.dirname(__FILE__) + "/" + html_file, "w+");
  f.puts(
         "<a href=\"#{data[:page_url]}\" target=\"_blank\"><table style=\"border-style: solid;\">" + 
         "<tr>" +
         "<td><img src=\"#{image_info['URL']}\" /></td>" +
         "<td><div>#{data[:title]}</div><div style=\"margin-top: 5px; font-size: 11px;\">#{data[:manufacturer]}</div><div style=\"font-size: 11px;\">#{data[:author]}</div></td>" +
         "</tr>" +
         "</table></a>"
         );
  f.rewind
  puts f.read
  f.close();
  Launchy.open(file_path)
  break;
end

まず「amazon_tracking_id」に自分のAmazonアソシエイト用のtrackingIDを指定します
次に「access_key」と「secret_key」ですが、これは直接ソースを編集してもいいし、ruby実行時の環境変数(ACCESS_KEY, SECRET_KEY)で指定しても大丈夫です

各自で設定する箇所は以上であとは ruby call_amazon_api.rb Java と実行すればOKです
Javaと指定している部分はAmazonで検索するキーワードで好きなキーワードを指定することができます
日本語もきっと使用できます

処理の流れとしてはキーワードを元にランキングを取得し1位の情報だけを取り出してWebサイトで表示するためのHTMLを作成します
作成したHTMLはターミナルの標準出力に表示されるので使いたい場合はコピペして使ってください
また、作成すると同時にHTML情報をデフォルトのブラウザで表示するようにしているので、HTMLのサンプルを作成することもできます

■サンプルレスポンス
<a href="http://www.amazon.co.jp/dp/4844330861?tag=kakakikikeke-22" target="_blank">
  <table style="border-style: solid;">
    <tr>
      <td>
        <img src="http://ecx.images-amazon.com/images/I/51fRtwXdWLL._SL160_.jpg" />
      </td>
      <td>
        <div>スッキリわかるJava入門</div>
        <div style="margin-top: 5px; font-size: 11px;">インプレスジャパン</div>
        <div style="font-size: 11px;">中山 清喬, 国本 大悟</div>
      </td>
    </tr>
  </table>
</a>


Web上での表示は以下の通り
スッキリわかるJava入門
インプレスジャパン
中山 清喬, 国本 大悟


ちょっとした商品を紹介するときには役にたつかなと思います

■参考リンク
Amazon-ECS APIリファレンス
ソースコード

進め方としては基本はAPIリファレンスベースに進めるといいと思う
APIのリクエストパラメータはruby内部でcamelizeしているので
SearchIndex -> :search_index
みたいな感じで変換してパラメータを設定することができる
レスポンスに関してはget_elementメソッドを使ってXMLの要素名を指定することでオブジェクトを取得してそこからgetなどでString情報を抜き出すことができる

0 件のコメント:

コメントを投稿