PowerShellでZoomクラウド録画の一覧取得と自動削除を簡単に実現する方法

Zoomのクラウドレコーディング機能は、オンライン会議やセミナーの記録を保存するのに便利ですが、容量制限や保存ポリシーに基づいて定期的に整理する必要があります。手動で整理するのは手間がかかるため、PowerShellを利用した自動化が効果的です。本記事では、Zoomのクラウドレコーディングを一覧で取得し、規定日数を過ぎたデータを自動で削除するPowerShellスクリプトの作成と実行方法を詳しく解説します。この手法を活用することで、手動操作の負担を軽減し、効率的にストレージを管理できます。

必要な環境と前提条件


ZoomのクラウドレコーディングをPowerShellで管理するには、いくつかの環境設定と事前準備が必要です。以下で、必要な要件と準備手順を説明します。

PowerShell環境の準備

  • PowerShellバージョン:PowerShell 7.0以降を推奨します。最新バージョンは公式サイトからインストールしてください。
  • モジュールのインストール:以下のモジュールが必要です。
  • PSWriteHTML(ログ出力用、必要に応じて)
  • Microsoft.PowerShell.SecretManagement(認証情報管理用)
  • Invoke-RestMethodコマンドレット(デフォルトで使用可能)

Zoom APIの事前準備


ZoomのAPIを利用するために、以下の準備を行います。

Zoom APIキーとシークレットの取得

  1. ZoomのApp Marketplaceにアクセスします。
  2. 自分のZoomアカウントでログインします。
  3. 「Develop」→「Build App」から新しいアプリを作成します。
  4. 「JWT」または「OAuth App」を選択して作成を進め、APIキーとシークレットを取得します。

Zoom APIのスコープ設定

  1. クラウドレコーディング管理には、以下のスコープが必要です:
  • recording:read
  • recording:write
  1. アプリ作成時にこれらのスコープを設定します。

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アカウントにログイン

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トークンの使用
    トークンはリクエストヘッダーのAuthorizationBearer形式で渡します。
  • ユーザー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:readrecording: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クラウドレコーディングの整理・管理を効率化してください。

コメント

コメントする