なか日記

一度きりの人生、楽しく生きよう。

C#:Amazon Product Advertising APIを使ってAmazonから商品情報を取得する

ふと、Amazonから商品情報を取ってきたいと思ったのでちょっと調べてみました。

必要なもの

事前に以下の準備が必要です。

  • Amazon アソシエイト のアカウント
  • Amazon Web Services のアカウント
  • APIを使用するための Access Key ID と Secret Access Key

これらの取得方法はすべて下記のブログにまとめられてますので参考にして下さい。

APIリファレンス

APIリファレンスは下記に公開されています。

面倒なこと

リクエストを以下の様な感じで送信しますが、Timestampはリクエスト送信時のもの、SignatureはTimestampを含めたリクエストからゴニョゴニョして生成する必要がありますので結構めんどい。

http://webservices.amazon.com/onca/xml?
Service=AWSECommerceService&
AWSAccessKeyId=[AWS Access Key ID]&
Operation=ItemSearch&
Keywords=Mustang&
SearchIndex=Blended
&Timestamp=[YYYY-MM-DDThh:mm:ssZ]
&Signature=[Request Signature]

SignedRequestHelperで解消

下記で公開されているサンプルに SignedRequestHelper というクラスが含まれています。

これを使うと Timestamp や Signature を付けたリクエストを生成してくれるので楽ちんです。

サンプル

公開されているサンプルから必要な部分だけぶっこ抜いてちょっと弄ってます。

using System;
using System.Linq;
using System.Xml.Linq;

namespace AmazonProductAdvtApi
{
    class ItemLookupSample
    {
        private const string MY_AWS_ACCESS_KEY_ID = "{Access Key ID}";
        private const string MY_AWS_SECRET_KEY = "{Secret Access Key}";
        private const string DESTINATION = "ecs.amazonaws.jp";
        private const string ASSOCIATE_TAG = "{アソシエイトタグ}";

        public static void Main()
        {
            var helper = new SignedRequestHelper(MY_AWS_ACCESS_KEY_ID, MY_AWS_SECRET_KEY, DESTINATION, ASSOCIATE_TAG);

            var keyword = "納品のない受託開発";

            String requestString = "Service=AWSECommerceService"
                + "&Version=2009-03-31"
                + "&Operation=ItemSearch"
                + "&SearchIndex=Books"
                + "&ResponseGroup=Medium"
                + "&Keywords=" + keyword
                ;
            var requestUrl = helper.Sign(requestString);
            var title = FetchTitle(requestUrl);

            Console.WriteLine("Keyword=\"" + keyword + "\"; Title=\"" + title + "\"");
            Console.WriteLine();

            Console.WriteLine("Hit Enter to end");
            Console.ReadLine();
        }

        private static string FetchTitle(string url)
        {
            XDocument xml = XDocument.Load(url);

            var ns = xml.Root.Name.Namespace;
            var errorMessageNodes = xml.Descendants(ns + "Message").ToList();
            if (errorMessageNodes.Any())
            {
                var message = errorMessageNodes[0].Value;
                return "Error: " + message;
            }

            var title = xml.Descendants(ns + "Title").First();
            return title.Value;
        }
    }
}

実行結果

Keyword="納品のない受託開発"; Title="「納品」をなくせばうまくいく ソフトウェア業
界の“常識"を変えるビジネスモデル"

Hit Enter to end