⑥API実践-商品-Excel
- 2015年10月13日
- Amazon_API徹底解説
Excel-VBAでアクセスする場合のソースプログラムを示します。★★の部分にAamzonから取得したKey等を入れればAmazon日本から情報取得できます。(取得方法は“④API実践-はじめに(登録方法含む)”で投稿)【PHPでの実施方法は⑤API実践-商品-PHP参照】
【使い方】
①Excelを開きVBEで新規に標準モジュールを追加し下記のプログラムをコピーして★★を自分のID,KEYに修正してください。
②以下のダウンロードボタンを押下し、2つファイルを取得します。本ファイルはAPI用の暗号化モジュールですので、VBEで新規に標準モジュールを2つ追加しファイルごとに貼り付けてください。(URLエンコードやMD5などの暗号化するためのモジュールです。私も詳細は理解してません。。。)
暗号
③①で貼り付けたプログラムを実行すれば動作します。
【少し解説】
本プログラムはASIN番号をキーにして商品情報を取得するためのAPIになっています。Sheet1のA列にASIN番号を入力しておくとB~G列にタイトル等を取得してくれます。下図参照(シートの1行目の項目名は入力しておく必要があります)。
以下にExcel-VBAのSampleExcelとプログラムを示します。
【以下のExcelをダウンロードし、IDなどを書き換えれば簡単に利用できます。】
API_sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
Option Explicit Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Dim KeyId As String Dim sKey As String, AWSKeyId As String Dim asin As String Dim ecsaddress As String Dim associateid As String, AssociateID22 As String, APIVersion As String Dim timestamp As String Dim base64Array As Variant Dim URI As String Dim xml As Object, itemAttributes As Object Public Sub getDataByApi() Dim WS1 As Worksheet Dim ASINRowIndex As Integer Dim k As Integer ''API初期設定(Amazon Product Advertising API KeyID & SecretKey etc) AWSKeyId = "★★修正要★★" sKey = "★★修正要★★" 'Associate ID AssociateID22 = "★★修正要★★" 'APIVersion APIVersion = "2011-08-02" ' シートをセットしてクリアする。 Set WS1 = Worksheets("Sheet1") ASINRowIndex = 2 'ASIN 行が空になったら終了 While (WS1.Cells(ASINRowIndex, 1) <> "") ' ステータスバーの表示 Application.StatusBar = (ASINRowIndex - 1) & "件目 API取得中..." asin = WS1.Cells(ASINRowIndex, 1) '署名作成に使うタイムスタンプ timestamp = Format(Date, "yyyy-mm-dd") & "T" & Format(CDate(DateAdd("h", -9, Time)), "hh%3AMM%3Ass") & "Z" ecsaddress = "ecs.amazonaws.jp" ' ★★修正要★★(現状は日本の設定) associateid = AssociateID22 Dim rawText, rawTextToSign As String Dim hash, hash_2, hash_cut2, hash_10, hash_cut10 As String rawText = "AWSAccessKeyId=" & AWSKeyId & "&AssociateTag=" & associateid & "&IdType=ASIN&ItemId=" & asin & "&Operation=ItemLookup&ResponseGroup=Request%2CLarge&Service=AWSECommerceService&Timestamp=" & timestamp & "&Version=" & APIVersion rawTextToSign = "GET" & vbLf & ecsaddress & vbLf & "/onca/xml" & vbLf & rawText hash = Hmac(sKey, rawTextToSign) '2進数に変換 hash_2 = "" For k = 1 To 64 Step 2 hash_cut2 = Mid(hash, k, 2) hash_2 = hash_2 & HEX2BIN(hash_cut2) Next '不足が出るので00で埋める hash_2 = hash_2 & "00" 'BASE64エンコード Dim sign As String sign = "" For k = 1 To 256 Step 6 hash_cut10 = Mid(hash_2, k, 6) hash_10 = ncdec(2, hash_cut10) base64Array = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/") sign = sign & base64Array(hash_10) Next '不足が出るので=で埋める sign = sign & "=" 'URLエンコード sign = UrlEncode(sign) URI = "http://" & ecsaddress & "/onca/xml?" & rawText & "&Signature=" & sign 'XML オブジェクト作成 Set xml = CreateObject("Microsoft.XMLDOM") xml.async = False xml.Load URI Set itemAttributes = xml.SelectSingleNode("ItemLookupResponse/Items/Item/ItemAttributes") ' HTTPアクセスが失敗している場合 If itemAttributes Is Nothing Then MsgBox ("情報が見つかりませんでした。ASIN番号などを調査してください。") ' HTTPアクセスが成功している場合 Else 'タイトル If Not itemAttributes.SelectSingleNode("Title") Is Nothing Then WS1.Cells(ASINRowIndex, 2) = itemAttributes.SelectSingleNode("Title").text End If '大きさ If Not itemAttributes.SelectSingleNode("PackageDimensions/Height") Is Nothing Then WS1.Cells(ASINRowIndex, 3) = itemAttributes.SelectSingleNode("PackageDimensions/Height").text WS1.Cells(ASINRowIndex, 4) = itemAttributes.SelectSingleNode("PackageDimensions/Length").text WS1.Cells(ASINRowIndex, 5) = itemAttributes.SelectSingleNode("PackageDimensions/Width").text End If '在庫(新品) Dim objPrice As Object Set objPrice = xml.SelectSingleNode("ItemLookupResponse/Items/Item/OfferSummary/TotalNew") If Not objPrice Is Nothing Then WS1.Cells(ASINRowIndex, 6) = objPrice.text End If 'URL Set objPrice = xml.SelectSingleNode("ItemLookupResponse/Items/Item/DetailPageURL") If Not objPrice Is Nothing Then WS1.Cells(ASINRowIndex, 7) = objPrice.text End If End If '次の行を処理するためにインクリメント ASINRowIndex = ASINRowIndex + 1 Wend End Sub |
こんにちは。こちらで公開されているVBAを活用させていただいている者です。
自分なりに調べて、取得する項目部分のコードを書き換えて、ランキングや新品と中古の価格、出品点数の情報が取れるようにしました。
そこで質問なのですが、データの取得ミス?が起きて、空欄のまま次の項目に進んでしまう事が多発しています。
ランキングの部分だけは必須でほしいデータなので、空欄の場合は再度取得し直すようループコするコードを書き足して対処したのですが、そもそも取得ミスが起きる原因がわからず、不便を感じています。
取得ミスの原因や、対処法などで、何かわかる事があればご教授願いたいと思いコメントを残す事にしました。何卒宜しくお願いしますm(__)m
いつもご利用ありがとうございます。ただ、正直なぜ空欄になるかはよくわかりません。
単純にAmazonデータの問題かと思っています。
ただ、何回かすれば取得できるのでしたら、アクセス速度の可能性があります。
APIで取得されているなら明確な規定を見たことはない(どこかにあると思われますが。。。)ですが、MWSなどは規定があり一定速度異常だとエラーになったりします。
http://docs.developer.amazonservices.com/ja_JP/products/Products_Throttling.html
参考になればと思い共有します。
情報ありがとうございます。
実は、、、速度を遅くするのは試した事があるのです。が、それでも取得ミスが起きたので、結局、「空欄の場合は同じ項目で再度取得するコードを」を書き加えたという流れです。
取得できるまでループさせるか、後で取得し直すか、作業効率との相談ですね。
何かわかった時はまた書き込みたいと思います。お忙しい中ご対応ありがとうございました。
こんにちは。VBAを最近知り学ぼうと色々回った結果ここに行きついたものです。
質問なのですが、
Product Advertising APIよりレスポンス要素のコンディションを見たところ以下の記述があったのですが
[商品のコンディション (新品、中古商品、コレクター商品、新品同様の商品など)。]
これは中古良い・非常に良い等の振り分けはできないということでしょうか。
お手数おかけいたしますが、お時間ございましたらご対応のほどよろしくお願いいたします。
https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html
に仕様があるので確認ください。
「ItemSearch における共通パラメータ」や「詳細サーチ構文」で確認するとConditionの説明は以下の通りですので、中古良い・非常に良い等の振り分けはできそうにないですね。
Condition—商品のコンディションを指定できます。有効値は、 “All” 、 “New” 、 “Used” 、 “Collectible” 、 “Refurbished” です。デフォルト値は “New” です。コンディションによって返される商品の合計数が制限されるわけではありません。ただし、出品情報は、指定したコンディションの商品に制限されます。
ご対応ありがとうございました。
MWSの方でやれそうなので、そっちで行おうかと思います。あと、もう一点なのですが、APIは不安定とのネットで見かけて、実際こちらに記載されてる内容をいじってやってみたところ、200件を一括実行した所、結果半分も表示されないという形をなっております。
自分もプログラムに問題もなるかと思いますが、何か解決策はございますでしょうか。
何卒宜しくお願いしますm(__)m
まず、速度が早すぎる可能性がありますので、Waitをかけるなどで調整してみてはいかがでしょう。
一定時間内のアクセス数が通常制限されています。参考まで。
ご連絡ありがとうございます。
一応、一つの商品検索したら、以下を行うとやっているのですが、これではよくないのでしょうか。
Application.Wait (Now() + TimeValue(“00:00:02”))
そうですね、ここら辺は色々試して見るしかないと思います。
どれが最適かはチューニングしてみてください。
MWSだと速度がほぼ保証されているので間違い無いですが、大口セラーアカウントが必要ですね。