Quantcast
Channel: なか日記
Viewing all articles
Browse latest Browse all 848

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

$
0
0

ふと、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
    {
        privateconststring MY_AWS_ACCESS_KEY_ID = "{Access Key ID}";
        privateconststring MY_AWS_SECRET_KEY = "{Secret Access Key}";
        privateconststring DESTINATION = "ecs.amazonaws.jp";
        privateconststring ASSOCIATE_TAG = "{アソシエイトタグ}";

        publicstaticvoid 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();
        }

        privatestaticstring 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

Viewing all articles
Browse latest Browse all 848

Trending Articles