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 にサインアップし、アクセスキーIDとシークレットアクセスキーを取得します。
下記のURLからサンプルコードを取得し、SignedRequestHelper.cs ファイルを入手します。
https://aws.amazon.com/code/Product-Advertising-API/2480
下図のUIを作成します。Buttonは2つ配置してありますが、利用するのは[button2]のみです。
下記コードを記述します。
(ここに アクセスキーID を入力します。)の場所に、取得したアクセスキーIDを入力します。(ここに シークレットアクセスキー を入力します。)の場所に、取得したシークレットアクセスキーを入力します。
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 のインスタンスを作成します。
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);
下記コードで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はネームスペースが設定されています。)
取得した下記のタグ内の商品名をテキストボックスに表示します。
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にアクセスします。大きなサイズの商品画像が取得できました。
なお、XMLには2枚目以降の画像のURLも格納されているため、パーシングにより、2枚目以降の画像も取得できます。
/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
/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
/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
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×30 | 21×30 | 長辺が30ピクセルの画像を取得します |
Thumbnail | サムネイル画像を取得します。 | 75×75 | 52×75 | 長辺が75ピクセルの画像を取得します |
Small | 小サイズの画像を取得します。 | 75×75 | 52×75 | 長辺が75ピクセルの画像を取得します |
tiny | 小サイズの画像を取得します。 | 110×110 | 76×110 | 長辺が110ピクセルの画像を取得します |
Midium | 中サイズの画像を取得します。 | 160×160 | 110×160 | 長辺が160ピクセルの画像を取得します |
Large | 大サイズの画像を取得します。 | 500×500 | 345×500 | 長辺が500ピクセルの画像を取得します。ただしオリジナルの画像サイズが500ピクセルより小さい場合は原寸の画像を表示します。 |