Development

[C#] Amazon Product Advertising API の利用(REST サンプルコードの修正)

C# で Amazon Product Advertising API の利用方法です。この API は商品情報とアフィリエイト(アソシエイト)用の URL が取得できます。Amazon の開発者向けサイトからダウンロードできるサンプルコードが古いので修正します。

アソシエイトタグ、Access Key ID と Secret Access Key の取得

最初に API 呼び出しに必要なキーの取得概要だけ紹介します。

Amazon アソシエイト のアカウントの作成し、***-22 という形式のアソシエイトタグ(トラッキング ID)を取得します。

さらに、アソシエイトのホームの「Product Advertising API」タブから Amazon Web Services アカウントを作成します。

affiliate

最終的に、Amazon Web Services の IAM Management Console Your Security Credentials から、Access Key ID と Secret Access Key を作成・取得します。現在も作成した AWS のアカウントからキーを作成できますが、管理者ではなく IMA(Identity and Access Management) ユーザーを作りユーザーに対しキーを発行する方法が推奨されているようです。

aim

サンプルコードの修正

Product Advertising API Signed Requests Sample Code – C# REST/QUERY : Sample Code & Libraries : Amazon Web Services という C# のサンプルが用意されているのですが、API バージョンが古いので修正します。

現在の API バージョン 2011-08-01 は、アソシエイトタグが API 呼び出しに必須です。

修正後のコードは、jz5/AmazonProductAdvtApiSample-2013 に置いてます。

SignedRequestHelper.cs

API 呼び出しの URL を生成できるヘルパークラスを修正します。コンストラクタ引数にアソシエイトタグを追加しています。

gistfile1.diff
diff --git a/Sample/src/SignedRequestHelper.cs b/Sample/src/SignedRequestHelper.cs
index 050e946..dec1058 100644
--- a/Sample/src/SignedRequestHelper.cs
+++ b/Sample/src/SignedRequestHelper.cs
@@ -31,6 +31,7 @@ namespace AmazonProductAdvtApi
     {
         private string endPoint;
         private string akid;
+        private string associateTag;
         private byte[] secret;
         private HMAC signer;
 
@@ -49,11 +50,12 @@ namespace AmazonProductAdvtApi
          *  FR: ecs.amazonaws.fr
          *  CA: ecs.amazonaws.ca
          */
--        public SignedRequestHelper(string awsAccessKeyId, string awsSecretKey, string destination)
+        public SignedRequestHelper(string awsAccessKeyId, string awsSecretKey, string destination, string associateTag)
         {
             this.endPoint = destination.ToLower();
             this.akid = awsAccessKeyId;
             this.secret = Encoding.UTF8.GetBytes(awsSecretKey);
+            this.associateTag = associateTag;
             this.signer = new HMACSHA256(this.secret);
         }
 
@@ -73,6 +75,7 @@ namespace AmazonProductAdvtApi
             // Add the AWSAccessKeyId and Timestamp to the requests.
             sortedMap["AWSAccessKeyId"] = this.akid;
             sortedMap["Timestamp"] = this.GetTimestamp();
+            sortedMap["AssociateTag"] = this.associateTag;
 
             // Get the canonical query string
             string canonicalQS = this.ConstructCanonicalQueryString(sortedMap);

ItemLookupSample.cs

ヘルパークラス呼び出しのサンプルの修正です。アソシエイトタグの追加と、XML 名前空間の API バージョンを修正しています。

gistfile1.diff
diff --git a/Sample/src/ItemLookupSample.cs b/Sample/src/ItemLookupSample.cs
index 9d8212b..b36fdc8 100644
--- a/Sample/src/ItemLookupSample.cs
+++ b/Sample/src/ItemLookupSample.cs
@@ -32,15 +32,16 @@ namespace AmazonProductAdvtApi
     class ItemLookupSample
     {
         private const string MY_AWS_ACCESS_KEY_ID = "YOUR_AWS_ACCESS_KEY_ID";
--        private const string MY_AWS_SECRET_KEY    = "YOUR_AWS_SECRET_KEY";
+        private const string MY_AWS_SECRET_KEY = "YOUR_AWS_SECRET_KEY";
         private const string DESTINATION          = "ecs.amazonaws.com";
--        
--        private const string NAMESPACE = "http://webservices.amazon.com/AWSECommerceService/2009-03-31";
+        private const string ASSOCIATE_TAG = "YOUR_ASSOCIATE_TAG";
+
+        private const string NAMESPACE = "http://webservices.amazon.com/AWSECommerceService/2011-08-01";
         private const string ITEM_ID   = "0545010225";
 
         public static void Main()
         {
--            SignedRequestHelper helper = new SignedRequestHelper(MY_AWS_ACCESS_KEY_ID, MY_AWS_SECRET_KEY, DESTINATION);
+            SignedRequestHelper helper = new SignedRequestHelper(MY_AWS_ACCESS_KEY_ID, MY_AWS_SECRET_KEY, DESTINATION, ASSOCIATE_TAG);
 
             /*
              * The helper supports two forms of requests - dictionary form and query string form.

以上で、サンプルが動作するようになります。