エンジニア

2022.08.18

Amazon SP-API をPythonで動かしてみた【実コードあり】(part1 auth : 準備からaccess_token取得まで)

■□■ はじめに ■□■

みなさーん Amazon さんにお世話になっていますか ??
私はAmazonさんにもAWSさんにも日頃からお世話になりまくりですw

今回はAmazonが公式で提供しているセリングパートナーAPI(SP-API)について、実際に使った際にちょっと難しかった点や
ハマった点等を何回かにわけて記事で残そうとおもいます。

SP-APIとは、公式の説明(日本語翻訳)

販売パートナーAPI(SP-API)はRESTベースのAPIであり、Amazonの販売パートナーが注文、出荷、支払いなどのデータにプログラムでアクセスできるようにします。SP-APIを使用するアプリケーションは、販売効率を高め、必要な労力を削減し、顧客への応答時間を改善して、 販売パートナーがビジネスを成長させるのに役立ちます。

https://developer-docs.amazon.com/sp-api/docs

要は主に出品者の方が使うんですが、プログラムで商品情報だったり、売上データだったりをとってこれるっていうことですね。
実際使ってみるとドキュメント全部英語だったり、ハマりどころが結構おおかったので記事にしてみました。

Amazon Sp-API 公式概要ページ
Amazon Sp-API ドキュメント top

■□■ SP-APIを使うにあたり前提 ■□■

  1. 出品者sellerセントラルのアカウントはすでにあるものとします。
  2. sellerセントラルのアカウント上でreflesh_tokenは作成されたものとします。
  3. AWSアカウントはすでに保持している状態とします。

■□■ とりあえずコード化するまえに手で 取得してみましょう■□■

Postmanというツールがあるので使ってみましょう。
無料だし、初めての方は直感的で一番わかりやすいと思います。

まず開くとこんな画面がでます。さぁ、ここから冒険が始まります。

一番はじめはrefresh_tokenからaccess_tokenを作成するんですが、
ここで初期準備を始めましょう!

そしてまずここで躓きます。
ドキュメントをみて、、、、
access_tokenの作り方の記載はどこにあるのでしょうか・・・?

っとなんと。。。ドキュメントのAuthorization APIではなくて、auth APIを使いますw
authの方はドキュメント上に記載がなくて、ユーザガイドにしれっと記載があるんですね・・・

ユーザーガイド (https://developer-docs.amazon.com/sp-api/docs)


まずは必要な情報です。★がついているのは出品者情報なのでこれは取得している前提です
リフレッシュトークンを取得するにはAWSのIAMユーザーが必要になります。

なのでIAMユーザーもある前提です。
※IAMユーザーの権限は次回パートにて記載しています。

method : POST
url : https://api.amazon.com/auth/o2/token
grant_type : "refresh_token" (固定)
refresh_token : ★ デベロッパーセントラルで生成したリフレッシュトークン
client_id : ★ クライアントID(デベロッパーセントラル > LWA認証情報)
client_secret : ★ クライアント機密情報(デベロッパーセントラル > LWA認証情報)

成功するとこんな感じになります。

失敗するとこんなエラーが返って来たりします。(これはrefresh_tokenを間違えたときのエラーです。)

{
    "error_description": "The request has an invalid grant parameter : refresh_token. User may have revoked or didn't grant the permission.",
    "error": "invalid_grant"
}

Postmanつかっててすごいなぁと思ったのは、画面はじに
</>Code snippet っていうのがあってこれを押すと
下のような感じで実際のコードが取得できるんですよね。
これだいぶ参考になりました。

■□■ コード化するとこんな感じになります ■□■

ここまでをpythonコードにするとこんな感じになります。
関数の一部抜粋なのでカスタマイズしてください。

import json
import urllib
import requests

def xxx () -> dict :

        # ApiCallに必要な情報を宣言
        url = 'https://api.amazon.com/auth/o2/token'

        headers = {
            'Content-Type': 'application/x-www-form-urlencoded'
        }

        # keyの並び順とかでエラーになったりするので順番はこの順番のままがよいです
        payload = {
            'grant_type': 'refresh_token',
            'refresh_token': '★ここは自分の値をいれてください',
            'client_id': '★ここは自分の値をいれてください',
            'client_secret': '★ここは自分の値をいれてください'
        }

        # payloadは url形式指定なので変換する
        # grant_type=refeash&refresh_token=xxxx&....
        str = urllib.parse.urlencode(payload)

        # 実際にリクエストを飛ばします
        response = requests.post(url, headers=headers, data=str)
        response.raise_for_status()

        # response.txtは文字列でかえってくるので辞書型に変換する
        token_info_dict = json.loads(response.text)

        # 実際の返却はこんな感じ
        # token_info_dict
        # { "access_token": "Atza|IwExxx"
        #   "refresh_token": "Atzr|IwEBIxxxxx",
        #   "token_type": "bearer",
        #   "expires_in": 3600}

        return token_info_dict

さてここまできてaccess_tokenを取得できるとあとはいろんな処理を動かすだけになります。
(まあそれも大変なんですが、、、)

次はorderAPI といったところを触って行きたいと思います
ここからはかなり試行錯誤してやったのでぜひ見ていただければと思います。

「ひと」とITをつなぐ をモットーに日々仕事に従事しております。

弊社に興味を持っていただけたら是非とも、エントリーフォームにからエントリーして、ハンズラボで一緒に仕事をしましょう!

一覧に戻る