はじめに
(有料プランに入れよという話だが、)
Zoomの無料プランでは同じミーティングURLを使い続けることができないため、
URLを新規に自動生成し、Slackに定期的に投げてくれるBotを作った。
20210825 更新
無料プランでもミーティングURLの固定ができるっぽいので、
それをSlackの/remindで定期投稿したほうがいいかも。
固定できるのか確認中。。。
事前準備
- Googleアカウントを用意
- Zoomアカウントを用意(あとでメールアドレスを使用します)
- Slackアカウントを用意
ミーティングURLを発行するために、Zoomのアプリを作成
以下のZoom App Marketplaceで「JWT」を選択し、
指示に従ってアプリを生成したあと、表示されるAPI keyとSecretをメモる。
Slackに通知するためのWebhook URLを取得
Slackに「Incoming Webhook」アプリを追加し、
指示に従ってメッセージを送信するチャネル等を選んだあと、表示されるWebhook URLをメモる。
GASに以下のコードを追加
// SlackにミーティングURLを送信する
const sendZoomUrlToSlack = () => {
const start_url = createMeetingRoom()
const options = {
method: 'POST',
contentType: 'application/json',
payload: JSON.stringify({text: `ミーティングはこちら:\n<${start_url}>`}),
}
// 上で取得したWebhook URLを記載する
const response = UrlFetchApp.fetch('https://hooks.slack.com/services/.......Webhook URLが入る', options).getContentText()
console.log(response)
}
// ZoomのミーティングURLを生成する
const createMeetingRoom = () => {
const JwtToken = generateJwtToken()
const options = {
method: 'POST',
contentType: 'application/json',
headers: {Authorization: `Bearer ${JwtToken}`},
payload: JSON.stringify(Settings),
}
// 上で用意したZoomアカウントのメールアドレスを記載する
const response = UrlFetchApp.fetch('https://api.zoom.us/v2/users/Zoomアカウントのメールアドレスが入る/meetings', options).getContentText()
const meetingInfo = JSON.parse(response)
return meetingInfo.start_url
}
// ZoomアプリにリクエストするためのJwtTokenを生成
const generateJwtToken = () => {
const ZOOM_API_KEY = 'ZoomのAPI keyが入る'
const ZOOM_API_SECRET = 'ZoomのSecretが入る'
const header = {alg: 'HS256', typ: 'JWT'}
const payload = {iss: ZOOM_API_KEY, exp: Date.now() + 1800}
const jsonHeader = JSON.stringify(header)
const encodedHeader = Utilities.base64Encode(jsonHeader)
const jsonPayload = JSON.stringify(payload)
const encodedPayload = Utilities.base64Encode(jsonPayload)
const signatureHMAC = Utilities.computeHmacSha256Signature(`${encodedHeader}.${encodedPayload}`, ZOOM_API_SECRET)
const encodedSignature = Utilities.base64Encode(signatureHMAC)
return `${encodedHeader}.${encodedPayload}.${encodedSignature}`
}
// Zoomミーティングの設定を記載
// 詳細は、https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingcreate
const Settings = {
"type": "2",
"timezone": "Asia/Tokyo",
"settings": {
"join_before_host": "true",
"mute_upon_entry": "false",
}
}
GASのトリガーを設定する
sendZoomUrlToSlack関数を定期実行するようにスケジュールを設定する。
おわりに
はじめてGASを使ったが、めちゃめちゃ便利だと思った。
JWT Tokenについても学べたので楽しかった。