Discordのボイスチャンネル入室をLINEで通知する

bot導入の関係で、自身が管理者権限を持つサーバーでのみ使用できる

## Discordbotを準備する
１．まず[Discord Developer Portal](https://discord.com/developers/applications
)を開き、discordにログインする。
２．右上の「New Application」をクリック。
３．アプリ名を入力し、利用規約とポリシーに同意チェックをして「Create」をクリック。
アプリ名は入室通知とした。
４．作成したアプリの管理画面が開く。画面左側の「Bot」を選択。
５．Botの管理画面になります。ここからアイコンやBOTのユーザー名を変更できる。
６．「Reset Token」をクリックしてトークンを取得し、どこかに保存しておく。

:::note alert
取得したトークンをネットやディスコードチャンネルに公開しないこと。
:::

７．画面左側の「OAuth2」を選択
８．OAuth2 URL Generatorで招待リンクを作成する。
SCOPESはbotを選択し、下部の「GENERATED URL」をコピー。
コピーしたURLを開き、入室確認したいボイスチャンネルのあるサーバーを選択し「認証」をクリック
botがサーバーに招待される

## AWSのEC2インスタンスを起動

１．AWSコンソールにサインインする。アカウントがない場合は作成しておく。
[アマゾンウェブサービス（AWSクラウド）](https://aws.amazon.com/jp/)

２．EC2を選択し、「インスタンスを起動」をクリック
３．名前を入力
今回はdiscord_serverとした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638366/18f6a4c6-424e-e569-a802-a0f06b52b69f.png)

４．OSを選択
今回はAmazonLinux
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638366/5aa54f65-723e-4ee6-7b03-13a3651a3cfc.png)

５．キーペアを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638366/013db0ae-04ec-e563-79a8-df2d08a48188.png)

キーペア名を入力
今回はdiscord_server_keypairとした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638366/e305d4e5-cba1-b2ec-d9eb-644aa653d402.png)
「キーペアを作成」をクリック
.pemファイルが.sshフォルダにダウンロードされる。

６．「インスタンスを起動」をクリック
７．インスタンスに接続
ブラウザからの接続と、コマンドプロンプトからの接続ができる。
aws→EC2→インスタンス→作成したインスタンを選択→「接続」
ブラウザからの場合は「EC2 Instance Connect」を、
コマンドプロンプトからは「SSHクライアント」を選択し、表示されたとおりに操作する。
（EC2 Instance Connectだとコピペができない）
```cmd:コマンドプロンプトでの接続例
ssh -i <キーペアのパス> ec2-user@<ec2パブリックIPv4アドレス>
```
以下のような表示がされれば成功。
```
  ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
```

８．ライブラリのインストールやアップデートをする
python3やdiscord.py[^1]、requestsをインストールする

## ボイスチャンネルのIDを調べる
１．Discordアプリを開き、開発者モードをオンにする
歯車マークのユーザー設定を選択
アプリの設定欄の「詳細設定」を選択し、開発者モードのトグルをオンにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638366/9f89b91a-1fc1-c4d6-7d81-f1246362daff.png)
２．入室をチェックしたいボイスチャンネル上で右クリックし、チャンネルIDをコピーする
このIDもどこかに保存しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638366/e757f072-a99f-ad71-003f-4e5b53d9e489.png)

## LINEに通知するプログラムを作成
### LINEの設定
１．LINE Notifyを友達追加する
IDは@linenotify
２．グループに通知を送りたい場合、グループに招待しておく

### LINE Notifyの設定
１．(LINE Notify)(https://notify-bot.line.me/ja/)にLINEアカウントでログインする



２．右上のLINE名をクリックし、「マイページ」を選択
３．トークンを発行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638366/d63e1f89-495f-a8dd-887c-ee8c150b178e.png)
トークン名を入力し、
通知を送るユーザーかグループを選択
今回はトークン名はDiscordVoicechat、通知は「1:1でLINE Notifyから通知を受け取る」に設定した。
発行されたトークンはどこかに保存しておく。

### botプログラムの作成と実行
EC2インスタンスに「.env」「bot_line.py」というファイルをvimで作成、もしくは作成したこれらのファイルを転送する[^2]
１．「.env」ファイルにdiscordのBOTトークンとボイスチャンネルのID、LINE Notifyのトークンを設定する

```cmd:vimで作成する場合
vim .env
```
iでインサートモード、:wで保存、:qで終了、:wqで保存して終了
```env:.env
DISCORD_TOKEN=取得したDiscord Botのトークン
VOICE_CHANNEL_ID=ボイスチャンネルのID
LINE_TOKEN=取得したLINE Notifyのトークン
```
２．通知を送るpythonプログラムを作成
```cmd:vimで作成する場合
vim bot_line.py
```
```python:bot_line.py
import os
import discord
import requests
from dotenv import load_dotenv
load_dotenv()
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
VOICE_CHANNEL_ID = int(os.getenv("VOICE_CHANNEL_ID"))
LINE_TOKEN=os.getenv("LINE_TOKEN")
intents = discord.Intents.default()
client = discord.Client(intents=intents)
def send_line_msg(msg):
    acc_token = LINE_TOKEN
    url = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': 'Bearer ' + acc_token}
    payload = {'message': msg}
    requests.post(url, headers=headers, params=payload)
@client.event
async def on_voice_state_update(user, before, after):
    if before.channel != after.channel:
        if after.channel is not None and after.channel.id == VOICE_CHANNEL_ID:
            send_line_msg(after.channel.name+ "に" + user.display_name + "が参加しました")
client.run(DISCORD_TOKEN)
```
３．ローカルでファイルを作成した場合、ファイルをEC2へ転送[^2]
```cmd:コマンドプロンプト
scp -i <秘密鍵のパス> <転送元のパス> <ユーザー名>@<パブリックIPアドレス]>:<転送先のパス>
```
４．プログラムを実行
EC2上で以下のコマンドでpythonファイルを実行する
```
python3 bot_line.py
```
５．この後ボイスチャンネルへ入室すると、LINEに
「<ボイスチャンネル名>に、＜Discordユーザー名＞が参加しました」と通知される。

## 参考
[discordのボイスチャンネル入室を通知するbotの作成 - クロスパワークラウドブログ](https://xp-cloud.jp/blog/2023/11/29/183351)
[Discord APIリファレンス](https://discordpy.readthedocs.io/ja/latest/api.html#)
[LINE Notify API Document](https://notify-bot.line.me/doc/ja/)

[^1]: [Discord API　インストール](https://discordpy.readthedocs.io/ja/latest/intro.html#installing)
[^2]: [scpコマンドでAWSのEC2とローカル間でファイル・ディレクトリを転送する](https://qiita.com/414_cherry/items/0c0b9df7f5323f3d526e)