Janus gatewayのAdmin APIを使ってみる

# 概要
Janus gatewayというWebRTCメディアサーバーについての記事は多数ありますが、
用意されているAPIの使い方については公式以外ほとんどありません。
調べるのに苦労しましたので、ここにまとめておきたいと思います。

# 参考になるサイト
- [公式サイト](https://janus.conf.meetecho.com/docs/admin.html)

# APIの種類
Janusで用意されているAPIには大きく分けると二つの種類があります。

- **Admin API**

Janusを管理、モニターするためのAPIです。
この記事にて使ってみます。

- **プラグイン API**

Janusにはビデオ通話やストリーミング、SIP関連などの多数のプラグインが用意されています。
そのプラグインを操作するためのAPIです。
次回記事にて使ってみるつもりです。


# Websocketを介してAdmin APIを使ってみる
## Janusのコンフィグを設定する
Admin APIを呼び出す際に使うパスワードを設定します。

```/usr/local/etc/janus/janus.cfg
[general]
admin_secret = password
```

　
Websocketを介して使えるように設定します。
今回はwsの設定していますが、暗号化が必要な場合はwssの設定および証明書の準備をしましょう。
また、ここで指定したポートはFW等でブロックされないようにしておきます。

```/usr/local/etc/janus/janus.transport.websockets.cfg
[admin]
admin_ws = yes
admin_ws_port = 7188
```

## Pythonでコードを書く
Pythonのバージョンは2.7です。
今回はJanusにアクセスしてきたユーザの情報をモニターしてみます。

まずは、アクセスしているセッションのリストを取得します。

```python:
import websocket
import json
import random
import string

# Janusのエンドポイント
janus_admin_url = 'ws://10.0.0.1:7188/janus'

# 管理用パスワード
janus_admin_secret = 'password'

# ランダム文字生成
def random_string(length, seq=string.digits):
    sr = random.SystemRandom()
    return ''.join([sr.choice(seq) for i in range(length)])

# 8文字のランダム文字
transaction = random_string(8)

# list_sessionsメソッド呼び出すJsonを作る
data = {"janus":'list_sessions', "admin_secret": janus_admin_secret, "transaction": transaction}

# Websocketのコネクションを作成
websock = websocket.create_connection(janus_admin_url,subprotocols=["janus-admin-protocol"])

# 送信
websock.send(json.dumps(data))

# 受信
rejson =  websock.recv()

# 受信結果を表示
print rejson
```

```
{
   "janus": "success",
   "transaction": "73677159",
   "sessions": [
      311091039069809
   ]
}
```

次に、そのセッションがハンドルしているリストを取得します。
複数のプラグインが使われている場合などは、ハンドルが複数返されます。

```python:
sessions_list = json.loads(rejson).get('sessions',[])

# list_handlesメソッド呼び出すJsonを作る
data = {"janus":'list_handles', "admin_secret": janus_admin_secret, "transaction": transaction, "session_id": sessions_list[0]}

websock.send(json.dumps(data))
rejson =  websock.recv()
print rejson

```

```
{
   "janus": "success",
   "transaction": "73677159",
   "session_id": 311091039069809,
   "handles": [
      1721128026873430
   ]
}
```

最後に、そのハンドルの情報を取得します。

```python:
handles_list = json.loads(rejson).get('handles',[])

# handle_infoメソッド呼び出すJsonを作る
data = {"janus":'handle_info', "admin_secret": janus_admin_secret, "transaction": transaction, "session_id": sessions_list[0], "handle_id": handles_list[0]}

websock.send(json.dumps(data))
rejson =  websock.recv()
print rejson
```

```
{
   "janus": "success",
   "transaction": "73677159",
   "session_id": 311091039069809,
   "handle_id": 1721128026873430,
   "info": {
      "session_id": 311091039069809,
      "session_last_activity": 1367674698,
      "session_transport": "janus.transport.http",
      "handle_id": 1721128026873430,
      "opaque_id": "videoroomtest-L4YiOtywt1nm",
      "created": 464048923,
      "send_thread_created": true,
      "current_time": 1368713443,
      "plugin": "janus.plugin.videoroom",
      "plugin_specific": {
         "type": "publisher",
         "room": 1234,
         "id": 4565592288551424,
         "private_id": 3477273478,
         "display": "You",
         "media": {
            "audio": true,
            "audio_codec": "opus",
            "video": true,
            "video_codec": "h264",
            "data": false
         },
         "bitrate": 128000,
         "audio-level-dBov": 0,
         "talking": false,
         "destroyed": 0
      },
      
      ・・・
      （省略）
      ・・・
   }
}
```
上記の情報を説明します。
infoのpluginが「janus.plugin.videoroom」となっていることから、
このユーザはvideoroomにアクセスしていることがわかります。
またpluginの詳細はplugin_specificにあり、
room番号が「1234」、名前が「You」ということがわかります。
その他にもコーデックやビットレート、SDP等の情報も取得することができます。

# 最後に
今回はAdmin APIの基本的な使い方を説明しました。
この他にもAdmin APIには多数のメソッドが用意されています。
公式サイトを確認してみてください。
次回はプラグインAPIについても記事を書きたいと思います。

# 余談
今回が自分のQiita初記事でした。
間違っている箇所等あれば、ぜひご指摘ください。