おさらいシリーズ その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がこけるので明示的に文字コードを指定(緑字部分)しました。