ASTERIA WarpでZoom APIを使ってみる

社内のイベント担当者からZoomウェビナーの参加者情報をCRMに連携したいと要望があったので、Zoom API(ウェビナー)をWarpで使ってみました。
この記事ではZoom APIを使って参加者情報を取得するまでを紹介します。

<参考サイト>
・[OAuth with Zoom](https://marketplace.zoom.us/docs/guides/auth/oauth)
・[Zoom API](https://marketplace.zoom.us/docs/api-reference/zoom-api)
・[CData Software Blog Zoom APIの使い方：OAuth・JWT による認証方法・Postman での実行方法](https://www.cdatablog.jp/entry/2020/08/17/085924)

## Zoom APIを使う事前準備
### アプリ登録
まずはZoom APIを使うためにアプリの登録します。
[App Marketplace](https://marketplace.zoom.us/)の右上Develop>View App Types をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/d14e5fdd-021d-0373-1b7c-6ade8b18b46d.png)
アプリタイプを選択する画面が出てきます。本記事ではOAuthを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/f1122020-abd2-9f8f-1d7b-bafab34d7d21.png)

OAuthのCreateボタンをクリックするとアプリ作成の画面が表示されるので、それぞれ入力・設定をしていきます。
・App Name：お好きなアプリ名を入力してください。
・Choose app type：今回はサンプルなのでUser-managed appにします。
・Would you like to publish this app on Zoom App Marketplace?：社内用なのでMarketplaceへの公開はオフにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/c6eac805-1acd-ac1a-1bc6-55728bd1ad5b.png)

3項目をそれぞれ設定したらCreateボタンをクリックして作成します。

#### App credentials
アプリを作成するとClientIDとClient Secretが追加されます。
加えてAccessToken取得に必要な認可codeを取得するためのリダイレクトURLを入力してください。
そこで入力したURLと同じものをAdd allow listsにも入力しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/21ac070a-d75b-b4b9-c6bb-61b89c9884d6.png)

#### Information
次の画面では基本情報を入力します。optionalがついていない項目はすべて入力する必要があるようです。
・App name
・Short description
・Long description
・Company Name
・Developer Contact Information(2項目)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/479feb80-9943-e49e-4f67-07af5cf622e5.png)

#### Feature
Event subscriptions：Webhook通知の受信が必要な場合はONにするようです。今回はOFFでいきます。

#### Scopes
+Add Scopes から必要なScopeを選択します。今回はWebinarのレポート情報なので、webinar:readのみ選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/1fac4f67-42ea-24b9-93a8-27dc5b3dfccd.png)

#### インストール
インストール後、承認すると設定したリダイレクトURLにリダイレクトします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/6b382e75-29b3-9dde-7626-5273ea121495.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/cad57e39-c22e-a1e1-5967-965000f76e3b.png)

以下のようにcodeが取得できるので、このcodeを使ってAccessTokenを取得していきます。
`https://yourapp.com/?code=obBEe8ewaL_KdyNjniT4KPd8ffDWt9fGB`

### Access Token取得
いよいよここからASTERIA Warpの登場です。AccessToken取得は最初の1回のみですが、フローを作ってやってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/79e49a4b-76b7-30a3-4905-636317c66f98.png)
RESTコンポーネントの設定内容を紹介します。
・基本プロパティ

| プロパティ名 | 値 | 
|:-:|:-:|
|URL|https://zoom.us/oauth/token|
|HTTPメソッド|POST|

・URLパラメーター

| パラメーター名 | 値 |
|:-:|:-:|
|grant_type|  authorization_code |
| code  | (アプリインストール時に取得したcode)  |
|  redirect_uri | (アプリ設定で登録したリダイレクトURL) |

・送信ヘッダー

| ヘッダー名 | 値 |
|:-:|:-:|
| Authorization | Basic (クライアントID:クライアントシークレットをBase64エンコードした値) |

Authorizationの値は取得したクライアントIDとクライアントシークレットを:つなぎで結合しBase64エンコードした後、先頭に`Basic `を追加した値です。

ストリームはjson(Text)でもXMLでもどちらでもよいですが、以下のように返ってくるレスポンスからaccess_tokenとrefresh_tokenを取得できるように設定しておきます。また、取得したアクセストークンとリフレッシュトークンは保存しておきましょう。

```
{
  "access_token": "eyJhbGciO~(省略)~vjHw",
  "token_type": "bearer",
  "refresh_token": "eyJhbGciO~(省略)~ZAfA",
  "expires_in": 3599,
  "scope": "webinar:read"
}
```

## Zoomウェビナーの登録者情報を取得
アクセストークンの準備ができたら、いよいよZoom API経由で登録者情報を取得します。セミナーは複数開催しているので、現在申込ページを公開しているセミナー毎にデータを取得します。
全体の流れのフローはこちら↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/060ca816-66e5-b64b-7876-757f25dbc5f3.png)

### GET /webinars/{webinarId}/registrants を使う
フロー内、2のサブフロー処理を詳しく紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/a2dd4a85-0184-29e9-5f39-f45938b0e85d.png)
メインフロー取得したwebinarIdを元に登録者を取得します。
1回のリクエストで取得できる人数が300名までなので、300名以上でも取得できるよう適当な回数繰り返しています。
ここでもRESTコンポーネントの設定内容については詳しく紹介します。

・基本プロパティ

| プロパティ名 | 値 | 
|:-:|:-:|
|URL|https://api.zoom.us/v2|
|パス|/webinars/(webinarID)/registrants|
|HTTPメソッド|GET|

・URLパラメーター

| パラメーター名 | 値 |
|:-:|:-:|
| page_size |300|
| next_page_token |(2ページ目以降指定)|

・送信ヘッダー

| ヘッダー名 | 値 |
|:-:|:-:|
| Authorization | Bearer (アクセストークン) |

そのあとのデータ整形部分は省略します…。
レスポンスのnext_page_tokenに値が含まれる場合、次のページがあるので
フロー変数などに保存しておいてAPI実行を繰り返します。next_page_tokenに値が入っていなければ終了して
メインフローに戻ります。

### トークンリフレッシュ
アクセストークンの有効期限が切れたら、リフレッシュトークンを使って更新します。
codeからアクセストークン取得した方法とほとんど同じで、URLパラメーターのみ、以下のように異なります。

・URLパラメーター

| パラメーター名 | 値 |
|:-:|:-:|
|grant_type|  refresh_token |
| refresh_token  | (保存したリフレッシュトークン)  |

## 実行
CRMへの登録と同時に社内Slackに人数を投稿しています。毎週便利に動いてますよ～。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/1fc87da7-c94d-6da7-aa88-01578ff316cb.png)

##終わりに
記事後半がかなり大雑把な説明になってしまいましたが、、、フローの作り方は人ぞれぞれということで参考程度に見てください:sweat_smile:
前半のアプリ作成画面はすぐ変わってしまうかもしれません。英語が苦手でなければ公式ドキュメントをみるのが一番だと思います。