Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9097

zoomのミーティングを作るLINE WORKS Botを作ってみた

$
0
0

LINEWORKS Advent Calendar 2020 / 21日目の記事です。

zoomのミーティングルームを作るLINE WORKS Botを作ってみました。
名前はZoomerです。

0. はじめに

記事の流れは下記の通りです。

  1. こんなの作りました
  2. 環境準備
  3. 作ってみる
  4. 動かしてみる
  5. まとめ

1. こんなの作りました

シンプルではありますが下記の手順で zoomのミーティングURLを取得します。
1. Zoomer Bot とのトークルームを作成する
2. Zoomer Bot に zoomアカウントIDを登録する
3. Zoomer Bot に いつミーティングをするか伝える
4. Zoomer Bot からミーティングURLが返ってくる

2. 環境準備

Zoom API の利用準備

Zoom APIへお試しリクエストを送る方法 (JWT・OAuth)を参考に JWT app を作成しました。
https://marketplace.zoom.us/develop/create
image.png

この状態になります。
API Key と API Secret は、Zoomer Bot で使用します。

LINE WORKS Bot APIの利用準備

LINE WORKS の Developer Console で Zoomer Bot サーバーが LINE WORKS と通信するために必要な接続情報の発行と Zoomer Bot の登録を行います。

↓こちらの記事を参考にしていただければ幸いです。
LINE WORKSで初めてのBot開発!(前編)の「Developer ConsoleでAPIを使うための設定とBotを登録する
※Bot登録の際に指定する Callback URL は、ngrokを利用して取得するとローカルデバッグができるのでとっても便利です。
(記事:ローカル環境で LINEWORKS Bot を動かす話が大変参考になりました)

開発環境

  • VS Code:IDE
  • node.js+Express:Botサーバー
  • dotenv:アプリケーションの環境変数定義
  • ngrok:ローカルデバッグ

node.jsでいろいろpackageを利用してますが省略します。

3. 作ってみる

GitHub の line-works-zoomerで開発しました。詳細は GitHub を参照して下さい。

Zoomと連携する部分を抜粋して紹介します。
ZoomMeetingCreateAction.js は、Zoomer Bot が Zoom のミーティングルームの作成依頼を受け付けるアクションクラスです。作成結果を基にLINE WORKS の Zoomer Bot 利用者に結果メッセージを送信しています。
ZoomMeetingCreator(MeetingCreator)クラスで実際に Zoom API を使用してミーティングルームを作成しています。

ZoomMeetingCreateAction.js
constmoment=require("moment");constBaseAction=require('./BaseAction');constBotMessageSender=require('../lineworks/bot/MessageSender');constZoomMeetingCreator=require('../zoom/MeetingCreator');constSessionRepository=require('../repositories/SessionRepository');/**
 * ZoomMeetingCreateActionクラス
 */module.exports=classZoomMeetingCreateActionextendsBaseAction{/**
   * 初期化します。
   * @param {object} callbackEvent コールバックイベント
   */constructor(callbackEvent){super(callbackEvent);}/**
   * アクションを実行します。
   */asyncexecute(){varpostbackTime=this.callbackEvent.content.postback;constsessionRepos=newSessionRepository();letsession=sessionRepos.get(this.getRoomId());constmeetingCreator=newZoomMeetingCreator();letstartDateTime=null;if(postbackTime){if(session.startDate){startDateTime=moment(`${session.startDate}T${postbackTime}`);}else{startDateTime=moment(`${moment().format('YYYYY-MM-DD')}T${postbackTime}`);}}if(!startDateTime.isValid()){startDateTime=null;}constres=awaitmeetingCreator.create(session.zoomAccountId,startDateTime);console.log(res);letmessage1={content:{type:BotMessageSender.MESSAGE_CONTENT_TYPE.text,text:`Zoomミーティングを${session.zoomAccountId}で登録しました。\nHostのURLはこちら。`,}};this.setMessageTo(message1);letmessage2={content:{type:BotMessageSender.MESSAGE_CONTENT_TYPE.text,text:`${res.start_url}`,}};this.setMessageTo(message2);letmessage3={content:{type:BotMessageSender.MESSAGE_CONTENT_TYPE.text,text:`招待のURLはこちら。`,}};this.setMessageTo(message3);letmessage4={content:{type:BotMessageSender.MESSAGE_CONTENT_TYPE.text,text:`${res.join_url}`,}};this.setMessageTo(message4);constsender=newBotMessageSender();awaitsender.send([message1,message2,message3,message4]);session.startDate=null;session.waitingForZoomAcountIdInput=false;sessionRepos.save(session);}}
MeetingCreator.js
constmoment=require("moment");constPromise=require("promise");constrequest=require("request-promise");constjwt=require('jsonwebtoken');/**
 * MeetingCreatorクラス
 */module.exports=classMeetingCreator{/**
   * Zoomのミーティングを作成し結果を返します。
   * @param {string} zoomAccountId ZoomアカウントID
   * @param {string} startDateTime ミーティング開始日時
   * @return {object} ミーティング作成結果オブジェクト
   */asynccreate(zoomAccountId,startDateTime){letjson={topic:'LINE WORKS ZOOM連携',type:1,time_zone:'Asia/Tokyo',agenda:'LINE WORKS ZOOM連携してみる',settings:{host_video:true,participant_video:true,approval_type:0,audio:'both',enforce_login:false,waiting_room:false,registrants_email_notification:false}};if(startDateTime){json.type=2;json.start_time=startDateTime;}constpayload={iss:process.env.ZOOM_API_KEY,exp:((newDate()).getTime()+5000)};consttoken=jwt.sign(payload,process.env.ZOOM_API_SECRET);constoptions={method:"POST",url:`https://api.zoom.us/v2/users/${zoomAccountId}/meetings`,headers:{"Content-type":"application/json",Authorization:`Bearer ${token}`,},json:json};returnnewPromise((resolve,reject)=>{request(options).then((res)=>{console.log(res);resolve(res);}).catch((error)=>{console.log(`ERROR: ${error}`);reject(error);});});}};

4. 動かしてみる

1) GitHub から line-works-zoomer をクローンする

https://github.com/shotamaco/line-works-zoomer

2) VS Code のターミナルでプログラムが使用している node.js の package をインストール

VsCodeTerminal
npm install

3) 環境変数 (.env)

.env.sample ファイルを .env に変更して、
「Zoom API の利用準備」と「LINE WORKS Bot APIの利用準備」で発行した接続情報を設定する。

.env
API_ID="API ID"
CONSUMER_KEY="Consumer key"
SERVER_ID="Server ID"
PRIVATE_KEY="Server 認証キー"
BOT_NO="Bot 番号"
ZOOM_API_KEY="Zoom API Key"
ZOOM_API_SECRET="API Secret"

4) デバッグボタン(F5)クリック!

vscode.png

5) http 3000 で ngrok 起動!

Terminal
ngrok http 3000

ngrok2.png
※ ForwardingもとのURLが変わった場合は、Developer Console で Botの Callback URL の変更を必ずしてください。

6) スマフォを手に持って LINE WORKS を動かす

5. まとめ

DBを使用していないのでstatic変数で Server Token や Session データを管理しています。。。また例外処理はほとんどしてません。。。あくまでもLINE WORKSとzoomを連携させることを目的にしています。

今回作成たコードは GitHub の line-works-zoomerで公開してま〜す。

Link


Viewing all articles
Browse latest Browse all 9097

Latest Images

Trending Articles