オルタナティブ・ブログ > ビジネスをデザインするブログ >

事業開発ほどクリエイティブな行為は他に無いと思いこんでいる人間の日常

おさらいシリーズ その1:Amazon Product Advertising API

»

数年ぶりにAmazonのAPIにアクセスしてみたら、まったく仕様が変わっていてビックリ(というか、当然ですね)。

というわけで、おさらい。

C#で、Amazon Product Advertising API を使ってみました。

最新環境(2011-0801)では、

  • リクエストに署名がいる(これはもっと前からみたいですね。。。)
  • AssociateTagが必須になった
  • ItemPageが10ページまでに制限

という感じ。

また、リクエストはRESTとSOAPどちらにも対応しているみたいですが、SOAPの方は今更感があるので、RESTを利用することにします。

署名は、ここからダウンロードできるサンプルから、SignedRequestHelper.csを抜き取ってきて利用するだけ。

SilverlightやWindows Phone環境では、使えるClassに制限があったりするようですが、その解決法も先人さまが解決されているようでした。

大変参考になりました。というか、ほぼパクリ。

事前にAmazonさんに開発者登録して、Access Key IDとSecret Keyさらに、AssociateTagを取得しておく必要があります。

で、ソースですが、WindowsフォームにTextBoxとButtonを1つ配置し、Buttonのクリックイベントに下記コードを書きました。TextBoxはマルチラインにして広げておきます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using AmazonProductAdvtApi;
using System.Net;
using System.Xml.Linq;
using System.Web;

namespace AmazonTest
{
    public partial class Form1 : Form
    {

        private const string MY_AWS_ACCESS_KEY_ID = "ほげほげ";
        private const string MY_AWS_SECRET_KEY = "ふーふー";

        private const string DESTINATION = "ecs.amazonaws.jp";

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var helper = new SignedRequestHelper(MY_AWS_ACCESS_KEY_ID, MY_AWS_SECRET_KEY, DESTINATION);
            var param = new Dictionary<string, String>();
            
            param["Service"] = "AWSECommerceService";
            param["Version"] = "2011-08-01";
            param["Operation"] = "ItemSearch";
            param["Keywords"] = "Linq";
            param["SearchIndex"] = "Books";
            param["ResponseGroup"] = "Small";

            param["ItemPage"] = "1";

            param["AssociateTag"] = "げほげほ";

            var requestUrl = helper.Sign(param);
            var request = new WebClient();
            
request.Encoding = Encoding.GetEncoding("UTF-8");

            request.DownloadStringCompleted += (_s, _e) =>
                {
                    if (_e.Error != null)
                    {
                        MessageBox.Show(_e.Error.ToString());
                    }

                    var xml = XElement.Parse(_e.Result);

                    XNamespace ns = "http://webservices.amazon.com/AWSECommerceService/2011-08-01";

                    textBox1.Text = "";
                    textBox1.Text += "件数 = " + xml.Element(ns + "Items").Element(ns + "TotalResults").Value.ToString() + "\r\n";
                    textBox1.Text += "ページ数 = " + xml.Element(ns + "Items").Element(ns + "TotalPages").Value.ToString() + "\r\n";
                   
                    var result = from item in xml.Descendants(ns + "Item")
                                 select item;

                    foreach (var i in result)
                    {
                        textBox1.Text += i.Element(ns + "ASIN").Value.ToString() + " : ";
                        textBox1.Text += i.Element(ns + "ItemAttributes").Element(ns + "Title").Value.ToString() + "\r\n";
                    }
                };

            request.DownloadStringAsync(new Uri(requestUrl));
            
        }
    }
}

こんな感じ。

特に、難しいことは何もないのですが、SignedRequestHelper.csをコンパイルするのに、System.WebのDLLを参照する必要がありますが、Client Profileの.NET Frameworkにはないので、ターゲットのFrameworkを普通の.NET Frameworkにすつ必要があります。

あと、XMLは基本UTF-8のはずなのですが、なぜかWebClientで取得したXML(の日本語)が文字化けし、Parseがこけるので明示的に文字コードを指定(緑字部分)しました。

Comment(0)