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

DevelopmentAmazon

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 を生成できるヘルパークラスを修正します。コンストラクタ引数にアソシエイトタグを追加しています。

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);

view raw
gistfile1.diff
hosted with ❤ by GitHub

ItemLookupSample.cs

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

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.

view raw
gistfile1.diff
hosted with ❤ by GitHub

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