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

この記事は、2022年8月18日に企業ブログで掲載したものの転記となります。


# ■□■ はじめに ■□■

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


今回はAmazonが公式で提供している**SP-API**というものあり実際に使った際にちょっと難しかった点や
ハマった点等を記事で残そうとおもいます。

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

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

[Amazon Sp-API 公式概要ページ](https://developer.amazonservices.jp/)
[Amazon Sp-API ドキュメント top](https://developer-docs.amazon.com/sp-api)


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

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

# ■□■ とりあえずコード化するまえに手で ■□■

[Postman](https://www.postman.com/)というツールがるので使ってみましょう。
無料だし、初めての方は直感的で一番わかりやすいと思います。

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

![スクリーンショット 2022-07-01 10.34.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/baace0e7-0ec2-b335-a2dc-2bb1cd15ec5d.png)


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

そしてまずここで躓きます。
ドキュメントをみて、、、おい・・・
access_tokenってどうやってつくるんだよ・・・

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

https://developer-docs.amazon.com/sp-api/docs/using-postman-for-selling-partner-api-models


:::note
まずは必要な情報です。★★★がついているのは出品者情報なのでこれは取得している前提です
リフレッシュトークンを取得するには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認証情報)
:::

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

![スクリーンショット 2022-07-01 10.47.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/b7f33285-521b-c862-1442-174e00b9270f.png)


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

```json
{
    "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 ` っていうのがあってこれを押すと
下のような感じで実際のコードが取得できるんですよね。
これだいぶ参考になりました。

![スクリーンショット 2022-07-01 11.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/53d690f9-124e-a186-75ea-73200dea875b.png)


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


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

```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を取得できるとあとはいろんな処理を動かすだけになります。
(まあそれも大変なんですが、、、)

次からはorder,report,feedといったところを触って行きたいと思います
ここからは結構試行錯誤してやったのでぜひ見ていただければと思います。


ではよいAmazon SP-APIライフを