Go 言語用 PA-API v5 クライアント・パッケージ

no extension

本パッケージは Amazon Product Advertising API v5 へアクセスできる Go 言語用クライアント・パッケージだ。 API を通じて Amazon で取り扱っている商品の情報を取得できる。

なお goark/pa-api パッケージは Go 1.16 以上を要求する。 ご注意を。

check vulns lint status GitHub license GitHub release

インポート

import "github.com/goark/pa-api"

簡単な使い方

PA-API アクセス用のパラメータ

使い方の前に,この記事で使用する PA-API アクセス用のパラメータを以下に例示しておく。

パラメータ名
マーケットプレイス www.amazon.co.jp
アソシエイト・タグ mytag-20
アクセス・キー AKIAIOSFODNN7EXAMPLE
シークレット・キー 1234567890

もちろん実際には使えないのでご安心を(笑)

サンプル・コード

以下に簡単なコード例を示す。

package main

import (
    "bytes"
    "fmt"
    "io"
    "os"

    paapi5 "github.com/goark/pa-api"
    "github.com/goark/pa-api/query"
)

func main() {
    //Create client
    client := paapi5.New(
        paapi5.WithMarketplace(paapi5.LocaleJapan),
    ).CreateClient(
        "mytag-20",
        "AKIAIOSFODNN7EXAMPLE",
        "1234567890",
        paapi5.WithHttpClient(&http.Client{}),
    )

    //Make query
    q := query.NewGetItems(
		client.Marketplace(),
		client.PartnerTag(),
		client.PartnerType(),
	).
		ASINs([]string{"B07NVMYB7K"}).
		EnableItemInfo().
		EnableImages().
		EnableParentASIN()

    //Requet and response
    body, err := client.Request(q)
    if err != nil {
        fmt.Printf("%+v\n", err)
        return
    }
    io.Copy(os.Stdout, bytes.NewReader(body))
}

このコードの実行結果はこんな感じ。

$ go run sample.go | jq .
{
  "ItemsResult": {
    "Items": [
      {
        "ASIN": "B07YCM5K55",
        "DetailPageURL": "https://www.amazon.co.jp/dp/B07YCM5K55?tag=mytag-20&linkCode=ogi&th=1&psc=1",
        "Images": {
          "Primary": {
            "Large": {
              "Height": 500,
              "URL": "https://m.media-amazon.com/images/I/51Ef9EF+HaL.jpg",
              "Width": 352
            },
            "Medium": {
              "Height": 160,
              "URL": "https://m.media-amazon.com/images/I/51Ef9EF+HaL._SL160_.jpg",
              "Width": 113
            },
            "Small": {
              "Height": 75,
              "URL": "https://m.media-amazon.com/images/I/51Ef9EF+HaL._SL75_.jpg",
              "Width": 53
            }
          }
        },
        "ItemInfo": {
          "ByLineInfo": {
            "Contributors": [
              {
                "Locale": "ja_JP",
                "Name": "宮成楽",
                "Role": "著"
              }
            ],
            "Manufacturer": {
              "DisplayValue": "竹書房",
              "Label": "Manufacturer",
              "Locale": "ja_JP"
            }
          },
          "Classifications": {
            "Binding": {
              "DisplayValue": "Kindle版",
              "Label": "Binding",
              "Locale": "ja_JP"
            },
            "ProductGroup": {
              "DisplayValue": "Digital Ebook Purchas",
              "Label": "ProductGroup",
              "Locale": "ja_JP"
            }
          },
          "ContentInfo": {
            "Languages": {
              "DisplayValues": [
                {
                  "DisplayValue": "日本語",
                  "Type": "発行済み"
                }
              ],
              "Label": "Language",
              "Locale": "ja_JP"
            },
            "PagesCount": {
              "DisplayValue": 116,
              "Label": "NumberOfPages",
              "Locale": "en_US"
            },
            "PublicationDate": {
              "DisplayValue": "2019-09-27T00:00:00.000Z",
              "Label": "PublicationDate",
              "Locale": "en_US"
            }
          },
          "ProductInfo": {
            "IsAdultProduct": {
              "DisplayValue": false,
              "Label": "IsAdultProduct",
              "Locale": "en_US"
            },
            "ReleaseDate": {
              "DisplayValue": "2019-09-27T00:00:00.000Z",
              "Label": "ReleaseDate",
              "Locale": "en_US"
            }
          },
          "TechnicalInfo": {
            "Formats": {
              "DisplayValues": [
                "Kindle本"
              ],
              "Label": "Format",
              "Locale": "ja_JP"
            }
          },
          "Title": {
            "DisplayValue": "晴れのちシンデレラ (12) (バンブーコミックス MOMOセレクション)",
            "Label": "Title",
            "Locale": "ja_JP"
          }
        }
      }
    ]
  }
}

リクエスト実行インスタンスの生成

上のコード例の

client := paapi5.New(
    paapi5.WithMarketplace(paapi5.LocaleJapan),
).CreateClient(
    "mytag-20",
    "AKIAIOSFODNN7EXAMPLE",
    "1234567890",
    paapi5.WithHttpClient(&http.Client{}),
)

がリクエストを実行する paapi5.Client 型のインスタンスを生成している部分である。 ちなみに

client := paapi5.DefaultClient("mytag-20", "AKIAIOSFODNN7EXAMPLE", "1234567890") //Create default client

と既定値で簡単に paapi5.Client インスタンスを生成することもできるが,マーケットプレイスが米国(www.amazon.com)になるのでご注意を。

クエリの生成とリクエストの実行

リクエストを実行する関数

func (c *Client) Request(q Query) ([]byte, error)

の引数 paapi5.Query は interface 型で以下のように定義している。

type Query interface {
    Operation() Operation
    Payload() ([]byte, error)
}

paapi5.Query.Operation() 関数の返り値の paapi5.Operation 型は以下のように定義している。

type Operation int

const (
    NullOperation Operation = iota
    GetVariations
    GetItems
    SearchItems
)

paapi5.Query.Payload() 関数はリクエストのペイロードにセットする JSON データを返す。 JSON データの内容は,例えばこんな感じ。

{
 "ItemIds": [
  "B07YCM5K55"
 ],
 "Resources": [
  "Images.Primary.Small",
  "Images.Primary.Medium",
  "Images.Primary.Large",
  "ItemInfo.ByLineInfo",
  "ItemInfo.ContentInfo",
  "ItemInfo.Classifications",
  "ItemInfo.ExternalIds",
  "ItemInfo.ProductInfo",
  "ItemInfo.Title"
 ],
 "PartnerTag": "mytag-20",
 "PartnerType": "Associates",
 "Marketplace": "www.amazon.co.jp",
 "Operation": "GetItems"
}

適切な paapi5.Operation 値と JSON データを出力できるのであれば,利用者側でクエリ・オブジェクトを自由に設計できる。

余談だが…

ある型が特定の interface 型に適合するかコンパイル時点でチェックするには以下の記述を加えるとよい。

var _ paapi5.Query = (*CustomQuery)(nil)

context.Context を付けてリクエストを実行する

先ほどのリクエスト実行関数

func (c *Client) Request(q Query) ([]byte, error)

の代わりに, context.Context を引数に加えた

func (c *client) RequestContext(ctx context.Context, q Query) ([]byte, error)

メソッドを使うこともできる。

クエリの実例とレスポンスの取り込み例

goark/pa-api パッケージではクエリ用のサンプルとして paapi5/query サブパッケージを用意している。 最初のコード例の

q := query.NewGetItems(
    client.Marketplace(),
    client.PartnerTag(),
    client.PartnerType(),
).
    ASINs([]string{"B07NVMYB7K"}).
    EnableItemInfo().
    EnableImages().
    EnableParentASIN()

の部分がそれである。 また paapi5.Client.Request() 関数の出力結果を構造体に落とし込むための paapi5/entity サブパッケージも用意した。 どちらもそのままではあまり使い勝手がいいとは言えないが,コード例として自由に利用していただいて構わない。

なお goark/pa-api パッケージは Apache License, Version 2.0 でライセンスしている。

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)