Shopee API v2まとめ

## Shopeeとは
Shopeeとは、シンガポールに本社を置く越境ECプラットフォームで、東南アジアや台湾で最大規模のEコマースプラットフォーム。物流網では100を超える宅配事業者と提携することで購入したその日や翌日に届くため、東南アジアのAmazonとも言われているらしい。

## Shopee Open API v2.0
Shoppee Open APIを使用することで製品、注文、キャンペーン管理などの情報にアクセスできる。

2種類の開発者向けにサポートされている。
 - ソフトウェア サービス プロバイダー: 当社は、ソフトウェア ビジネス向けの Shopee の主要な e コマース プロセスすべてをカバーする包括的なオープン API を提供しています。Shopee Open Platform を活用することで、ショップ運営、マーケティングなど、販売者のニーズを満たすさまざまなアプリを提供できるようになります。
 - ソフトウェア開発能力を持つ販売者: ビジネスニーズに合わせたソフトウェアを開発したい販売者の場合は、Shopee のシステムと統合して、運用の最適化とデータ管理の分野で未開発の可能性を発見してください。

 3種類のShopee Open Platformのアカウントの種類を選べる。
 - 個人販売者-営業許可証なしでShopeeで販売する個人のアカウント。(Shopeeショップのサポートサービスのみ)
 - 登録済みビジネス販売者- 登録ライセンスを持ち、Shopee で販売しているビジネスのアカウント。(Shopee ショップのサポートサービスのみ)
 - サードパーティ パートナー プラットフォーム (ISV) - Shopee の販売者にサービスを提供する登録ライセンスを持つ企業のアカウント。

多くが、個人販売者-営業許可証なしでShopeeで販売する個人のアカウントを選ぶ。

## API利用方法
AmazonやYhaoo, 楽天のAPIと違う点は、開発環境が手厚く用意されているところだ。
テスト実行用のSandboxとテスト用のShopeeアカウントを作成することができる。

1. 開発者アカウントの作成・申請
1. Shopeeの申請許諾
1. アプリ開発
1. テストAPI in SandBox and テストアカウント
1. 本番環境への移行申請(Go Live)

### 1. API開発者アカウント申請
1. [サインアップ](https://open.business.accounts.shopee.com/authenticate/signup?client_id=11&next=https%3A%2F%2Fopen.shopee.com%2Fopservice%2Fapi%2Fv1%2Faccount%2Finit_session%3Fredirect_url%3Dhttps%253A%252F%252Fopen.shopee.com%252F)する
1. [Shopee Open Platform](https://open.shopee.com/console/app)にログインする
1. アカウントタイプ(個人販売者 etc)を選択する
1. 画面に従って、必要項目を入力する
1. 送信を押す
1. Shopeeによるプロフィールの承認を待つ

### 2. API利用手順
1. [Shopee Open Platformのアプリ](https://open.shopee.com/console/app)を開く
1. Create a APPを押す
1. 必要事項を入力後、作成を押す

https://open.shopee.com/developer-guide/14

### 3. APIのテスト環境での開発
まずは開発権限でアプリが作成される。この場合は、自身のShopeeアカウントではなく、Shopee Open Platformのコンソール画面で作成できるテストアカウントを使用して検証する。

https://open.shopee.com/developer-guide/8

#### partner_idやpartner_key、shop_id、codeの取得
1. [Shopee Open Platformのアプリ](https://open.shopee.com/console/app)を開く
1. App Listから対象のアプリをクリックし、Test Partner_idとTest Partner Keyを取得する
1. Test AccountからCreate test Accountを押して、テスト用のShopeeショップアカウントを作成する
1. 正常に作成されると、Shop ID、Shop Account、Shop Passwordが確認できる
1. App Listから対象のアプリの"Authorize"のボタンを押して、Shop Account、Shop Passwordを使用してログインする
1. ログイン後、リダイレクトされたURLにcodeとshop idがあるので、メモする

これでAPIを叩くのに必要な情報が取得できた。

#### アクセストークンの取得
```Python
shopid = 11****
code = '*****************************'

def get_access_token(shopid, code):
    timest = int(time.time())
    host = "https://partner.test-stable.shopeemobile.com/"
    path = "/api/v2/auth/token/get"
    partner_id = *******
    partner_key = "*******************************************************"
    partner_key = partner_key.encode()
    tmp_base_string = "%s%s%s" % (partner_id, path, timest)
    base_string = tmp_base_string.encode()
    sign = hmac.new(partner_key, base_string, hashlib.sha256).hexdigest()
    url = host + path + "?partner_id=%d&timestamp=%s&sign=%s" % (partner_id, timest, sign)

    payload=json.dumps({
        "code": code,
        "shop_id": shopid,
        "partner_id": partner_id
    })
    headers = {
        'Content-Type': 'application/json'
    }
    response = requests.post(url,headers=headers, data=payload, allow_redirects=False)
    response = json.loads(response.text)
    print(response)
    access_token = response['access_token']
    refresh_token = response['refresh_token']
    return access_token, refresh_token

access_token, refresh_token = get_access_token(shopid, code)
print('access_token: ', access_token)
print('refresh_token: ', refresh_token)
```

#### リフレッシュトークンを用いてアクセストークンを更新する
```Python
shopid = 11****
access_token = '**************************'
refresh_token = '**********************************'

def refresh_access_token(shopid, refresh_token):
    timest = int(time.time())
    host = "https://partner.test-stable.shopeemobile.com/"
    path = "/api/v2/auth/access_token/get"
    partner_id = *******
    partner_key = "******************************************************"
    partner_key = partner_key.encode()
    tmp_base_string = "%s%s%s" % (partner_id, path, timest)
    base_string = tmp_base_string.encode()
    sign = hmac.new(partner_key, base_string, hashlib.sha256).hexdigest()
    url = host + path + "?partner_id=%d&timestamp=%s&sign=%s" % (partner_id, timest, sign)

    payload=json.dumps({
        "refresh_token": refresh_token,
        "shop_id": shopid,
        "partner_id": partner_id
    })
    headers = {
        'Content-Type': 'application/json'
    }
    response = requests.post(url, headers=headers, data=payload, allow_redirects=False)
    response = json.loads(response.text)
    print(response)
    access_token = response['access_token']
    refresh_token = response['refresh_token']
    return access_token, refresh_token

access_token, refresh_token = refresh_access_token(shopid, refresh_token)
print('access_token: ', access_token)
print('refresh_token: ', refresh_token)
```

#### ショップ情報の取得
```Python
def get_shop_info(shopid, access_token):
    timest = int(time.time())
    host = "https://partner.test-stable.shopeemobile.com/"
    path = "/api/v2/shop/get_shop_info"
    partner_id = *******
    partner_key_ = "******************************************************"
    partner_key = partner_key_.encode()
    tmp_base_string = "%s%s%s%s%s" % (partner_id, path, timest, access_token, shopid)
    base_string = tmp_base_string.encode()
    sign = hmac.new(partner_key, base_string, hashlib.sha256).hexdigest()
    url = host + path + "?partner_id=%d&timestamp=%s&sign=%s&shop_id=%s&access_token=%s" % (partner_id, timest, sign, shopid, access_token)

    payload={}
    headers = {}
    response = requests.get(url,headers=headers, data=payload, allow_redirects=False)
    response = json.loads(response.text)
    print(response)
    return shop_name, region, status

shop_name, region, status = get_shop_info(shopid, access_token)
```

#### 全カテゴリー情報の取得
```Python
def get_category_info(shopid, access_token):
    timest = int(time.time())
    host = "https://partner.test-stable.shopeemobile.com/"
    path = "/api/v2/product/get_category"
    partner_id = *******
    partner_key_ = "*****************************************************************"
    partner_key = partner_key_.encode()
    tmp_base_string = "%s%s%s%s%s" % (partner_id, path, timest, access_token, shopid)
    base_string = tmp_base_string.encode()
    sign = hmac.new(partner_key, base_string, hashlib.sha256).hexdigest()
    url = host + path + "?partner_id=%d&timestamp=%s&sign=%s&shop_id=%s&access_token=%s&language=zh-hans" % (partner_id, timest, sign, shopid, access_token)

    payload={}
    headers = {}
    response = requests.get(url,headers=headers, data=payload, allow_redirects=False)
    response = json.loads(response.text)
    print(response['response']['category_list'])
    category_list = response['response']['category_list']
    return category_list

category_list = get_category_info(shopid, access_token)
```

#### 末子カテゴリーの属性情報の取得
```Python
def get_attributes_info(shopid, access_token, category_id):
    timest = int(time.time())
    host = "https://partner.shopeemobile.com"
    path = "/api/v2/product/get_attributes"
    partner_id = ********
    partner_key_ = "*********************************************"
    partner_key = partner_key_.encode()
    tmp_base_string = "%s%s%s%s%s" % (partner_id, path, timest, access_token, shopid)
    base_string = tmp_base_string.encode()
    sign = hmac.new(partner_key, base_string, hashlib.sha256).hexdigest()
    url = host + path + "?partner_id=%d&timestamp=%s&sign=%s&shop_id=%s&access_token=%s&language=zh-hans&category_id=%s" % (partner_id, timest, sign, shopid, access_token, category_id)

    payload={}
    headers = {}
    response = requests.get(url,headers=headers, data=payload, allow_redirects=False)
    response = json.loads(response.text)
    attribute_list = response['response']['attribute_list']
    return attribute_list
```


#### 商品登録
*必須項目
 - original_price
 - description
 - weight
 - item_name
 - logistic_info
 - category_id
 - image


### 4. APIの本番環境への移行申請
認可を完了するには 4 つのステップがあります

1. 認可リンクの生成
1. ショップからの認可の取得
1. 認可コードの使用
1. access_token の取得と更新

認証リンクの生成
```Python
def shop_auth():
    timest = int(time.time())
    print(timest)
    host = "https://partner.shopeemobile.com"
    path = "/api/v2/shop/auth_partner"
    redirect_url = "https://google.com/"
    partner_id = ********
    partner_key = "***************************************************"
    partner_key = partner_key.encode()
    tmp_base_string = "%s%s%s" % (partner_id, path, timest)
    base_string = tmp_base_string.encode()
    sign = hmac.new(partner_key, base_string, hashlib.sha256).hexdigest()
    url = host + path + "?partner_id=%s&timestamp=%s&sign=%s&redirect=%s" % (partner_id, timest, sign, redirect_url)
    print(url)
```

1. 上記で生成されるURLをブラウザで開く
1. Shopeeにログインするように求められるので、国を選びログインする
1. リダイレクト先のURLにアクセストークンとの交換で使用するcodeとshop_idが付与されている

URLのパラメーターを何かしらの方法で取得して、アクセストークンと交換することで、APIを利用できる。

## APIの種類
 - Product
    以下の情報を取得できます。
     - 製品関連カテゴリツリー
     - 属性とブランド情報
     - ショップ商品データ
     - 製品プロモーション情報
     - ブーストアイテムとブーストアイテムリスト
     - 製品レビューとレビューリスト
     - 製品の推奨カテゴリと推奨属性
     - 登録製品ブランド
    
    次のアクションを実行します。
     - 製品情報を作成、削除、更新します。
 - Shop
	以下の情報を取得できます。
     - ショップ名
     - マーケットショップは
     - ショップタイプ
    
    次のアクションを実行します。
     - ショップ情報を更新
 - Merchant	*このモジュールは国境を越えた販売者のみ必要です
 - GlobalProduct	*このモジュールは国境を越えた販売者のみ必要です
 - MediaSpace
   動画や画像をアップロードする
 - Order
 - Logistics
     次の情報を入手します。
     - ショップチャンネル一覧
     - 配送パラメータ
     - 注文追跡番号と追跡情報
     - 出荷書類のフォーマットと出荷書類
     - 店舗住所一覧
    
     次のアクションを実行します。
     - 注文を発送する/注文をまとめて発送する
     - ショップ住所フラグを更新
     - ショップチャンネルを有効/無効にする
     - ショップの住所を削除する
 - Public
	 次のアクションを実行します。
     - 認可を受けた店舗のリストを取得する
     - 認可を与えた加盟店のリストを取得する
     - トークンを取得するには、コードを再送信してコードをアップグレードしてください
     - トークンの取得と更新
 - Push
    プッシュメカニズムの設定を取得して更新する


## まとめ
今回は、東アジア圏で利用者が多いShopeeのAPIについて、紹介した。