Zoomのクラウドレコーディング機能は、オンライン会議やセミナーの記録を保存するのに便利ですが、容量制限や保存ポリシーに基づいて定期的に整理する必要があります。手動で整理するのは手間がかかるため、PowerShellを利用した自動化が効果的です。本記事では、Zoomのクラウドレコーディングを一覧で取得し、規定日数を過ぎたデータを自動で削除するPowerShellスクリプトの作成と実行方法を詳しく解説します。この手法を活用することで、手動操作の負担を軽減し、効率的にストレージを管理できます。
必要な環境と前提条件
ZoomのクラウドレコーディングをPowerShellで管理するには、いくつかの環境設定と事前準備が必要です。以下で、必要な要件と準備手順を説明します。
PowerShell環境の準備
- PowerShellバージョン:PowerShell 7.0以降を推奨します。最新バージョンは公式サイトからインストールしてください。
- モジュールのインストール:以下のモジュールが必要です。
PSWriteHTML
(ログ出力用、必要に応じて)Microsoft.PowerShell.SecretManagement
(認証情報管理用)Invoke-RestMethod
コマンドレット(デフォルトで使用可能)
Zoom APIの事前準備
ZoomのAPIを利用するために、以下の準備を行います。
Zoom APIキーとシークレットの取得
- ZoomのApp Marketplaceにアクセスします。
- 自分のZoomアカウントでログインします。
- 「Develop」→「Build App」から新しいアプリを作成します。
- 「JWT」または「OAuth App」を選択して作成を進め、APIキーとシークレットを取得します。
Zoom APIのスコープ設定
- クラウドレコーディング管理には、以下のスコープが必要です:
recording:read
recording:write
- アプリ作成時にこれらのスコープを設定します。
APIアクセスのテスト
取得したAPIキーとシークレットを使ってZoom APIのテストを行います。以下はPowerShellでの簡易テスト例です。
$baseUrl = "https://api.zoom.us/v2"
$apiKey = "あなたのAPIキー"
$apiSecret = "あなたのAPIシークレット"
# JWTトークン生成
$jwtToken = [System.Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("$apiKey:$apiSecret"))
# テストリクエスト
$response = Invoke-RestMethod -Uri "$baseUrl/users/me" -Headers @{ Authorization = "Bearer $jwtToken" }
$response
ネットワークの要件
- Zoom APIへのアクセスが許可されるよう、ファイアウォールやネットワーク設定を確認してください。
- 通信先URL:
https://api.zoom.us/
これらの準備が完了したら、次のステップに進み、クラウドレコーディングの一覧取得スクリプトを構築します。
Zoom APIの利用設定
Zoom APIを活用するためには、APIキーとシークレットを取得し、認証を設定する必要があります。以下では、Zoom APIの利用設定手順を詳細に説明します。
APIキーとシークレットの取得方法
ZoomのAPIキーとシークレットを取得する手順は次の通りです。
1. Zoomアカウントにログイン
- Zoom App Marketplaceにアクセスし、自分のアカウントでログインします。
2. アプリの作成
- メニューから「Develop」→「Build App」を選択します。
- 「JWT」または「OAuth App」のいずれかを選択します。簡易な利用であれば「JWT」を選択してください。
3. アプリの情報を入力
- アプリ名や開発者情報を入力します。
- 必須フィールドをすべて埋め、アプリ作成を完了します。
4. APIキーとシークレットの確認
- アプリ作成後、APIキーとAPIシークレットが表示されます。
- これらをコピーし、PowerShellスクリプト内で使用する準備を行います。
Zoom APIトークンの生成
Zoom APIを使用するには、JWTトークンを生成する必要があります。このトークンは認証情報として使用されます。以下はPowerShellを用いたトークン生成の例です。
# APIキーとシークレットを入力
$apiKey = "取得したAPIキー"
$apiSecret = "取得したAPIシークレット"
# トークンのペイロードと生成
$payload = @{
iss = $apiKey
exp = [math]::Round((Get-Date).AddMinutes(60).ToUniversalTime() - [datetime]'1970-01-01T00:00:00Z').TotalSeconds
}
$header = @{ alg = "HS256"; typ = "JWT" }
$jwtToken = $payload | ConvertTo-Json | Out-String | % { $_.Trim() } | Write-JWT -Header $header -Secret $apiSecret
$jwtToken
APIエンドポイントの確認
Zoom APIには複数のエンドポイントがあります。本記事で使用するクラウドレコーディング関連のエンドポイントは以下の通りです:
- クラウドレコーディングの一覧取得:
GET /users/{userId}/recordings
- クラウドレコーディングの削除:
DELETE /meetings/{meetingId}/recordings
これらのエンドポイントを用いてデータを操作します。
認証情報のセキュリティ対策
APIキーやシークレットの漏洩を防ぐため、以下の対策を講じてください。
- PowerShellの
Microsoft.PowerShell.SecretManagement
モジュールを使用して安全に保存する。 - スクリプトに直接キーを記載せず、外部ファイルや環境変数から読み込む。
次のセクションでは、クラウドレコーディングの一覧を取得するPowerShellスクリプトの作成方法を解説します。
クラウドレコーディングの一覧取得スクリプト
Zoom APIを利用してクラウドレコーディングの一覧を取得するPowerShellスクリプトの作成方法を解説します。このスクリプトを活用することで、ユーザーアカウントに紐づくクラウドレコーディングの情報を効率的に収集できます。
APIエンドポイントとリクエスト構造
クラウドレコーディングの一覧を取得するためのZoom APIエンドポイントは以下の通りです:
- エンドポイント:
https://api.zoom.us/v2/users/{userId}/recordings
- HTTPメソッド:GET
- 必要なスコープ:
recording:read
APIリクエストには、認証トークンと対象ユーザーID(me
を指定すると自身のアカウントを指定可能)が必要です。
PowerShellスクリプトの実装
以下に、Zoomクラウドレコーディングの一覧を取得するPowerShellスクリプトを示します。
# 必要な変数を定義
$baseUrl = "https://api.zoom.us/v2"
$userId = "me" # "me"は自身のユーザーアカウントを指定する
$jwtToken = "取得したJWTトークン" # a3で説明したトークンを使用
# クラウドレコーディング一覧を取得する関数
function Get-ZoomRecordings {
param (
[string]$UserId,
[string]$Token,
[string]$BaseUrl = "https://api.zoom.us/v2"
)
# APIエンドポイントを構築
$url = "$BaseUrl/users/$UserId/recordings"
# APIリクエストを実行
$response = Invoke-RestMethod -Uri $url -Headers @{
Authorization = "Bearer $Token"
}
return $response
}
# 実行
$recordings = Get-ZoomRecordings -UserId $userId -Token $jwtToken
# レコーディング一覧を表示
$recordings.meetings | ForEach-Object {
Write-Host "Meeting Topic: $_.topic"
Write-Host "Meeting ID: $_.id"
Write-Host "Recording Start: $_.start_time"
Write-Host "Recording Size: $_.total_size MB"
Write-Host "-------------------------------"
}
スクリプトの解説
- JWTトークンの使用
トークンはリクエストヘッダーのAuthorization
にBearer
形式で渡します。 - ユーザーIDの指定
me
を指定すると現在のアカウントに紐づくデータが取得できます。他のユーザーのデータを取得するには、該当ユーザーのIDを指定してください。 - レスポンスの処理
レスポンスはJSON形式で返されるため、Invoke-RestMethod
を使用して自動的にオブジェクトとして処理します。
レスポンス例
以下は、Zoom APIから取得できるレスポンスデータの一例です:
{
"meetings": [
{
"id": "123456789",
"topic": "プロジェクト会議",
"start_time": "2025-01-20T10:00:00Z",
"total_size": 500
},
{
"id": "987654321",
"topic": "顧客プレゼンテーション",
"start_time": "2025-01-21T14:00:00Z",
"total_size": 300
}
]
}
スクリプト実行時の確認ポイント
- 認証トークンの有効性
トークンが期限切れの場合、エラーが発生します。再生成が必要です。 - APIスコープの設定
Zoomアプリに必要なスコープ(recording:read
)が設定されていることを確認してください。
次のセクションでは、取得したレコーディングデータから規定日数を過ぎたデータを選別する方法を解説します。
保存期限を過ぎたレコーディングの選別
クラウドレコーディング一覧を取得した後、規定日数を過ぎたレコーディングを特定するロジックを構築します。この処理は、自動削除の前段階として重要です。
レコーディングデータのフィルタリング方法
取得したレコーディングデータには、録画開始日時(start_time
)が含まれています。このデータを基に、指定した保存期間を過ぎたレコーディングを選別します。
PowerShellスクリプトの実装
以下は、規定日数を過ぎたレコーディングを選別するスクリプトの例です。
# 保存期間の設定(例: 30日)
$saveDays = 30
# 現在の日付を取得
$currentDate = Get-Date
# 保存期限を過ぎたレコーディングを選別する関数
function Get-ExpiredRecordings {
param (
[array]$Recordings, # 取得したレコーディングデータ
[datetime]$CurrentDate,
[int]$SaveDays
)
# 保存期限を計算
$expirationDate = $CurrentDate.AddDays(-$SaveDays)
# 保存期限を過ぎたデータを選別
$expiredRecordings = $Recordings | Where-Object {
([datetime]$_.start_time) -lt $expirationDate
}
return $expiredRecordings
}
# レコーディングデータを渡して関数を実行
$expiredRecordings = Get-ExpiredRecordings -Recordings $recordings.meetings -CurrentDate $currentDate -SaveDays $saveDays
# 結果を表示
if ($expiredRecordings.Count -gt 0) {
Write-Host "保存期限を過ぎたレコーディングが以下の通り見つかりました:"
$expiredRecordings | ForEach-Object {
Write-Host "Meeting Topic: $_.topic"
Write-Host "Meeting ID: $_.id"
Write-Host "Recording Start: $_.start_time"
Write-Host "-------------------------------"
}
} else {
Write-Host "保存期限を過ぎたレコーディングはありません。"
}
スクリプトの解説
- 保存期限の計算
$currentDate.AddDays(-$saveDays)
を使って保存期限の日付を計算します。過去のデータを選別する際の基準となります。 - 条件フィルタリング
Where-Object
を使用して、start_time
が保存期限よりも前の日付であるデータを選別します。
レスポンス例の適用
以下は選別前のデータ例です:
[
{
"id": "123456789",
"topic": "プロジェクト会議",
"start_time": "2025-01-10T10:00:00Z"
},
{
"id": "987654321",
"topic": "顧客プレゼンテーション",
"start_time": "2025-01-26T14:00:00Z"
}
]
保存期限を30日に設定すると、「プロジェクト会議」のレコーディングが選別されます。
選別結果の出力例
保存期限を過ぎたレコーディングが以下の通り見つかりました:
Meeting Topic: プロジェクト会議
Meeting ID: 123456789
Recording Start: 2025-01-10T10:00:00Z
-------------------------------
実行時の注意点
- 時刻のタイムゾーン
APIから取得する日時は通常UTC形式です。システム時刻と一致しない場合、タイムゾーンの考慮が必要です。 - データ数が多い場合
取得したレコーディングデータが多い場合は、スクリプトのパフォーマンスを考慮して適切に設計してください。
次のセクションでは、選別されたデータを削除するスクリプトの実装方法を解説します。
自動削除スクリプトの実装
保存期限を過ぎたクラウドレコーディングを削除するPowerShellスクリプトを作成します。このスクリプトを使うことで、Zoomストレージを効率的に管理できます。
APIエンドポイントとリクエスト構造
クラウドレコーディングを削除するためのZoom APIエンドポイントは以下の通りです:
- エンドポイント:
https://api.zoom.us/v2/meetings/{meetingId}/recordings
- HTTPメソッド:DELETE
- 必要なスコープ:
recording:write
Zoom APIでは、ミーティングID(meetingId
)を指定して関連するレコーディングを削除します。
PowerShellスクリプトの実装
以下に、保存期限を過ぎたレコーディングを削除するスクリプト例を示します。
# クラウドレコーディング削除関数
function Remove-ZoomRecording {
param (
[string]$MeetingId, # 削除対象のミーティングID
[string]$Token, # 認証トークン
[string]$BaseUrl = "https://api.zoom.us/v2" # APIのベースURL
)
# APIエンドポイントを構築
$url = "$BaseUrl/meetings/$MeetingId/recordings"
# 削除リクエストを実行
try {
Invoke-RestMethod -Uri $url -Method DELETE -Headers @{
Authorization = "Bearer $Token"
}
Write-Host "Meeting ID $MeetingId のレコーディングを削除しました。" -ForegroundColor Green
} catch {
Write-Host "Meeting ID $MeetingId の削除に失敗しました。" -ForegroundColor Red
Write-Host $_.Exception.Message
}
}
# 保存期限を過ぎたレコーディングを削除
if ($expiredRecordings.Count -gt 0) {
$expiredRecordings | ForEach-Object {
Remove-ZoomRecording -MeetingId $_.id -Token $jwtToken
}
} else {
Write-Host "削除対象のレコーディングはありません。" -ForegroundColor Yellow
}
スクリプトの解説
- 削除対象の指定
レコーディングの削除にはmeetingId
が必要です。保存期限を過ぎたレコーディングからid
を取り出し、削除関数に渡します。 - DELETEメソッドの使用
Zoom APIではDELETE
メソッドを使用してレコーディングを削除します。認証トークンをリクエストヘッダーに含める必要があります。 - エラーハンドリング
APIリクエストが失敗した場合に備えて、エラーハンドリングを実装しています。削除失敗時にはエラーメッセージを出力します。
実行結果の例
以下はスクリプト実行時の出力例です:
Meeting ID 123456789 のレコーディングを削除しました。
Meeting ID 987654321 のレコーディングを削除しました。
削除に失敗した場合:
Meeting ID 123456789 の削除に失敗しました。
The recording does not exist.
実行時の注意点
- 削除操作の確認
レコーディングを削除すると、元に戻すことはできません。削除対象を十分確認してください。 - APIのレート制限
Zoom APIにはリクエスト数の制限があります。大量の削除操作を行う場合は注意してください。 - スクリプトの定期実行
タスクスケジューラやPowerShellのスケジューリング機能を使うことで、自動化をさらに効率化できます。
次のセクションでは、スクリプトの実行時に注意すべき点やよくあるエラーの対処法を解説します。
スクリプト実行時の注意点とエラー対処法
PowerShellスクリプトを実行する際には、事前に考慮すべきポイントや、よく発生するエラーの対処方法を理解しておくことが重要です。このセクションでは、実行時の注意点とトラブルシューティングについて解説します。
スクリプト実行時の注意点
認証トークンの有効期限
- JWTトークンには有効期限があります。有効期限が切れるとリクエストが失敗するため、トークンを定期的に再生成する必要があります。
- トークンの有効期限を長く設定しすぎると、セキュリティリスクが高まるため注意してください。
削除操作の取り扱い
- 削除操作は取り消すことができないため、スクリプト実行前に削除対象を十分確認してください。
- 削除対象を一覧としてログに保存するなどの措置を取ると、安全性が向上します。
スクリプトの実行環境
- スクリプトは適切な権限を持つ環境で実行する必要があります。
- ネットワーク環境がZoom APIにアクセス可能であることを確認してください(ファイアウォールやプロキシの設定を確認)。
よくあるエラーとその対処法
認証エラー
エラー内容: 401 Unauthorized
原因: JWTトークンが無効または期限切れである可能性があります。
対処法:
- 新しいトークンを生成して再試行してください。
- トークンのスコープ(
recording:read
やrecording:write
)が正しいか確認してください。
データ取得エラー
エラー内容: 404 Not Found
原因: 指定したユーザーIDやミーティングIDが存在しない可能性があります。
対処法:
- 正しいユーザーIDやミーティングIDを指定しているか確認してください。
- ミーティングやレコーディングが既に削除されていないか確認してください。
レート制限エラー
エラー内容: 429 Too Many Requests
原因: 短時間に大量のリクエストを送信したため、Zoom APIのレート制限に引っかかっています。
対処法:
- リクエスト間隔を調整してください(1秒に1リクエスト以下が推奨されます)。
- 必要に応じてリクエストをバッチ処理で分割してください。
ネットワークエラー
エラー内容: 503 Service Unavailable
原因: Zoom APIのサーバーに一時的な障害が発生している可能性があります。
対処法:
- 数分待って再試行してください。
- サーバーステータスを確認し、メンテナンス中でないか確認してください。
ログ記録の推奨
スクリプト実行中の操作ログを記録することで、問題発生時の原因追跡が容易になります。以下はログを記録する例です。
$logFile = "ZoomScriptLog.txt"
function Write-Log {
param ([string]$Message)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logMessage = "[$timestamp] $Message"
Add-Content -Path $logFile -Value $logMessage
Write-Host $logMessage
}
スクリプトの自動化
タスクスケジューラやPowerShellスケジューリングを活用して、スクリプトを定期的に実行することで効率的にクラウドレコーディングを管理できます。
次のセクションでは、記事全体を振り返り、スクリプト活用の利点をまとめます。
まとめ
本記事では、PowerShellを使用してZoomクラウドレコーディングを効率的に管理する方法を解説しました。クラウドレコーディングの一覧取得から保存期限を過ぎたデータの選別、そして自動削除スクリプトの作成と実行方法まで、具体的な手順を示しました。
これにより、Zoomストレージの容量を効率的に管理し、定期的な手動作業を自動化できます。また、ログ記録やエラーハンドリングを取り入れることで、実行の安全性と信頼性を向上させることも可能です。
今回のスクリプトは定期的な運用やスケジューリングにも対応しており、管理業務の負担を軽減する強力なツールとなります。ぜひこの記事を参考に、Zoomクラウドレコーディングの整理・管理を効率化してください。
コメント