zoom APIを使ってLambdaから毎回違うIDで定期的に部屋を作る #zoom

zoom APIをLambdaから叩いてみました。
2020.04.28

せーのでございます。

今回はzoom APIを使って会議用の部屋を作ってみます。

どうして?

現在社内では会議ソリューションとしてGoogle Meetとzoomの2つが使われています。
zoomで定期的に会議を開くには「スケジュール」から部屋を作ればOKです。

ただこの場合、ミーティングIDは自分の個人IDか、独自に振ったID、どちらにしても毎週同じものが使われます。

ミーティングのURLはミーティングIDで一意になるので、毎回同じミーティングIDになる場合、もし社外にこのURLが漏れてしまうと、関係ない人がこっそり入ってこられることになります。

そこで今回は、zoom APIとLambdaを使って、毎回違うIDで定期的に部屋を作ってみたいと思います。

要するに、こういうこと

zoomのスケジュール機能を使うと毎回同じIDで部屋が作られますが

Lambdaから毎週zoomのAPIを叩いてやれば、都度違うIDで部屋が作られる、というわけです。

やってみた

それではやっていきましょう。手順としては

  1. zoomのAppを作る
  2. LambdaからそのAppの設定に従ってzoomのAPIを叩く

と非常にシンプルです。

zoomのAppを作る

最初にzoomのAPIが使えるようにAppを作ります。AppはzoomのMarketPlaceというところにあります。

持っているアカウントでログインしたら「Develop」トグルボタンより「Build App」をクリックします。

作るAppの種類が表示されます。ブラウザから操作するような場合は「OAuth」を選びます。今回はLambdaから毎回自動で作りたいので、都度認証のいらない「JWT」を選びます。「Create」ボタンをクリックします。

アプリの名前をつけます。ここは任意です。

会社情報や担当者のアドレスなどを「Information」のタブで入力します。
入力したら「App Credentials」に移動します。

ここに連携に必要な情報が入っています。今回はサンプルなのでそのままトークンを使います。本番ではAPI KeyとAPI Secretから作ります。
「View JWT Token」のリンクをクリックすると下にトークンが表示されます。「Expire in」はトークンの使用期限ですので、使う期間を指定して、トークンをコピーしてください。

使うAPIのドキュメントを見る

今回は部屋を作りたいので「meeting API」の中の「Creating meeting」というAPIを使います。

このAPIに必要なのはまず「User ID」です。これはzoomにログインするときのメールアドレスのことです。
次にbodyに必要な情報を書いたjsonを送ってあげます。

{
  "topic": "string",
  "type": "integer",
  "start_time": "string [date-time]",
  "duration": "integer",
  "timezone": "string",
  "password": "string",
  "agenda": "string",
  "recurrence": {
    "type": "integer",
    "repeat_interval": "integer",
    "weekly_days": "string",
    "monthly_day": "integer",
    "monthly_week": "integer",
    "monthly_week_day": "integer",
    "end_times": "integer",
    "end_date_time": "string [date-time]"
  },
  "settings": {
    "host_video": "boolean",
    "participant_video": "boolean",
    "cn_meeting": "boolean",
    "in_meeting": "boolean",
    "join_before_host": "boolean",
    "mute_upon_entry": "boolean",
    "watermark": "boolean",
    "use_pmi": "boolean",
    "approval_type": "integer",
    "registration_type": "integer",
    "audio": "string",
    "auto_recording": "string",
    "enforce_login": "boolean",
    "enforce_login_domains": "string",
    "alternative_hosts": "string",
    "global_dial_in_countries": [
      "string"
    ],
    "registrants_email_notification": "boolean"
  }
}

かなり細かいところまで指定できるのですが、今回作る上で必要な情報は

パラメータ名 概要
topic 会議の名前
type 会議のタイプ。即時に作るときは1。時間指定で予約するときは2。
start_tyme 開始時間。YYYY-MM-DD T HH:mm:ss形式で書く
timezone タイムゾーン。日本はAsia/Tokyo
settings/use_pmi PMI(Personal Meeting ID。自分の個人ID)を使うかどうか。falseに設定

これくらいになります。これらの情報を

こんな感じでJSONにまとめて投げてあげればOKです。
それではコードを書いていきましょう。

Lambdaを作る

それではLambdaを書いていきます。特に他のAWSサービスとはつなげませんので、ごくごくシンプルに。

側ができたら、コードを書いていきます。今回はzoom APIを叩くのでモジュールとして「request」を使います。ローカルで任意にディレクトリを作り、そこにnpmを使って「request」をインストールした上で「index.js」というファイルを作成、中身を書いたらzipに固めてアップロード、という手順です。

npm install request

index.js

var request = require("request");

exports.handler = (event, context, callback) => {

var options = {
	method: 'POST',
	url: 'https://api.zoom.us/v2/users/yourmailaddress@aaa.ne.jp/meetings',
	headers: {
		authorization: 'Bearer <ここにJWTのトークンを貼る>' // Do not publish or share your token publicly.
	},
	json: {
    "topic": "Weekly Meeting",
	"type": "2",
	"start_time": "2020-04-27T18:30:00",
	"timezone": "Asia/Tokyo",
	"settings": {
		"use_pmi": "false"
	}
  }
};

request(options, function (error, response, body) {
	if (error) throw new Error(error);

	callback(null,body);
});
};

これでOKです。シンプルですね。メールアドレスやトークンは皆さんのものと置き換えてお使いください。

Lambdaを叩くとこのような結果が返ってきます。

この「id」の値がLambdaを叩くたびに変わります。そして参加者はこのidを使ったURL「join_url」を使ってアクセスするので、この値が毎回変わるとセキュアですね。
「join_url」をミーティングの参加者に通知してあげると、参加することができますので、戻り値をJsonパースしてこのjoin_urlの値を拾ってあげて、Slackなどで通知してあげると良いですね。Slackへの通知はこんな記事がありますので参考になさってください。

SNSでSlackにメッセージ送信する #slack

Slack APIでメッセージにスタンプ(絵文字)を付けて投稿したい

Lambdaを叩いたあとにSlackを開いてみると

このように、部屋が取れている事がわかります。

まとめ

ということで今回はAPIを使ってzoomの部屋を取ってみました。応用すればSlackからのコマンドでzoomの部屋を取ったり、Google Calendarに特定のキーワードを入れると自動的にzoomの部屋を取ってくれたり(Meetでいいじゃん、とか言わない)、色々使い勝手が広がります。
仕事でzoomミーティングを使う時などに参考にしてみてください。

参考リンク