法政大学情報科学部 2 年の阿部哲也です。
今回は Webex の参加者を取得するスクリプトを組みました。
やること
出席管理を自動化させたいため、webex の参加者を自動で取得するスクリプトを Go 言語で作成します。
流れとしては、mattermost からリクエストが投げられたタイミングで、作成したプログラムがリクエストを投げます。
帰ってきたレスポンスを参考にスプレットシートに反映させるという流れです。(下記参照)
今回は GO 言語で API を取得するところまで書きます。
mattermost → golang → webex API → Googleスプレットシート
本当は Zoom でやりたかったのですが、Zoom API が有料アカウントではないとできない & 法政大学のアカウントは有料アカウントだが API が取得できない設定になっていたため、断念して Webex にしました。
webex API で情報を取得
大まかな流れは下記みたいな感じです。今回は現在 meeting に参加している参加者をリアルタイムで取得します。
1. meeting 番号を取得
2. https://developer.webex.com/docs/api/v1/meetings/list-meetings で meeting ID 取得
3. https://developer.webex.com/docs/api/v1/meeting-participants/list-meeting-participants で参加者を取得
1. meeting 番号を取得する。
meeting 番号は meeting を開始したらす ぐに調べることができます。
上のタブから、[ミーティング] > [情報] > [ミーティング番号] に記載してある、9 桁の数字です。
2. meeting ID を取得する。
meeting 番号から、meeting ID を取得しないと参加者を取得できない(と思う)ので、取得します。
以下の webex API reference で、お試し取得ができます。
log in したのち、meeting number を入力して run するとレスポンスの meeting ID が取得できます。
curl コマンドで実行するときは、以下のコマンドで meeting ID が取得できます。
curl -H 'Authorization: Bearer xxxxxxxxxxxxx' https://webexapis.com/v1/meetings?meetingNumber=yyyyyyyyyyyyy
xxxx → 画像のAuthorization
yyyy → 画像のmeeting number (これは 1 で控えたやつ)
3. 参加者を取得
最後に、参加者を取得します。
以下の webex API reference で、お試し取得ができます。
2 で取得した meeting ID を入力するだけで実行できます。
これも、curl コマンドで実行するときは、以下のコマンドで 参加者が取得できます。
zzzz → 2で取得した meeting ID
curl -H 'Authorization: Bearer xxxxxxxxxxxxx' https://webexapis.com/v1/meetingParticipants?meetingId=zzzzzzzzzzzz
Go 言語で取得
package main
import (
"fmt"
"net/http"
"io/ioutil"
"encoding/json"
)
var auth = "xxxxxxxxxx"
var meetingnumber = "yyyyyyyyy"
func main() {
// リクエストを作成
req, err := http.NewRequest("GET", "https://webexapis.com/v1/meetings?meetingNumber=" + meetingnumber, nil)
if err != nil {
fmt.Println(err)
}
// ヘッダーを追加
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer " + auth)
// リクエストを送信
res, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err)
}
// レスポンスを確認
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
}
var bodyMap map[string]interface{}
json.Unmarshal(body, &bodyMap)
meetingID := bodyMap["items"].([]interface{})[0].(map[string]interface{})["id"].(string)
if err != nil {
fmt.Println(err)
}
fmt.Println("meeting ID: ", meetingID)
}
出力結果
meeting ID: zzzzzzzzzzzzzzzzzz
このように、Authorization と meeting number を入力するだけで、簡単に ID が取得できます。
ID が取得出来たら、以下のコードで参加者が取得できます。
package main
import (
"fmt"
"net/http"
"io/ioutil"
"encoding/json"
)
var auth = "xxxxxxxxxx"
var meetingnumber = "yyyyyyyyy"
func main() {
// リクエストを作成
req, err := http.NewRequest("GET", "https://webexapis.com/v1/meetings?meetingNumber=" + meetingnumber, nil)
if err != nil {
fmt.Println(err)
}
// ヘッダーを追加
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer " + auth)
// リクエストを送信
res, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err)
}
// レスポンスを確認
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
}
var bodyMap map[string]interface{}
json.Unmarshal(body, &bodyMap)
meetingID := bodyMap["items"].([]interface{})[0].(map[string]interface{})["id"].(string)
if err != nil {
fmt.Println(err)
}
//fmt.Println("meeting ID: ", meetingID)
// 新しいリクエストを作成
req2, err2 := http.NewRequest("GET", "https://webexapis.com/v1/meetingParticipants?meetingId=" + meetingID, nil)
if err2 != nil {
fmt.Println(err)
}
// リクエストにヘッダーを付与
req2.Header.Add("Content-Type", "application/json")
req2.Header.Add("Authorization", "Bearer " + auth)
// リクエストを送信
res2, err := http.DefaultClient.Do(req2)
if err != nil {
fmt.Println(err)
}
// レスポンスを確認
body2, err := ioutil.ReadAll(res2.Body)
if err != nil {
fmt.Println(err)
}
json.Unmarshal(body2, &bodyMap)
for i:=0; i<len(bodyMap["items"].([]interface{})); i++ {
fmt.Println(bodyMap["items"].([]interface{})[i].(map[string]interface{})["email"])
}
fmt.Println(string(body2))
出力結果
aaaaaaa@aaa.ac.jp
bbbbbbb@bbb.ac.jp
cccccc@ccc.ac.jp
…
簡単に取得できた!
postman を導入して oauth で API の認証をする
このままでは、Authorization のがセキュリティの問題で 24 時間で無効になってしまいます。
自動で取ってくるようにするためには、以下のサイトを参考にして設定します。