【Zoom API】クラウド録画をPHP curlでダウンロードする(Postman併用)

# 環境
PHP 8.0

# 準備
### 1. JWTトークン発行
[Zoomマーケットプレイス](https://marketplace.zoom.us/)でJWTトークンを発行してください。
私が参考にさせていただいた記事は[こちら](https://qiita.com/yosuke-sawamura/items/d8ec07ac8b7b0335a22b)です。

定期的に動かす場合は、プログラム側でJWTトークン生成した方が良いです。当初、生成する方針で進めていましたが、エラー解消できず、今回はZoomマーケットプレイスから発行しました。
参考: [https://qiita.com/gentuki/items/d64f15447cb556eafd3b](https://qiita.com/gentuki/items/d64f15447cb556eafd3b)

### 2. ZoomユーザーIDを取得
postmanを使用してユーザーIDを確認しました。postmanの使用方法については省略します。
[ZoomAPIテンプレート](https://www.postman.com/gold-space-34990/workspace/zoom-api-jwt/documentation/14876266-e9417679-c710-44e1-8d40-c29a0eb8fbd0)が使用できて便利です。
>(postmanにて)
>テンプレートのZoom Meeting API / users / List users を叩く
>Authorization設定(一括設定推奨)
>　Type: Bearer Token
>　Token: 準備1で発行したJTWトークン
>params
>　status: active
>　page_size: 30

参考:[https://marketplace.zoom.us/docs/api-reference/zoom-api/methods/#operation/users](https://marketplace.zoom.us/docs/api-reference/zoom-api/methods/#operation/users)

レスポンスの`users.id`を確認します。
```php:Postmanのレスポンス例
{
    "page_count": 1,
    "page_number": 1,
    "page_size": 30,
    "total_records": 1,
    "next_page_token": "",
    "users": [
        {
            "id": **********,
            "first_name": "****",
            "last_name": "****",
            "email": "****@****.com",
            "type": 2,
            "pmi": '**********',
            "timezone": "Asia/Tokyo",
            "verified": 1,
            "dept": "",
            "created_at": "20**-**-**T**:**:**Z",
            "last_login_time": "20**-**-**T**:**:**Z",
            "last_client_version": "＊＊＊＊＊＊＊",
            "pic_url": "https://us02web.zoom.us/p/*********",
            "language": "jp-JP",
            "phone_number": "",
            "status": "active",
            "role_id": "1"
        },
	]
}
```

### 3. クラウド録画情報を取得
録画情報をまとめて取得します。
>(postmanにて)
>テンプレートのZoom Meeting API / users / List All Recordings を叩く
>Authorization設定 
>　上述
>params
>　page_size: 300
>　mc: false
>　trash: false
>　from: yyyy-mm-dd（期間を指定）
>　to: yyyy-mm-dd（期間を指定）
>Path Variables
>　userId: 準備2で取得したユーザーID

参考:[https://marketplace.zoom.us/docs/api-reference/zoom-api/methods/#operation/recordingsList](https://marketplace.zoom.us/docs/api-reference/zoom-api/methods/#operation/recordingsList)

:::note warn
注意
期間の指定は最大1ヶ月です。
1ヶ月を超える期間を指定した場合、API側で1ヶ月になるよう自動修正した値が返されます。
:::

```php:Postmanのレスポンス例
//期間中の録画1件の場合
{
    "from": "2022-0５-01",
    "to": "2022-05-31",
    "page_count": 1,
    "page_size": 300,
    "total_records": 1,
    "next_page_token": "",
    "meetings": [
        {
            "uuid": "**********",
            "id": :"**********",
            "account_id": "**********",
            "host_id": "**********",
            "topic": "定例ミーティング",
            "type": 2,
            "start_time": "2022-05-30T11:23:51Z",
            "timezone": "Asia/Tokyo",
            "duration": 51,
            "total_size": 646961300,
            "recording_count": 2,
            "share_url": "https://us02web.zoom.us/rec/share/**********",
            "recording_files": [
                {
                    "id": "**********",
                    "meeting_id": "**********",
                    "recording_start": "2022-05-30T11:23:52Z",
                    "recording_end": "2022-05-30T12:24:24Z",
                    "file_type": "M4A",
                    "file_extension": "M4A",
                    "file_size": 49534472,
                    "play_url": "https://us02web.zoom.us/rec/play/**********",
                    "download_url": "https://us02web.zoom.us/rec/download/**********",
                    "status": "completed",
                    "recording_type": "audio_only"
                },
                {
                    "id": "**********",
                    "meeting_id": "**********",
                    "recording_start": "2022-05-30T11:23:52Z",
                    "recording_end": "2022-05-30T12:24:24Z",
                    "file_type": "MP4",
                    "file_extension": "MP4",
                    "file_size": 597426828,
                    "play_url": "https://us02web.zoom.us/rec/play/**********",
                    "download_url": "https://us02web.zoom.us/rec/download/**********",
                    "status": "completed",
                    "recording_type": "shared_screen_with_speaker_view"
                }
            ]
        }
	]
}
```


# ダウンロード
準備3で取得した情報のなかに、**download_url**が2個確認できますね。

上記の例ですと、1件のミーティングに対して、recording_typeが2種類あり
- audio_only
- shared_screen_with_speaker_view

それぞれのdownload_urlが発行されている状況です。
recording_typeの種類は[こちら](https://marketplace.zoom.us/docs/api-reference/zoom-api/methods/#operation/recordingGet)

このURLにトークン付与して`download_url + ?access_token= + JWT token`のようにブラウザで叩けば、ローカルにダウンロードすることが可能です。保存先は選択できず、自動で(macだとダウンロードフォルダに)ダウンロードされます。

保存先やファイル名を指定するためには、curlで取得します。
```php:sample.php
$download_url = 'download_urlを記入';
$JWT_token = 'JWT tokenを記入';
$url =  $download_url . '?access_token=' . $JWT_token;
$dir_path = '保存先を指定';
$file_name = '拡張子を含むファイル名を指定';

exec("curl -L '" . $url  . "' -o '" . $dir_path . '/' . $file_name . "'");
```

これで指定のフォルダに録画データを保存することができました！
実際には、取得した情報からフォルダやファイル名の指定をしたいですよね。

それについては[次の記事](https://qiita.com/KeiOTN/items/f9a858b1e0ae12c6c61e)で書いていきます。