ZOOM APIを利用してミーティングのスケジュールを編集する (スケジュール操作編)

<h2>前書き</h2>
ZOOMのページにログインせずにスケジュールを編集する必要があったため調査内容をまとめておきます。
執筆時点(2021-11-23)ではこの内容で実現できました。
今回はZOOMのAPIからスケジュールの編集を行います。(準備する部分は<a href="https://qiita.com/dioh09/items/42bc49d4f9ca74811906">こちら</a>)

<h2>APIでスケジュールをいじる</h2>
<h3>スケジュールを作成する</h3>
スケジュールの作成もユーザ情報を取得した時と同じようにリクエストを投げてjsonのレスポンスを受けるだけです。
スケジュール作成は`https://api.zoom.us/v2/users/ユーザのID文字列/meetings`に設定内容をPOSTします。
今回は以下のようなjsonにしましたが詳細に設定をいじれるので公式のリファレンスを参考にユースケースに合わせて調整できます。
2022年の1月15日 15:00を設定する例

公式：https://marketplace.zoom.us/docs/api-reference/introduction

```php
{
	type: 2,	//ミーティングのタイプ(今回はスケジュールされたミーティング、繰り返す予定とかもある)
	start_time: "2022-01-15T15:00:00",	//設定する開催時間(2022-01-15T15:00:00ZにするとタイムゾーンがGMT固定で設定される)
	topic: "作成テスト", //表示されるミーティング名称
	timezone: "Asia/Tokyo", //start_timeの時間を割り当てるタイムゾーン
	password: "password", //参加するときに入力するパスコード
	setting:[
		host_video: true,	//ホストのビデオON
		participant_video: true, //参加者のビデオON
		join_before_host: true, //ホストが来る前に参加可能
		waiting_room: false	//待機室なし
	],
	duration: 60 //単位は分、予定として押さえる時間(カレンダーとか)
}
```

早速PHPでAPIを叩いてスケジュールを作成してみます、以下のような感じでできました。

```php
use \Firebase\JWT\JWT;

$payload = array(
	"iss" => ZOOM_APIKEY,
	"exp" => time() + 30
);

$jwt = JWT::encode($payload, ZOOM_SECRET); //JWTの文字列

$curl = curl_init();

$setteing = [
 "host_video" => true,
 //とか
];

$create_request = [
	"type" => 2,
	"setting" => $setting,
	//とか
];
$post_json = json_encode($create_request);

curl_setopt($curl, CURLOPT_URL, "https://api.zoom.us/v2/users/".$this->user."/meetings");
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
	"Authorization: Bearer ".$jwt
	"Content-type: application/json"
));
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_json );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close($curl);
```

作成できた場合はレスポンスとしてミーティングの詳細がjson形式で得られます。

```php
{
	//抜粋
	"id": 1234567,
	"host_id": "ホストの文字列",
	"topic": "作成テスト",
	"start_time": "2021-12-05T08:37:15Z",
	"start_url": "https://XXXXX",
	"join_url": "https://XXXXX?pwd=YYYYYYY",
	"password": "password",
	"settings": {
		"host_video": true,
		...
	},
}
```

ここから`join_url`と`password`あたりを抜き出せば関係者に共有してミーティングを行うことができます。
また、ミーティング自体を編集するなどでIDが必要になるので`id`を記録しておきましょう。

作成できたミーティングはZOOMにログインすると確認できます。
![cre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314585/89fba156-8b3d-e1af-93c6-15fde8097e0d.png)

<h3>ミーティングを編集する</h3>
作成したスケジュールの編集も上記とほぼ同じです。異なるのは`/meetings/ミーティングのID`にPATCHで送信することです。

```php
//jwtは省略

$setteing = [
 "host_video" => true,
 //とか
];

$create_request = [
	"type" => 2,
	"start_time" => "2022-02-16T16:00:00", // 1/15 PM15の予定を  2/16 PM16にする例
	"setting" => $setting,
	//とか
];

$post_json = json_encode($create_request);
$meeting_id = "ミーティングのID";

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, "https://api.zoom.us/v2/meetings/".$meeting_id);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
  "Authorization: Bearer ".$jwt.";",
  "Content-type: application/json; charset=UTF-8;"
));
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_json );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($curl);

curl_close($curl);

```

成功するとミーティングの予定や設定が変更されます。この時、レスポンスは204のステータスだけが返ります。

ミーティングの日時が変更されているのがわかります。
![edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314585/0c3cf4e9-3aa7-4b5f-2f5d-64af82cf7cb4.png)


<h3>ミーティングを削除する</h3>
削除するのも編集と同様にミーティングのIDを指定してリクエストするだけです。
削除はDELETEになり、特にパラメータなどの設定は必要ありません。

```php
//jwtは省略

$meeting_id = "ミーティングのID";

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.zoom.us/v2/meetings/".$meeting_id);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
	"Authorization: Bearer ".$jwt,
	"Content-type: application/json"
));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

```

無事削除されました。こちらも成功するとステータス204が返ります。
![del.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314585/c8163f82-2d0d-74b9-a16f-8b7fcdfb94a1.png)


<h2>まとめ</h2>
<a href="https://qiita.com/dioh09/items/42bc49d4f9ca74811906">前回</a>と合わせてZOOMのAPIを一通り利用できました。他にもミーティングの一覧を取得したりと色々な機能があるので
ZOOMを利用することになった場合はAPIを叩くようにしてしまうのもよいかもしれません。

<h2>参考文献</h2>
https://marketplace.zoom.us/
https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingcreate
https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingupdate
https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingdelete