ZoomのAPIを使ってみた

#　はじめに
Zoomの会議を作成するAPIを使ってみたので、備忘として手順を残します。
時世的にZoomを利用している方多いと思うので、参考になれば幸いです。

# [準備] アプリの登録
[マーケットプレイス](https://marketplace.zoom.us/)からBuild Appを選択し、アプリの登録を進めます。
![01_developer_sitte.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315961/fde919e3-60dc-7d60-8341-1bafed151227.png)

今回のサンプルではJWTでの認証を選択します。
Choose your app typeでJWTのcreateボタンを押し、アプリの名前を設定します。
![02_choose_app_type.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315961/c9f0172a-c43b-2c0e-45d6-3a40e1a0cff6.png)

続いて項目を埋めて行きます。赤枠で囲まれた必須項目のみ埋めています。
入力できたら右下のContinueを押します。
![03_information.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315961/4fad5d7d-39ec-b7f9-5809-32937af5a7b1.png)

App Credentialsの画面でAPI KeyとAPI Secretが得られます。
この画面下部の「View JWT Token」を押すと期限付きのトークンが表示されます。
アプリケーションからAPIを呼び出す準備としてはここまでで完了です。
![04_credential.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315961/c0c0ce22-90d2-c756-6b8c-3eecc3cd2b79.png)

# サンプルプログラム
公式のnodeサンプルを参考にZoomの会議作成APIを実行するサンプルを作ってみます。
[サンプル]
https://github.com/zoom/zoom-api-jwt

[会議作成API仕様]
https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingcreate

[index.js] ※会議作成APIを実行して、レスポンスをテキストに書き出すサンプル

```javascript

// 依存ライブラリ
const jwt = require('jsonwebtoken');
const rp = require('request-promise');
// 定数
const userId = 'xxx@xxx.com'; // Zoomアカウント(メールアドレス)
const apiKey = 'xxxxxxxxxxx'; // api key
const apiSecret = 'xxxxxxxx'; // api secret
 
// payload
const payload = {
   iss: apiKey,                            // API Keyを指定
   exp: ((new Date()).getTime() + 3600000) // トークン有効期限 1時間
};
 
// token生成
const token = jwt.sign(payload, apiSecret);
 
// APIリクエストの設定
let options = {
   method: 'POST',
   url: 'https://api.zoom.us/v2/users/' + userId + '/meetings',
   auth: { 'bearer': token },
   headers: {
       'User-Agent': 'Zoom-api-Jwt-Request',
       'content-type': 'application/json'
   },
   json: {
       'topic': 'test meeting',
       'type': '2',
       'start_time': getMeetingDate(), // 現在日時の1日後
       'timezone': 'Asia/Tokyo',
       'settings': { 'use_pmi': 'false' }
   }
};
 
// リクエスト
rp(options)
   .then(function (resJson) {
       writeToFile(resJson); // レスポンスをファイルに書き出す
   })
   .catch(function (err) {
       console.log(err);
   })

// getMeetingDate, writeToFileは省略
```

### トークン生成
index.jsの抜粋。API実行に必要なトークンを実行ごとに生成しています。

```javascript

// payload
const payload = {
   iss: apiKey,                            // API Keyを指定
   exp: ((new Date()).getTime() + 3600000) // トークン有効期限 1時間
};
 
// token生成
const token = jwt.sign(payload, apiSecret);
```

### APIのパラメータ
index.jsの抜粋。APIのパラメータを設定しています。

```javascript

let options = {
   〜中略〜
   json: {
       'topic': 'test meeting',
       'type': '2',
       'start_time': getMeetingDate(), // 現在日時の1日後
       'timezone': 'Asia/Tokyo',
       'settings': { 'use_pmi': 'false' }
   }
};
```
設定しているパラメータの説明。

| パラメータ               | 説明        |
|:----------------------|:------------|
| topic                 | 会議のタイトル |
| type                  | 会議タイプ。2を指定で会議予約。1だと即時。<br>3, 8で定期会議も設定可能 |
| start_time            | 会議の開始時間。`yyyy-MM-dd T HH:mm:ss`形式。 |
| timezone              | タイムゾーン指定。[サポートするタイムゾーンの一覧](https://marketplace.zoom.us/docs/api-reference/other-references/abbreviation-lists#timezones)。 |
| settings              | 各種設定 |
| settings > use_pmi    | PMI(Personal Meeting ID)を使うかどうか。 |

### 実行結果

```json

{
 "id": 11111111111,
 "join_url": "https://xxxxx.zoom.us/j/xxxx?pwd=xxxxx",
 "password": "xxxxxx"
}
```
よく使いそうなものだけ抜粋しました。
※ 全文はAPI仕様のReferenceを参照

idとpasswordは、まんま会議のID/PWで、join_urlが会議のURLです。
会議作成APIをアプリに組み込んだ場合、これらの情報をメールやチャットで相手に送るような使い方が多いかと思います。

# 参考
開発者ドキュメント
https://marketplace.zoom.us/docs/guides

APIリファレンス
https://marketplace.zoom.us/docs/api-reference/introduction