社内ラジオの視聴者数の集計を自動化してみた

# 社内ラジオ(Relic Radio)とは
毎週金曜日のお昼12:30から、全社員向けに配信するradioです。
内容とゲストは毎週変わり、金曜日のお昼休憩にご飯を食べながら聞く感じです。

`Amazon IVS(Amazon Interactive Video Service)`で、配信しています。（現在は配信方法が変わりました。）

# 今までの集計方法
sandboxアカウントで配信しているので、以下のaws cliコマンドを叩くことでストリーミング配信されているチャンネルの情報をjson形式で取得することができます。
```
aws ivs get-stream \
--channel-arn arn:aws:ivs:us-east-1:xxxxxxxxxxxx:channel/xxxxxxxxxx \
--region us-east-1
```

帰ってくるjsonは以下になります。
```
{
    "stream": {
        "channelArn": "arn:aws:ivs:us-east-1:xxxxxxxxxxxx:channel/xxxxxxxxxx",
        "health": "HEALTHY",
        "playbackUrl": "https://9be064b2ee73.us-east-1.playback.live-video.net/api/video/v1/us-east-xxxxxxxxxxxx.channel.xxxxxxxxxx.m3u8",
        "startTime": "2023-03-10T02:34:30+00:00",
        "state": "LIVE",
        "streamId": "st-xxxxxxxxxxxxxx",
        "viewerCount": 0
    }
}
```

こちらの`viewerCount`が実際に聞いている人の数になります。
このコマンドを叩いて、取得した人数をチャンネルに送って、スプレッドシートに反映させて、の作業を5分に1回行っていました。

# 今回の自動化
せっかくやるので、あまり触ったことがない言語で書きたいと思って、ちょうどいい機会だったのでシェルスクリプトで処理を書きました。
### 処理の流れ
- aws cliコマンドでstream情報を取得
- 取得したjsonからviewerCountを取得
- 取得した視聴者数をslackAPIを使用して自動で投稿
- 上記を5分間隔で繰り返す


ソースコードが以下になります。
<img width="622" alt="スクリーンショット 2023-03-10 13.17.28.png (664.5 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2023/03/10/127291/0fd50eb1-574f-4f38-8ec8-9e89167192d0.png">

### シェルスクリプトの面白かった点
- 変数の定義の仕方が違う
- 文字列と変数の連結
- 条件の判定の仕方（-z）が違う
- `\`で改行してもコマンドを連結できる
- jsonデータの扱いに`jq　.`を使用する

### これから覚えていきたい点
- 入力した文字列の使用
- `trap`を使ったシグナルのキャッチした後の処理
- エラーハンドリング etc...

## slack APIの自動送信
slackAPIの`https://slack.com/api/chat.postMessage`のエンドポイントに、発行したoauth tokenを使用してrequestを投げると、指定したチャンネルに、投稿したいテキストを送信することができます。

### 手順
1. Create New Appを押して、新しいAppを作成する
<img width="1392" alt="スクリーンショット 2023-03-10 13.38.24.png (395.2 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2023/03/10/127291/94c99e35-c6b8-4ddc-ab94-2683ac72a228.png">

2. From scratchを選択
<img width="1392" alt="スクリーンショット 2023-03-10 13.40.02.png (427.6 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2023/03/10/127291/67adf2ed-0ccb-44ed-b63d-cbd99bc030a7.png">

3. App Nameを決めてとworkspaceを選択
<img width="1392" alt="スクリーンショット 2023-03-10 13.41.34.png (430.6 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2023/03/10/127291/b49387f0-671a-4de8-86b6-36afb8d8a079.png">

4. 作成できたら`OAuth & Permissions`の`Scopes`項目で、一番最小権限のscopeである`chat:write`と`chat:write.customize`を選択

5. workspaceと紐付ける

6. チャンネルに作成したAppを招待する

7. エンドポイントにtokenを使用してrequestを送ると、指定したチャンネルにメッセージが飛ぶ

キャプチャ
<img width="597" alt="スクリーンショット 2023-03-10 17.06.48.png (63.5 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2023/03/10/127291/a477f912-14c6-4715-81bd-2ba2b700f526.png">


## 今後やりたいこと
gas(google app script)を使用して、視聴者数と時間を引数にとったメソッドを用意して外部から叩けるようにしたいです。
一応gasで作成はしていて、機能テストもしているのですが、この関数を叩くには、GCP(Google Cloud Platform)にプロジェクトを作成して、gasにGoogle Cloud Platform（GCP）プロジェクトを紐付けてAPIとしてデプロイしなければいけない。。。
GCPのrelicのフォルダに勝手にプロジェクトを作成していいかわからなかったため、一旦保留しています。

<img width="1393" alt="スクリーンショット 2023-03-10 14.01.32.png (391.3 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2023/03/10/127291/a89f1dbe-acf5-4519-a31d-4ac051f5d2ab.png">


# 最後に
シェル、gas、最近はフロントエンドの改修タスクでreactも少しだけ触っていて、それぞれ書き方や定義の仕方などが違ってきて、その度にgoogleで検索して書いていくのは大変ですが、実装していく上で意識する部分は似ているのかなと感じつつ、楽しいと感じています。
やっぱり私はlaravelが好きですが、吸収できるものや興味のあるものはどんどんやっていこうかなと思っています。