Webex の参加者を Go 言語で取得する

法政大学情報科学部 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 で、お試し取得ができます。

https://developer.webex.com/docs/api/v1/meetings/list-meetings

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 で控えたやつ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1773603/ea390f01-d8b1-cd6f-813d-6e3c09834c28.png)

### 3. 参加者を取得

最後に、参加者を取得します。
以下の webex API reference で、お試し取得ができます。

https://developer.webex.com/docs/api/v1/meeting-participants/list-meeting-participants

2 で取得した meeting ID を入力するだけで実行できます。
これも、curl コマンドで実行するときは、以下のコマンドで 参加者が取得できます。

zzzz → 2で取得した meeting ID 

```
curl -H 'Authorization: Bearer xxxxxxxxxxxxx' https://webexapis.com/v1/meetingParticipants?meetingId=zzzzzzzzzzzz
```

# Go 言語で取得

```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 が取得出来たら、以下のコードで参加者が取得できます。

```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)

	// 新しいリクエストを作成
	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 時間で無効になってしまいます。
自動で取ってくるようにするためには、以下のサイトを参考にして設定します。

https://community.cisco.com/t5/devnet-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/webex-rest-api-sdk%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92postman%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AB%E8%A9%A6%E3%81%99%E6%96%B9%E6%B3%95/ta-p/4100609