今回はAmazonAPIを使った何かを作って見たいと思います。
Amazon転売をしている人なら単語は聞いた事があるのでは無いでしょうか。
商品情報を一々Amazonのページを開いて確認せずとも、httpリクエストを送信するだけで瞬時に大量に商品情報の取得ができるという素晴らしいものです。
※リクエスト数の上限はあります。
ただし、
誰でも使えるという訳ではありません。
いや本当は使おうと思えば誰でも使えるんですが、自分で実装しようとした場合は結構複雑な処理が必要になるため、ある程度のプログラミングの知識が必須になって来るんです。
私も数年前に手を出してみようと思ったのですが、これがまた思った以上に難しい。それにAmazonを使ったビジネスモデルなんて確立していなかったので、ツールを作った所でどう活用すれば良いのかが分からず・・・
壁にぶち当たった所でよじ登る気力も無かったので、そのまま放っていました。
「でもやっぱり一応操作できる様にはしておきたい!」
という事で今回再び手を出してみました。
ちなみに何を作るかは何も考えていません。
とりあえず色々触ってみる所から初めてみます。
キッカケ的なもの
Amazon関連で何かお金にならないかなーと思い、Amazonを扱うならAPIは必須だろうという事でまずは環境作りの下調べをしていた所、こんなものを見つけました。
JANコードとASINコードを相互変換するためのツールだそうです。
価格は5,000円で、既に三十数本売れているとのこと。
何に使うんだ・・・!さっぱり分からん!
こんな良く分からない単純そうなツールで十数万を稼いでるなんてうらやまし過ぎるので、私も何か作ってウハウハしたい!
という不純な理由です。
一件一件開発依頼受けるより、適当なツール作ってこんな風に売った方が良いですよね。楽だし。
サンプルを動かしてみる
「Amazon API VBA」
で調べて見ると、先人方のサンプルコードや解説が大量にヒットするので、作り方やアクセスキーの取得方法などは今回割愛します。
※今回はただAPIを動かしてみるだけの動作確認回なので、今後は掲載予定です。
しかし、いざサンプルコードをコピーして実行してみても・・・動かない。
5サイト位のサンプルを色々触ってみましたが、どれもなぜか商品情報が取れない。おかしいなぁ・・・
コードに問題があるのか(リクエストの送信方法が更新されたとかで)、それともこちらの用意したアクセスキーやIDが違うのか、それすら分からない。
一から理解しながら作った方が良いのか悩んだり、PHPのサンプルに手を出したり色々している内に3日程経過した辺りで、やっとそのままコピーして使えるサンプルが見つかりました。
サイト【古都の微熱】様
https://bookstore.g.hatena.ne.jp/kt_kyoto/20120128/1327776443
こちらの記事にあるコードをそのままコピーして試してみた所、無事ISBNコードからの情報取得に成功致しました。やったぜ。
※アクセスキーは自分が取得したものに変える必要があります。
本のタイトルや筆者といった情報がエクセル上に書き込まれたので成功・・・したと思っていたら、以下のエラーが発生していました。
エラー箇所を確認してみると、この部分で発生している様でした。
'定価 If Not PriceCol = 0 Then Dim teika As Integer teika = 0 '↓ココ teika = itemAttributes.selectSingleNode("ListPrice/Amount").text ActiveSheet.Cells(ISBNRowIndex, PriceCol) = teika End If
エラーの原因を特定
他のデータは「itemAttributes.SelectSingleNode(“Publisher”).text」という記述で問題無く取得できている所を見るに、恐らく指定している「”ListPrice/Amount”」という値が問題なんだろうと判断。
何を指定すれば良いのかを確認するためにitemAttributesの中身をウォッチウィンドウで見てみることに。
この「ItemAttributes」というものの下にある「childNodes」を展開してみると、上図の様にずらりとItemが並んでいるのを確認。
一つ一つ見てみると、本のタイトルやら出版社の情報はこの中にある様でした。
・・・しかしitemの中身を全て確認してみるも、販売価格に関する情報は無し。
ノード名に「”ListPrice/Amount”」が設定されているものは無かったので、やはりこの指定が原因っぽい。多分Amazon側が仕様変更したんでしょうね。
では「itemAttributes」が持っている要素を改めて確認してみます。すると、
「nextSibling」という要素の中にも「childNodes」があることを発見。
確認してみると、こちらに価格の情報が入っていました。
この「OfferSummary」という要素を取得できれば、「SelectSingleNode(“LowestNewPrice”).text」とかの指定で価格を取得できそうです。
という訳で早速、価格情報を取得する部分の処理を以下の様に修正。
'定価 Set attributesNodeOfferSummary = xml.SelectSingleNode("ItemLookupResponse/Items/Item/OfferSummary") If Not PriceCol = 0 Then Dim teika As String teika = attributesNodeOfferSummary.SelectSingleNode("LowestNewPrice").text ActiveSheet.Cells(ISBNRowIndex, PriceCol) = teika End If
これで無事、価格の情報も取得できる様になりました。
何気にteikaの変数もInteger型からString型に変わっていますが、格納されているデータがただの数字ではなく「2808JPY¥ 2,808」という文字列で入っていたためです。
円(JPY)とかドル(USD)とかの通貨単位情報も含めないとユーザーが間違えてしまうからでしょうかね?
でもURL作る際にエンドポイント指定?とかで、
「ecs.amazonaws.jp」
こんな感じの国号コードを含んだ値を入れてるんだけどなぁ・・・
まぁ輸入販売している人もいますし、各国のAmazonの価格情報を集めてる方だと確かに商品情報が混ざって分からなくなりそうではある。
とりあえずサンプルでコピーさせて頂いたコードは無事動作する様になりましたね。今回のコードを参考にしつつ、今後色んな処理を実装、紹介していきたいと思います。
ではまた!
<次の記事>