Amazon Product Advertising API を利用して ASIN ISBNから商品画像を取得する - C#

Amazon Product Advertising API を利用して ASIN ISBNから商品画像を取得するコードを紹介します。

概要

Amazon Product Advertising APIを呼び出して、ASINやISBNから商品の画像を取得します。
ASINやISBNから商品名を取得する場合は、リクエストの"Operation"パラメータに"ItemLookup"を指定し、"ItemId"パラメータに取得したいASIN ISBNを設定します。"ResponseGroup"パラメーターに"Images"を指定します。

事前準備

Amazon Product Advertising API のサインアップとアクセスキーの取得

こちらの記事を参照して、Amazon Product Advertising API にサインアップし、アクセスキーIDとシークレットアクセスキーを取得します。

SignedRequestHelper.cs の取得

下記のURLからサンプルコードを取得し、SignedRequestHelper.cs ファイルを入手します。
https://aws.amazon.com/code/Product-Advertising-API/2480

プログラム

UI

下図のUIを作成します。Buttonは2つ配置してありますが、利用するのは[button2]のみです。

コード

下記コードを記述します。
(ここに アクセスキーID を入力します。)の場所に、取得したアクセスキーIDを入力します。(ここに シークレットアクセスキー を入力します。)の場所に、取得したシークレットアクセスキーを入力します。
FormMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Net;

namespace SimpleLookup
{
  public partial class FormMain : Form
  {
    private const string MY_AWS_ACCESS_KEY_ID = "(ここに アクセスキーID を入力します。)";
    private const string MY_AWS_SECRET_KEY = "(ここに シークレットアクセスキー を入力します。)";
    private const string DESTINATION = "ecs.amazonaws.jp";
    private const string ASSOCIATE_TAG = "YOUR_ASSOCIATE_TAG";//今回は未指定でOKです。


    public FormMain()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      SignedRequestHelper helper = new SignedRequestHelper(MY_AWS_ACCESS_KEY_ID, MY_AWS_SECRET_KEY, DESTINATION, ASSOCIATE_TAG);
      string asin = textBox2.Text;

      IDictionary<string, string> request = new Dictionary<string, String>();
      request["Service"] = "AWSECommerceService";
      request["Operation"] = "ItemLookup";
      request["ItemId"] = asin;
      request["ResponseGroup"] = "Images";
      string requestUrl = helper.Sign(request);

      GetResponseForImage(requestUrl);
    }

    public void GetResponseForImage(string url)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
      HttpWebResponse response = (HttpWebResponse)request.GetResponse();

      XmlDocument xmlDocument = new XmlDocument();
      xmlDocument.Load(response.GetResponseStream());

      XmlNamespaceManager xmlNsManager = new XmlNamespaceManager(xmlDocument.NameTable);
      xmlNsManager.AddNamespace("ns", "http://webservices.amazon.com/AWSECommerceService/2011-08-01");

      XmlNodeList nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:LargeImage/ns:URL", xmlNsManager);
      if (0 < nodeList.Count) {
        textBox1.Text += "LargeImage: " + nodeList[0].InnerText +"\r\n";
      }

      nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:MediumImage/ns:URL", xmlNsManager);
      if (0 < nodeList.Count) {
        textBox1.Text += "MediumImage: " + nodeList[0].InnerText + "\r\n";
      }

      nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:SmallImage/ns:URL", xmlNsManager);
      if (0 < nodeList.Count) {
        textBox1.Text += "SmallImage: " + nodeList[0].InnerText + "\r\n";
      }
    }

  }
}
SignedRequestHelper.cs
SignedRequestHelper.cs ファイルはこちらの記事のコードを参照してください。

解説

button2_Click

下記コードでSignedRequestHelper のインスタンスを作成します。
  SignedRequestHelper helper = new SignedRequestHelper(MY_AWS_ACCESS_KEY_ID, MY_AWS_SECRET_KEY, DESTINATION, ASSOCIATE_TAG);

テキストボックスからASIN/ISBN-10番号を取得します。
  string asin = textBox2.Text;

リクエストパラメータの準備をします。"Operation"には"ItemLookup"を指定し、"ItemId"にはテキストボックスに入力されたASIN/ISBN番号、"ResponseGroup"には今回は画像を取得するため、"Images"を指定します。
  IDictionary<string, string> request = new Dictionary<string, String>();
  request["Service"] = "AWSECommerceService";
  request["Operation"] = "ItemLookup";
  request["ItemId"] = asin;
  request["ResponseGroup"] = "Images";
  string requestUrl = helper.Sign(request);

APIへのリクエストと戻り値のXMLのパーシングを実行します。
  GetResponse(requestUrl);

GetResponseForImage

下記コードでHTTPアクセスのリクエストを実行し、レスポンスを受け取ります。動作の詳細はこちらの記事を参照してください。
  HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
  HttpWebResponse response = (HttpWebResponse)request.GetResponse();

HttpWebResponseのGetResponseStream()メソッドで取得できる、ストリームをXmlDocumentのLoadメソッドに与え、XMLのパーシングを実行します。今回の例では、XMLの要素の取得には、XPathを利用しています。XPathの動作の詳細はこちらの記事を参照してください。(Amazon Product Advertising API の返却XMLはネームスペースが設定されています。)
取得した下記のタグ内の商品名をテキストボックスに表示します。
  • /ns:ItemLookupResponse/ns:Items/ns:Item/ns:LargeImage/ns:URL
  • /ns:ItemLookupResponse/ns:Items/ns:Item/ns:MediumImage/ns:URL
  • /ns:ItemLookupResponse/ns:Items/ns:Item/ns:SmallImage/ns:URL
      XmlDocument xmlDocument = new XmlDocument();
      xmlDocument.Load(response.GetResponseStream());

      XmlNamespaceManager xmlNsManager = new XmlNamespaceManager(xmlDocument.NameTable);
      xmlNsManager.AddNamespace("ns", "http://webservices.amazon.com/AWSECommerceService/2011-08-01");

      XmlNodeList nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:LargeImage/ns:URL", xmlNsManager);
      if (0 < nodeList.Count) {
        textBox1.Text += "LargeImage: " + nodeList[0].InnerText +"\r\n";
      }

      nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:MediumImage/ns:URL", xmlNsManager);
      if (0 < nodeList.Count) {
        textBox1.Text += "MediumImage: " + nodeList[0].InnerText + "\r\n";
      }

      nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:SmallImage/ns:URL", xmlNsManager);
      if (0 < nodeList.Count) {
        textBox1.Text += "SmallImage: " + nodeList[0].InnerText + "\r\n";
      }
    }


実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


上部のTextBox(textBox2)にASINまたはISBN-10番号を入力します。入力後[button2]をクリックします。


下部のtextBoxに"LargeImage","MediumImage","SmallImage"3種類の画像のURLが表示されます。


Webブラウザで"LargeImage"の画像URLにアクセスします。大きなサイズの商品画像が取得できました。

2枚目以降の画像の取得について

なお、XMLには2枚目以降の画像のURLも格納されているため、パーシングにより、2枚目以降の画像も取得できます。


ImageSetの最初の画像のURLを取得する場合のXPath

 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='primary']/ns:LargeImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='primary']/ns:MediumImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='primary']/ns:TinyImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='primary']/ns:ThumbnailImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='primary']/ns:SmallImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='primary']/ns:SwatchImage/ns:URL

ImageSetの最初の画像以外のURLを取得する場合のXPath

 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='variant']/ns:LargeImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='variant']/ns:MediumImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='variant']/ns:TinyImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='variant']/ns:ThumbnailImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='variant']/ns:SmallImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet[@Category='variant']/ns:SwatchImage/ns:URL

ImageSetの画像すべてのURLを取得する場合のXPath

 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:LargeImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:MediumImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:TinyImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:ThumbnailImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:SmallImage/ns:URL
 /ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:SwatchImage/ns:URL

2枚目以降の画像を取得するコード例

GetResponseForImageを下記のGetResponseForImageSetに変更することで、2枚目以降の画像のURLを取得できます。
    public void GetResponseForImageSet(string url)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
      HttpWebResponse response = (HttpWebResponse)request.GetResponse();

      XmlDocument xmlDocument = new XmlDocument();
      xmlDocument.Load(response.GetResponseStream());

      XmlNamespaceManager xmlNsManager = new XmlNamespaceManager(xmlDocument.NameTable);
      xmlNsManager.AddNamespace("ns", "http://webservices.amazon.com/AWSECommerceService/2011-08-01");

      XmlNodeList nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:LargeImage/ns:URL", xmlNsManager);
      for (int i=0; i < nodeList.Count;i++) {
        textBox1.Text += "LargeImage: " + nodeList[i].InnerText + "\r\n";
      }
      textBox1.Text += "----\r\n";

      nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:MediumImage/ns:URL", xmlNsManager);
      for (int i = 0; i < nodeList.Count; i++) {
        textBox1.Text += "MediumImage: " + nodeList[i].InnerText + "\r\n";
      }
      textBox1.Text += "----\r\n";

      nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:TinyImage/ns:URL", xmlNsManager);
      for (int i = 0; i < nodeList.Count; i++) {
        textBox1.Text += "TinyImage: " + nodeList[i].InnerText + "\r\n";
      }
      textBox1.Text += "----\r\n";

      nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:ThumbnailImage/ns:URL", xmlNsManager);
      for (int i = 0; i < nodeList.Count; i++) {
        textBox1.Text += "ThumbnailImage: " + nodeList[i].InnerText + "\r\n";
      }
      textBox1.Text += "----\r\n";

      nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:SmallImage/ns:URL", xmlNsManager);
      for (int i = 0; i < nodeList.Count; i++) {
        textBox1.Text += "SmallImage: " + nodeList[i].InnerText + "\r\n";
      }
      textBox1.Text += "----\r\n";

      nodeList = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:ImageSets/ns:ImageSet/ns:SwatchImage/ns:URL", xmlNsManager);
      for (int i = 0; i < nodeList.Count; i++) {
        textBox1.Text += "SwatchImage: " + nodeList[i].InnerText + "\r\n";
      }
      textBox1.Text += "----\r\n";
    }

実行結果

複数の画像のURLが取得できることが確認できます。

補足:画像の大きさ

画像の大きさは以下になります。
意味画像サイズ
(正方形)
画像サイズ
(一般的な書籍)
ロジック
Swatchアイコンサイズの画像を取得します。30×3021×30長辺が30ピクセルの画像を取得します
Thumbnailサムネイル画像を取得します。75×7552×75長辺が75ピクセルの画像を取得します
Small小サイズの画像を取得します。75×7552×75長辺が75ピクセルの画像を取得します
tiny小サイズの画像を取得します。110×11076×110長辺が110ピクセルの画像を取得します
Midium中サイズの画像を取得します。160×160110×160長辺が160ピクセルの画像を取得します
Large大サイズの画像を取得します。500×500345×500長辺が500ピクセルの画像を取得します。ただしオリジナルの画像サイズが500ピクセルより小さい場合は原寸の画像を表示します。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-07
作成日: 2016-05-10
iPentec all rights reserverd.