AmazonAPIを使った何かを作ってみる – 3 (ASIN、JAN変換ツール)


<前回の記事>

「AmazonAPIを使った何かを作ってみる」その3です。

さて、今までずっと何を作ろうかと考えて居たのですが、転売でAmazonは使って無いのでどういうツールがあれば良いのかさっぱり分かりませんでした。

結局「AmazonAPIを使った何かを作ってみる – 1」の冒頭でお話した「JANコードとASINコードの変換を行うツール」をそのまま作ってみようかと思います。

2.5までの修正内容を反映したVBAサンプルは以下からダウンロードしておいて下さい。以降の内容では、こちらをベースに修正を行っていきます。



スポンサーリンク

複数の商品コード(ASIN / JAN(EAN))への対応

まずは商品のリクエストを送信するためのURLを作成します。

今回はサンプルとして以下の音楽CDを用います。(なぜこれかって?趣味だよ!)

Magical Halloween 5 Original Soundtrack(DVD付)

リクエストを送信するために用いる商品番号は、JANコードでもASINコードでもどちらでも構いません。(レスポンスの内容はほぼ同じなので)

今回はどちらからでもリクエストを送信できる様にしてみます。

まずリクエストの組み立てを行う以下の処理の部分を、

rawText = "AWSAccessKeyId=" & AWSKeyId & "&AssociateTag=" & associateid & "&IdType=ISBN&ItemId=" & isbn & "&Operation=ItemLookup&ResponseGroup=Request%2CLarge&SearchIndex=Books&Service=AWSECommerceService&Timestamp=" & timestamp & "&Version=" & APIVersion

以下の様な感じに変更。

'JAN(EAN)コードの場合のリクエスト生成処理
If Len(convBefCode) = 8 Or Len(convBefCode) = 13 Then
    rawText = "AWSAccessKeyId=" & AWS_KEYID & "&AssociateTag=" & associateid & _
              "&IdType=EAN&ItemId=" & convBefCode & _
              "&Operation=ItemLookup&ResponseGroup=ItemAttributes&SearchIndex=All&Service=AWSECommerceService&Timestamp=" & _
              timestamp & "&Version=" & API_VERSION

'JAN(EAN)でない場合は一律ASINとして処理
Else
    rawText = "AWSAccessKeyId=" & AWS_KEYID & "&AssociateTag=" & associateid & _
              "&IdType=ASIN&ItemId=" & convBefCode & _
              "&Operation=ItemLookup&ResponseGroup=ItemAttributes&Service=AWSECommerceService&Timestamp=" & _
              timestamp & "&Version=" & API_VERSION
End If

※「convBefCode」は新しく作成したstring変数で、シート上から参照した商品コード(ASIN or JAN)が格納されています。また、その他幾つかの固定値変数も定数化しています。

ASINとJANの判別方法は色々ありますが、とりあえず今回は文字数で判定を行う様にしています。

JANコードは8桁または13桁の整数、ASINは英数字で構成された10桁の番号でそれぞれ構成されていますので、判定処理は単純ですね。

それぞれの商品コードの処理上の違いとして、まず1つ目は「IdType」の指定が異なる事です。

JANコードを用いて商品検索を行う場合、この「IdType」には「EAN」と指定する必要があります。「JAN」という単語は使用できません。ただしASINコードの場合はそのまま「ASIN」でOKです。

続いて2つ目は、SearchIndexの指定です。

ASINの場合は必要ありませんが、EANコードを用いて検索を行う場合はSearchIndexの指定が必須となります。

Indexに指定できる値は国ごとに異なりますので、リクエスト送信先の国でどの指定が利用できるかは以下のAmazonのページから確認して下さい。

Product Advertising API
 – 左の項目からItemLookupを選択
 - SearchIndexの項目にあるリンクから一覧表に飛べる

私は今回「All」を使用していますが、細かく指定する理由も今の所よく分からないので迷う様であればAll指定で良いと思います。

getXMLDoc関数の修正

続いてgetXMLDoc関数の修正を行います。

前回辺りの記事で、リクエストが”503”の発生で失敗する可能性があると書きましたが、この部分の対策を入れます。

'==========================================================
' 指定したURLのレスポンスXMLをMSXML2.DOMDocument形式で返す
'==========================================================
Public Function getXMLDoc(url As String) As MSXML2.DOMDocument
    Dim objXML As Object        'サイトデータの格納先
    Dim objDoc As Object        'ドキュメントの格納先
    Dim retryCount As Integer

    'XMLHTTPオブジェクトを生成
    Set objXML = CreateObject("MSXML2.XMLHTTP")
    retryCount = 0
    
    Do
        Call objXML.Open("GET", url, False)
        Call objXML.send
    
        'ロード完了まで待つ
        Do While objXML.readyState <> 4
            Sleep 100
            DoEvents
        Loop
        
        If objXML.Status = "503" Then Sleep 1000
        
        retryCount = retryCount + 1
        If retryCount > 5 Then
            MsgBox "リトライ回数が5回を超えました。" & vbCrLf & _
                   "処理を中断します。" & _
                   "Statusの状態:" & objXML.Status
            End
        End If
    Loop Until objXML.Status = "200"

    'DOM操作を行える様にする
    Set objDoc = New MSXML2.DOMDocument
    objDoc.LoadXML objXML.responseText

    Set getXMLDoc = objDoc
End Function

簡単ですが、こんな感じで十分でしょう。

Statusに200が返っていればXMLドキュメントを呼び出し元に返して終了。

503であれば1秒空けてリトライ。

6連続503で一向に値が返って来ない場合、または構文ミスでエラーとなっている場合はメッセージを表示して強制終了。という内容です。

スポンサーリンク

目的のデータの取り出し

最後に、返ってきたXMLからASINとJAN(EAN)を抽出します。

今回対象とした商品のXMLは以下の通りです。

<?xml version="1.0" ?>
<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">
  <OperationRequest>
    (省略)
  </OperationRequest>
  <Items>
    <Request>
      <IsValid>True
      </IsValid>
      <ItemLookupRequest>
        <IdType>EAN
        </IdType>
        <ItemId>4988602169188
        </ItemId>
        <ResponseGroup>ItemAttributes
        </ResponseGroup>
        <SearchIndex>All
        </SearchIndex>
        <VariationPage>All
        </VariationPage>
      </ItemLookupRequest>
    </Request>
    <Item>
      <ASIN>B01DI89IP8
      </ASIN>
      <DetailPageURL>https://www.amazon.co.jp/(省略)
      </DetailPageURL>
      <ItemLinks>
        <ItemLink>
          <Description>Add To Wishlist
          </Description>
          <URL>https://www.amazon.co.jp/gp/registry/wishlist/(省略)
            01DI89IP8
          </URL>
        </ItemLink>
        <ItemLink>
          <Description>Tell A Friend
          </Description>
          <URL>https://www.amazon.co.jp/gp/pdp/taf/(省略)
          </URL>
        </ItemLink>
        <ItemLink>
          <Description>All Customer Reviews
          </Description>
          <URL>https://www.amazon.co.jp/review/product/(省略)
          </URL>
        </ItemLink>
        <ItemLink>
          <Description>All Offers
          </Description>
          <URL>https://www.amazon.co.jp/gp/offer-listing/(省略)
          </URL>
        </ItemLink>
      </ItemLinks>
      <ItemAttributes>
        <Artist>ヴァリアス</Artist>
        <Binding>CD</Binding>
        <Brand>コナミ株式会社</Brand>
        <EAN>4988602169188</EAN>
        <EANList>
          <EANListElement>4988602169188</EANListElement>
        </EANList>
        <Format>CD+DVD</Format>
        <IsAdultProduct>0</IsAdultProduct>
        <Label>SMD itaku (music)</Label>
        <ListPrice>
          <Amount>3564</Amount>
          <CurrencyCode>JPY</CurrencyCode>
          <FormattedPrice>¥ 3,564</FormattedPrice>
        </ListPrice>
        <Manufacturer>SMD itaku (music)</Manufacturer>
        <NumberOfDiscs>2</NumberOfDiscs>
        <NumberOfItems>2</NumberOfItems>
        <PackageDimensions>
          <Height Units="100分の1インチ">47</Height>
          <Length Units="100分の1インチ">559</Length>
          <Weight Units="100分の1ポンド">26</Weight>
          <Width Units="100分の1インチ">488</Width>
        </PackageDimensions>
        <ProductGroup>Music</ProductGroup>
        <ProductTypeName>ABIS_MUSIC</ProductTypeName>
        <PublicationDate>2016-05-24</PublicationDate>
        <Publisher>SMD itaku (music)</Publisher>
        <ReleaseDate>2016-05-25</ReleaseDate>
        <RunningTime Units="分">77</RunningTime>
        <SeikodoProductCode>GFCA-419</SeikodoProductCode>
        <Studio>SMD itaku (music)</Studio>
        <Title>Magical Halloween 5 Original Soundtrack(DVD付)</Title>
      </ItemAttributes>
    </Item>
  </Items>
</ItemLookupResponse>

これを元に作成した、ASINとJAN(EAN)を抽出する部分は以下の通りです。

Set XMLDocument = getXMLDoc(URI)
            
asinCode = ""
janCode = ""

'ASIN
Set xmlData = Nothing
On Error Resume Next
Set xmlData = XMLDocument.SelectSingleNode("//ItemLookupResponse/Items/Item/ASIN")
On Error GoTo 0
If Not (xmlData Is Nothing) Then asinCode = xmlData.text

'JAN(EAN)
Set xmlData = Nothing
On Error Resume Next
Set xmlData = XMLDocument.SelectSingleNode("//ItemLookupResponse/Items/Item/ItemAttributes/EAN")
On Error GoTo 0
If Not (xmlData Is Nothing) Then janCode = xmlData.text

'出力
Cells(row, ASIN_COL).Value = asinCode
Cells(row, JAN_COL).Value = janCode

これで完成です。

シート側の見た目の整備と、細かい部分のコード整形を施して完成したものがこちら↓

※2次配布は禁止。改変は可。

サポートや修正対応などは行いませんので、エラー対応は各自お願いします。

見た目はこんな感じ。

API利用のための認証コードをAmazonから取得すれば、誰でも簡単にASINとJAN(EAN)の読み替えができます。

実行する際はModule1のGetBookInfoFromAmazon関数を実行すればOK。

関数名がGetBookInfoとなっていますが、名前を変更せずそのまま使い回しているだけなので気にしないで下さい。

ところで・・・

ランサーズではこの機能のツールが1本5,000円で売れてるらしいです。

私にも5,000円下さい。

いや、3,000円でもいいです。

ということで、また思い付いたら何か作ってみようと思います。

ではまた!

関連記事と広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. s より:

    こんにちは。以前メルマネツールをいただいた者です。

    私自身そこまで出品数が多くないこともあり(1週間に1回、10個ほどまとめて出品するくらいで、その中の1個か2個がなんとか売れるかな、ぐらいのレベルです)、いただいたものの使っていなかったのですが(申し訳ございません)、先日初めて使ったところあまりの便利さに感動してしまいました。只今断捨離中なこともあり、それまで出品していたものも含めかなりの数を出品したのですが、1日で10個近く売れ、今までそんなに売れたことがなかったのでびっくりしてしまいました。

    遅くなりましたが、このような素敵なツールを譲っていただきありがとうございました。今後少しずつ出品数を増やしていけたらな、とぼんやりとですが考えております。

    それと少し気になったのですが、このツールでラクマのみの出品は可能なのでしょうか?今まで手数料のこともありラクマやフリルとメルカリの商品価格を変えていたのですが、このツールでラクマのみの出品のやり方があるのかわからず、現在はメルカリの価格で揃えて出品しております。手動で出品していたときに比べかなり楽になり、非常に助かっているのですが、もしラクマのみで出品する方法があれば教えていただけますと幸いです。なければ無視していただいて構いません。もしございましたらよろしくお願い致します。

    れいんさんのブログに自動出品ツールの作り方の記事もあったので、フリルとラクマのセットのツールが欲しいなあと思い少し見させていただいたのですが、パソコン初心者同然の私にはさっぱりでした(^^;)プログラミングができる人は本当に尊敬してしまいます。興味深い記事がたくさんあるので、今後、ちょくちょく遊びに来ますね(*^^*)

    長文乱文失礼いたしました。

    • 藤美れいん より:

      ご報告ありがとうございます!
      活用頂いている様で嬉しい限りです。

      ラクマのみの出品については、残念ながらメルマネではできません。
      元々メルカリ用のツールとして作成しており、ラクマはオプション的な扱いで追加した機能ですので、使い方としては「メルカリに出品した”ついでに”ラクマにも出品」という使い方を想定した作りとなっています。

      私がもっとラクマを活用していれば、
      それぞれ個別に出品や再出品をできる様にしたりと機能的に色々盛り込むのですが・・・
      ラクマだと全然売れないのでやる気が出ないんです。(笑)

      稀にツールの更新も行っていますので、思い出した時にでもまた見に来て頂ければ幸いです。

  2. s より:

    お返事ありがとうございます!
    たしかにラクマはなかなか売れないですものね・・・。今日のニュースでメルカリの使い勝手が悪くなると知り、もともと売上の少ない私は今後もメルカリを続けるか悩んでしまいます(*_*)
    これからも陰ながらブログを応援しておりますm(_ _)m

  3. あさほ より:

    いつもお世話になっております。便利なツールを利用させていただいております。
    ブログを拝見させていただいておりますが、Amazon系のツールはもう作成する予定などはありませんでしょうか?
    というのもRSSを使っていたのですが、最近RSSが廃止されてしまって、私の知識ではRSSを引っ張るツールなどというものは作成できず・・・
    ほかにも色々なサイトのRSSの廃止が相次いでいるのでどうにかなればと思いコメントさせていただきました。
    RSSでタイトルだけを引っ張るツールは存在するのですが、画像や本文までとれるものはないようでした・;
    あまり高額でなければ有料でもリリースしてくれたらうれしいなと思っております。

    • 藤美れいん より:

      返信が遅くなり申し訳ありません!
      残念ながら今の所、Amazon系ツールの作成予定は無いですね・・・

      検索してみた所、他ブログ様で非公式のRSS取得サービスを公開されている所がある様ですので、探されてみてはいかがでしょうか。