4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GASでZoomのURLを生成し、定期的にSlackに投げる

Last updated at Posted at 2021-08-24

はじめに

(有料プランに入れよという話だが、)
Zoomの無料プランでは同じミーティングURLを使い続けることができないため、
URLを新規に自動生成し、Slackに定期的に投げてくれるBotを作った。

20210825 更新

無料プランでもミーティングURLの固定ができるっぽいので、
それをSlackの/remindで定期投稿したほうがいいかも。
固定できるのか確認中。。。

事前準備

  • Googleアカウントを用意
  • Zoomアカウントを用意(あとでメールアドレスを使用します)
  • Slackアカウントを用意

ミーティングURLを発行するために、Zoomのアプリを作成

以下のZoom App Marketplaceで「JWT」を選択し、
指示に従ってアプリを生成したあと、表示されるAPI keySecretをメモる。

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についても学べたので楽しかった。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?