17
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Systemi(システムアイ)Advent Calendar 2022

Day 19

PythonのPの字も知らないカレー好きの私がdiscord.pyを使ってDiscord botを作ってみる

Last updated at Posted at 2022-12-18

初めに

やってみようと思ったきっかけ

以前node.jsライブラリを使ったDiscord Botを作ったことがあり結構面白くてのめり込んだことがあった。
なら今度は触ったことがない最近流行りのPythonで作ったのなら最終的に機械学習とかできるようになるんじゃないかと考え、
とにかく触ってみるかということで作ることにした。

Discord とは

通話もできてテキストメッセージもできる多機能なコミュニケーションツール
友人とDiscordでボイスチャンネルにあつまって通話しながらオンラインゲームとかを楽しんだりする時に使用する。
slackみたいな感じ。

Discord BOTとは

イベントを検知して自動で反応して色々してくれるロボット。
例えばテキストメッセージで「おはよう!」と送信時、「おはようございます!」と返してくれたりとか、
ボイスチャンネルにユーザが入室した時、「いらっしゃいませ!」と言ってくれたりできる。
omocha_robot.png

事前準備

Discordアカウント作成

何はともあれ、まずはDiscordアカウントを作るところから。
公式ページからアカウントを新規作成してログインまで進める。

※作成済みの場合はログインしておくだけでOK。

無事作成できたらこんな画面が出てくるはず。
image.png

Pythonインストール

次にBOTプログラムを動かすための環境構築する。
今回は以下の条件でローカルで動かすことを想定。

  • Windows10
  • python最新版(本記事ではバージョン3.11.1を使用)
  • discord.py最新版(本記事ではバージョン2.1.0を使用)

pythonの最新版をインストールする。

※インストーラーは全てデフォルトで進めてOK。

discord.pyインストール

公式ページは以下のリンクから。

インストールをするには、コマンドプロンプトを起動して以下コマンドを実行する。

py -3 -m pip install -U discord.py

BOT登録

BOTの新規登録

どんなBOTを定義するため、BOT登録をしていく。
Discordのデベロッパーポータルにアクセスする。

アクセスできたら画面右上の「New Application」をクリック。
1.png
NAMEに作るカレーの名前(BOTの名前)を入力して、Discordの開発者利用規約およびポリシーに同意する旨のチェックをいれて「Create」をクリックする。
image.png
画面左のSettingsから「Bot」 を選択し「Add Bot」をクリック。
3.png
4.png
アプリにBOTの命を吹き込むか聞かれるので「Yes, do it!」をクリックする。
5.png
画面が表示されればアプリボットが作成され詳細情報が確認できるようになる。
image.png

アイコン設定

アイコン画像を設定する。
これはユーザのアイコンと同様に顔となる部分である。

APP ICONの+部分をクリック
image.png
カレー画像を選択し「Save Changes」をクリックする。
image.png
何も設定されていなかったアイコンにカレー画像が表示されていれば設定完了。
カレー画像がなければシチューか最悪ハヤシライスでもよい。

インテント設定

次はインテント設定をする。
これはBOTが使う機能のみ明示的に開放するためONにする。
画面左から「Bot」を選択する。
3.png
Privileged Gateway Intentsの項目内に3つスイッチがありデフォルトは全てOFFとなっている。
image.png
自分のサーバでしか使用しないようなBOTであれば全てONしてしまって問題ない。
全てONに設定後、「Save Changes」をクリックする。
image.png

BOT権限要求設定

作成したサーバー上でBOTが色々動くためにはBOT自体に招待されたサーバーでの権限がなければ何もできない。
そのため、作ったBOTが正しく動くための権限は何が必要であるか設定しておく必要がある。
画面左のSettingsから「OAuth2」> 「URL Generator」 を選択する。
19.png
SCOPESから「bot」にチェックを入れる。
20.png
BOT PERMISSIONSで自分のBOTが正常に動くために必要な権限にチェックをいれていく。
※とりあえず自分のサーバーで動かしたいだけであれば「Administrator」を選択しておけばOK。
image.png

BOTプログラム作成

コーディング

次にBOTにどういう動きをさせたいかプログラムを書いていく。
最初に作成したコードを保存するフォルダを作っておこう。
今回は「C:\test_bot」フォルダに保存する。(フォルダは任意の場所でOK)

とりあえず一番基本的な特定のテキストメッセージが送信された時に反応するBOTを作ってみる。
今回は「カレー」がチャットされた時、BOTが「ライス」か「ナン」どちらで食べるのがいいか教えてくれるという設定にしてみた。

testbot_no1.py
# This example requires the 'message_content' intent.
# coding=shift-jis

# ライブラリインポート
import random
import discord

class MyClient(discord.Client):
async def on_ready(self):
	print(f'{client.user}がアップを始めました')

async def on_message(self, message):
    if message.author == client.user:
	        return

    if message.content.startswith('カレー'):
        num = random.randrange(2)
        if num == 0:
            await message.channel.send('ライス')
        else:
            await message.channel.send('ナン')

intents = discord.Intents.default()
intents.message_content = True

client = MyClient(intents=intents)
client.run('APP TOKEN')

コード説明

ここでコード内でちょっとしたポイントを説明させてほしい。
2行目はエンコーティングの設定で、今回はBOTが日本語を受け取って日本語で返すため仕様であるが、
ここの記述がない場合、デフォルトのUTF-8で処理してしまうので文字コードを読み込めずエラーが出力されてしまう。
インド語であれば、UTF-8でも多分大丈夫だろう。

# coding=shift-jis

16~21行目がBOTがテキストメッセージを検知し反応するコードとなっている。
16行目で「カレー」を受け取る。
17行目で 0 or 1 の乱数取得
18~21行目で0の場合はライス、そうでなければナンが返されるといった具合。

    if message.content.startswith('カレー'):
        num = random.randrange(2)
        if num == 0:
            await message.channel.send('ライス')
        else:
            await message.channel.send('ナン')

27行目の「APP TOKEN」はBOT登録時画面のBuild-A-BotのTOKENからコピーして置き換える。
このAPP TOKENがプログラムと登録したBOTで一致していることにより、プログラムがどのBOTから動くかの紐づけとなっている。

client.run('APP TOKEN')

image.png

トークン(APP TOKEN)は第三者に漏洩しないよう管理には十分注意してほしい。悪意のある第三者からBOTへのアクセスが可能となってしまい、BOTが参加しているサーバのユーザ情報の漏洩などの危険性がある。万が一トークンが漏洩してしまった場合はすぐに「Reset Token」を実行してトークンの変更をしたほうがよい。

image.png

BOT起動

BOTプログラム起動

いよいよBOTを起動をしていく
コマンドプロンプトを起動し以下コマンドを実行する。

cd C:\test_bot
py -3 testbot_no1.py

以下のログが表示されればOK。

[2022-12-14 14:55:22] [INFO    ] discord.client: logging in using static token
[2022-12-14 14:55:23] [INFO    ] discord.gateway: Shard ID None has connected to Gateway (Session ID: 9196fc28f72e476de032cdacfb10eb32).
やさいカレー#5636がアップを始めました

サーバー作成

次にBOTを動作させたいサーバーを作成しよう。
Discordにログイン後の画面左の「サーバーを追加」(+アイコン)をクリック。
image.png

サーバーを作成画面が表示されるので、目的にあったテンプレートを選択していく。
項目の中に「カレー」はないので、今回は「ゲーム」を選択してみる。
※テンプレート選びに失敗してもあとでカスタマイズができるので気軽に選んでみてほしい
image.png
その後は適当に選び進めてサーバー名を入力し「新規作成」をクリック。
image.png
以下の画面の通り、サーバー名のアイコンが表示されてばサーバー作成は成功。
image.png

BOTをサーバーへ招待するためのURL作成

BOTを動かすためのサーバーができたので、BOTをサーバ
これがないと皿に思い通りにカレーを盛ることは困難だからだ。

1つ前の手順で開いていた画面の一番下に GENERATED URL にBOT招待用のURLが生成されているので「COPY」をクリック。
image.png

上記でコピーしたURLをブラウザに貼り付けアクセスする。
以下の画面が表示されるので盛りたい皿(サーバー)を選択のうえ、「はい」をクリック。
image.png

次に入っているスパイス(権限)が表示されるので問題なければ「認証」をクリック。
image.png

もしも、人間か疑われた場合は、「私は人間です」にチェックを入れて対応しましょう。
image.png

問題なくBOTを招待できれば認証しました画面が表示される。表示後は画面を閉じてOK。
image.png

先ほど作ったサーバーを確認すればBOTが参加してきたメッセージが出力されているはず。
image.png

動作確認

さっそく「カレー」をチャットして返事をくれるか試してみる。
image.png

無事「カレー」に対して「ライス」なのか「ナン」なのか答えてくれるBOTが完成した。

まとめ

いかがだっただろうか。
Botといってもやり方を覚えてしまえば簡単に作れるし、触ったことのない言語であっても始めやすいと思うので、
もし興味があればぜひ自分でBOTを作ってみてカレーを好きになってほしいと思う。

17
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?