ConoHa VPSを使って簡単なDiscord BOTを作ろう

## はじめに
この記事は[「ConoHa Advent Calendar 2024」](https://qiita.com/advent-calendar/2024/conoha)の第22日目の記事です．ここ数年参加させてもらっているのですが，調べると昨年も一昨年もその前の年も22日担当だったようでもはや縁を通り越している気がします笑
今回は，ConoHa VPSを使って簡単なDiscord BOTを作ろうというお話になります．最近は，Discordの利用者もぐっと増えてきたように思います．簡単ではありますが，Discord BOTを作る過程をご紹介しようと思います．

## Discord側にBOTとして登録しよう

まずはじめに，自分が管理者のDiscordサーバーを立てておいてください．すでに立ててある方はそれを使ってもらっても構いません．

DiscordサーバーはDiscordの画面から ＋ ボタンを押して， オリジナルの作成 から簡単に立てられます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/387d8d00-22ed-a7f7-b7d7-b1d4587cf423.png)


### BOTアカウントを作成します
Discord Developer Portalにアクセスして，ログインします．

https://discord.com/developers/applications/

ログインしたら，右上の New Application をクリックします．
![スクリーンショット 2024-12-22 184645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/b10e19f6-4c87-1e75-cfae-f562a3a1ff59.png)

別のウインドウが開くので好きなBOT名を入力します．今回は，「conoha-bot」としました．
![スクリーンショット 2024-12-22 184803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/bff90133-92e1-f882-b35a-8fdeb7a1d117.png)

左のメニューから Bot を選択して Bot 画面を表示します．
![スクリーンショット 2024-12-22 184948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/a6e343db-6fbf-05e3-2c46-0f0ac2ed3d0b.png)

### Privileged Gateway Intentsの設定

少し画面を下げて， Privileged Gateway Intents の3つのスイッチをONにします．
![スクリーンショット 2024-12-22 185119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/da812fcb-7188-62ac-9d8c-581c67ec15cf.png)

### TOKENの取得

少しもどって， TOKEN を発行します．この画面ではすでに一度発行してしまったので， Copy ボタンがありますが，初めての場合は， Reset Token ボタンのみかと思いますので押してください． Reset Bot's Token? と聞かれますので，Yesを押して進めてください．2段階認証を設定している方は認証コードの入力を求められる場合はあります．そこまで進めたら，Tokenが発行されますので，メモしておいてください．後で使用します．
![スクリーンショット 2024-12-22 190017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/f14fb09e-c1b4-e8cf-b85c-4a374d404e60.png)


### Discordサーバへ招待する準備

次に，Discordサーバーへ招待する準備を行います．Discord Developer Portalの左のメニューから OAuth2 を選択します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/cadcbdb7-2fe3-b739-a413-cd4c33ef6631.png)

少し進めて， OAuth2 URL Generator のチェックボックスのリストで bot のみのチェックを入れます．
![スクリーンショット 2024-12-22 185302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/e7c863ed-da5b-49eb-63c2-a3075a6a66a2.png)

チェックを入れると，下に Bot Permissions が出てきますので，今回は， View Channels と Send Messages のみチェックを入れます．
![スクリーンショット 2024-12-22 185726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/93dde9c5-931a-54b0-a917-91e1aa1df6db.png)

ここまで進めたら，もう少し下に，Integration Typeは Guild Install になっていることを確認して， Generated URL に表示されているURLをコピーして，そのURLに接続します．

URLに接続すると自分か管理するサーバーのリストが出てきますので，導入したいサーバを選択して はい を押して進めます．
![スクリーンショット 2024-12-22 185832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/8993e234-8b7e-942a-5be0-d8eac8fc2631.png)

その後，権限の確認が表示されますので確認して認証を押します．押した後には，キャプチャによる認証が入るかもしれませんがそれは指示通りにクリアしてください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/c240e3e2-f8e8-e9a0-d3ed-eecfe34394f9.png)

うまく追加に成功するとサーバーに conoha-bot がユーザーとして登録されます．
![スクリーンショット 2024-12-22 190114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/27a90ec2-b565-f997-119c-f143bece25d3.png)

ここまでで，Discord側の設定は完了です．

## ConoHa VPS側でBOTのプログラミングを構築する

### 今回の仕様

今回は，ConoHa VPS Ver.3.0 を使用しました．
・Ubuntu 24.04 1GBプラン
で構築しました．

構築したVPSにSSHで接続できるようにしておきます．

VPSに接続するときに少し手こずったのですが，接続するVPSのセキュリティグループでSSHに接続できるセキュリティグループを選択しておいてください．今回は， IPv4v6-SSH にしました．

### 必要なパッケージをインストールする

今回は，Pythonを使って，discord.pyというモジュールを使用します．
必要なモジュールをインストールしていきます．

```
$ sudo apt update
$ sudo apt install python3-pip
```

ここで，次に ```pip install discord.py``` と入れたいところなのですが，Ubuntu 24.04では，セキュリティが強化され実行できないようになっています．一度実行すると分かるのですが，externally-managed-environmentとエラーが発生します．エラーの回避方法や正規の方法は他の文献に譲るとして，今回は簡単に進めたいので，回避するオプション ```--break-system-packages``` を追加します．

```
$ pip install --break-system-packages discord.py
```

これでインストールができるようになったかと思います．これでパッケージのインストールは完了です．

### BOTのプログラミングをする

今回は，特定のコマンドを入力したら返事が返ってくるBOTを作ろうと思います．このはちゃん清楚可愛いBOTを作ります．
Pythonプログラムを実行したいディレクトリでコードを作成します．今回は， ```conoha.py``` として作成しました．

```
# discord.pyを読み込む
import discord

# 控えておいた自分のBOTのTOKENに置き換える
TOKEN = 'MTMyMDMyNzA00000NjIzODUwNA.G1dH4_.j5fTD1Q_GH3DQ3500000-Yb8t5Nzx9HhzqtMtk'

# 接続に必要なオブジェクトを生成
client = discord.Client(intents=discord.Intents.all())

# BOT起動時に動作する処理
@client.event
async def on_ready():
    print('起動しました')

# メッセージを受信したときに動作する処理
@client.event
async def on_message(message):
 
 # "/conoha"と発言したら"清楚可愛い"が返ってくる処理
 if message.content == '/conoha':
  await message.channel.send('清楚可愛い')

# BOTの起動とDiscordサーバーへの接続
client.run(TOKEN)
```

ここまで入力できたら保存してください．

### BOTを起動する

次のコマンドを入力してBOTを起動します．今回は，ファイル名を ```conoha.py```としています．
```
$ python3 conoha.py
```
問題なく起動できたらコンソールに 起動しました と表示されます

DiscordのサーバーでもBOTがオンラインに変わったのが確認できます．もしオンラインになっていない場合は，何度かBOTの起動をし直してみてください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/ad89c572-a126-239c-1179-50b1a19b05fc.png)

### BOTと会話する

さて，作ったBOTと会話してみましょう．

Discordのチャット欄に ```/conoha``` と入れます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/20f1f7ba-271b-3773-9d69-d37c452796cd.png)

そうすると，BOTが ”清楚可愛い” と返してくれます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311851/dea59116-9697-1adf-25f2-612b17d90684.png)

これで，このはちゃん清楚可愛いBOTの完成です！

### おまけ

今回は，Discordのチャット欄に ```/conoha``` と入れたら， ”清楚可愛い” と変えてしてくれるように作りましたが，プログラムの

```
 if message.content == '/conoha':
  await message.channel.send('清楚可愛い')
```
を追加したり，書き換えたりすると他の応答もできるようになるので試してみてください．

また，BOTは完成しましたが，このままだと，SSHのコンソールを落としたりするとBOTが止まってしまいます．1つは，``` $ python3 conoha.py & ``` と入れる方法もありますが，これでもしばらく経つと落ちてしまいますので，``` cron ```などで定期的に起こしてもらうか，システムに追加するかする必要があります．

## さいごに
ざっと駆け足になってしまいましたが，ConoHa VPSを使って簡単なDiscord BOTを作ろうをお送りしました．毎年この時期になると1年間なにやったかなぁ～って思い出すことが増えてます笑　ConoHaとの付き合いも年々長くなりますね！　私が初めて使ったときは，まだHDDのVPSでした．そんな昔のことを思い出しながらこれからもいろいろチャレンジしていこうと思います．また，来年のAdvent Calendarでお会いするかもしれません笑

最後に，

このはちゃん，清楚可愛い！

と言って終わっておきましょう～