この記事を書こうかどうか迷いましたが、書いてしまいます。
今回のお話はProduct Advertising API(以降、PA APIと略します)の使用方法のお話です。
なぜ書くかためらったのかというと、日本はMWS API、アメリカはPA API、これが揃うとほぼ無料でリサーチツールが作れるようになるためです。
PA APIをC#で使う方法というのがネット上には…存在しません。正確には存在するけど間違っています。
ゆえに、PA APIをC#で利用することにはさほど高くはないけどハードルがあり、Windowsアプリケーションタイプのツールが作りづらい、公開されづらいのではないか、と思っています。
PA APIを使ったAmazonの商品価格、出品者数を取得する方法
PA APIを使うことで効率よくAmazonで販売されている商品の情報を取得することができるようになります。
ほんの一部ではありますが、
- 商品価格
- 商品名
- 重量
- サイズ
- 出品者数
といったことがわかるようになります。
PA APIを使ってAmazon商品情報を取得するサンプルソース
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; using System.Net; using SimpleLookup; namespace _00_sample { class Program { static void Main(string[] args) { string[] asinAry = { "B076B97YKM", "B00WOK8Z74", }; IDictionary<string, string> request = new Dictionary<string, String>(); request["Service"] = "AWSECommerceService"; request["Operation"] = "ItemLookup"; request["ItemId"] = string.Join(",", asinAry); request["IdType"] = "ASIN"; request["ResponseGroup"] = "ItemAttributes,Offers"; string accessKey = ""; string secretKey = ""; string associateTag = ""; string destination = ""; SignedRequestHelper helper = new SimpleLookup.SignedRequestHelper(accessKey, secretKey, destination, associateTag); string requestUrl = helper.Sign(request); HttpWebRequest httpRequest; HttpWebResponse httpResponse; XmlDocument xmlDocument = new XmlDocument(); httpRequest = (HttpWebRequest)HttpWebRequest.Create(requestUrl); httpResponse = (HttpWebResponse)httpRequest.GetResponse(); xmlDocument.Load(httpResponse.GetResponseStream()); httpResponse.Close(); XmlNamespaceManager xmlNsManager = new XmlNamespaceManager(xmlDocument.NameTable); xmlNsManager.AddNamespace("ns", "https://webservices.amazon.com/AWSECommerceService/2011-08-01"); XmlNodeList nodeListTotalOffer = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:Offers/ns:TotalOffers", xmlNsManager); XmlNodeList nodeListTotalNew = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:OfferSummary/ns:TotalNew", xmlNsManager); XmlNodeList nodeListCartPrice = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:Offers/ns:Offer/ns:OfferListing/ns:Price/ns:FormattedPrice", xmlNsManager); XmlNodeList nodeListLowPrice = xmlDocument.SelectNodes("/ns:ItemLookupResponse/ns:Items/ns:Item/ns:OfferSummary/ns:LowestNewPrice/ns:FormattedPrice", xmlNsManager); string cartPrice = ""; string lowPrice = ""; for( int i = 0; i < asinAry.Length; i++ ) { if (nodeListTotalOffer[i].InnerText != "0") cartPrice = nodeListCartPrice[i].InnerText; if (nodeListTotalNew[i].InnerText != "0") lowPrice = nodeListLowPrice[i].InnerText; Console.WriteLine( (cartPrice != "") ? cartPrice : lowPrice ); } } } }
PA APIを使用する上で必要なこと
ソリューション、プロジェクトの設定
実は上記コードをそのままコピペするだけでは使用することができません。
参照設定から参照を追加、System.Webを追加してあげてください。
見つからないよ!という方は、プロジェクトを右クリック、プロパティから、対処のフレームワークを.NetFramework4に変更してください。
一応手順にしておきます。
- プロジェクトを右クリック、プロパティを開く。
- アプリケーションタブより、対象のフレームワークを『.Net Framework4』を選択する。
- 参照設定を右クリック、プロパティを開く。
- .Netタブより、『System.Web』を追加する。
PA APIクラスライブラリ(SignedRequestHelper.cs)のダウンロードと修正
PA APIについて、一応C#の公式なクラスライブラリがあるようです。下記ページよりダウンロードできます。
実は上記のものはAmazonから拾えるくせに、バグっていて使えません。
なのでちょこっと修正しましょう。
上記はWinMergeでテキスト差分を取った画像です。(画像で申し訳ないです。人のソースコードをパクってコピペすると著作権的にナントカカントカ…一部だけ抜粋。見づらい時は画像をダウンロードして拡大して見てください…。)
要は、何が間違っていたかと言うと、公式?なクラスライブラリにはアソシエイトタグの指定がない、という不具合です。
これは、ある時を境にPA APIの仕様が変更となり、アソシエイトタグが必須となりました。その名残ですね。
まぁわからない人にはわからないでしょう。
といった感じで挫折した人も多いのではないでしょうか?
ビルドしてもエラーが出るわけではなく、Amazonに対してリクエストを送るとエラーが返る。
深く考えない人だとすぐやめてしまいそうな気がしますし、『C#やめた!情報が豊富なPHP使おう』となるかもしれません。
ですが、リサーチツールはスピード重視なのでC#というかWindowsアプリにしたほうがいいんですよね。PHPだと1時間あたり3,000件ぐらいが限界ではないでしょうか?
まとめ
どれだけの人がこの記事を読むかはわかりませんが、このソースを公開することにより、Amazon APIを使ったWindowsアプリの制作はけっこうハードルが下がったかもしれません。
なんせネット上には1個も正しいC#でのPA API使用方法がありませんでしたからね。
当ブログも、わたしの別ブログも、いつも片手間に書く趣味的なプログラミング記事が不思議と長生きしつつ人気記事になったりします。
まぁそれだけプログラミングってわかりづらくって悩みを抱える人が多いんですよね。いっくら調べても求めた情報にたどり着くことができないということがよくあります。