Ubuntu20.04でPythonでDiscordボットを構築する方法
序章
Discord は、ゲーマー、オープンソースコミュニティ、会議主催者などが使用する人気のある音声およびテキストメッセージングプラットフォームです。 優れたボイスチャット、さまざまなテキストチャネル、自動アシスタントまたは「ボット」を使用した拡張性などの機能により、人気が高まっています。
このガイドでは、Pythonプログラミング言語を使用してDiscordボットを構築し、Ubuntu20.04サーバーにデプロイします。 ボットをプログラムするには、DiscordPythonライブラリdiscord.pyを使用します。
注: Discordには、チャット/ボイスルームに2つの異なる名前があります。 ドキュメントのどこにいるかに応じて、これらをサーバーとギルドの両方と呼びます。 このチュートリアルでは、ギルドという用語を使用します。 これらの用語は同じ意味で使用でき、多くの場合、Discordの公式ドキュメントに記載されていることを知っておいてください。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- sudo非rootユーザーとファイアウォールを備えた1台のUbuntu20.04サーバー。 これは、Ubuntu20.04初期サーバーセットアップガイドに従ってセットアップできます。
- ローカルマシンにインストールされたPython3。 具体的な手順については、PythonをWindows、 Mac 、またはLinuxにインストールするためのチュートリアルのいずれかに従ってください。
- 管理者権限を持つDiscordアカウントとDiscordギルド。 DiscordのGettingStartedページにアクセスして、アプリと無料アカウントを入手してください。 次にギルドを作成します。 独自のDiscordGuildを作成すると、ボットを追加するために必要な権限が与えられます。
-
- Visual Studio Code 、 Atom 、 Sublime 、 Nano など、任意のテキストエディター。
ステップ1—DiscordGuildのボットユーザーを作成する
コーディングを開始する前に、ボットを作成してDiscord開発者ポータルに登録する必要があります。
開発者ポータルにサインインし、新しいアプリケーションボタンをクリックしてプロセスを開始します。 Discordアプリケーションを使用すると、DiscordAPIを操作できます。 ボットはアプリケーションにバインドされています。 それが彼らの機能です。
次に、モーダルにアプリケーションの名前を追加し、作成ボタンを押します。 このチュートリアルでは、名前を付けます SammySharkBot
.
Discordがアプリケーションを作成します。 次に、ボットに関する情報が記載されたページに注目します。 ボットのアイコンとして機能する画像を追加することを選択できます。 ページのアプリアイコンセクションにあるすっきりとしたアイコンボタンをクリックします。 これは必須ではありません。
アイコンをアップロードした場合は、変更を保存するように求めるダイアログボックスが表示されます。 変更の保存を押してアイコンを保存します。
アプリケーションをセットアップしたので、次はアプリケーションに関連付けられたボットを作成します。 画面左側の設定ナビゲーションペインのボットリンクに移動します。
次に、ボットの追加ボタンをクリックして、ボットをアプリケーションに追加します。
これを行うと、ボットが表示され、前に設定したオプションのアイコンが表示されます。 このページを覚えておいてください。 APIトークンを取得するには、後で戻ってくる必要があります。
次のようなモーダルが表示されます
次に、画面左側の設定ナビゲーションペインのOAuth2リンクに移動します。 ボットが正しく機能できるように、適切な権限を追加する必要があります。
ボットが機能できるスコープを追加する必要があります。 ボットオプションのみをチェックしてください。これは、このボットに実行させたいのはそれだけだからです。 他のスコープの詳細については、DiscordOAuth2ドキュメントにアクセスしてください。
次に、下にスクロールして、ボットに次の権限を付与します:チャネルの表示、メッセージの送信、メッセージ履歴の読み取り。 これにより、ボットが実行できるアクションのセットが制限されます。 制限なしでボットを作成したい場合は、管理者オプションを選択できます。 これはお勧めしません。
これを行うと、DiscordURLの後にCopyボタンが表示されます。 そのボタンをクリックしてリンクをコピーし、ブラウザの新しいウィンドウで開きます。
ボットがギルドに接続するためのプロンプトが表示されます。 複数のギルドにボットをインストールする権限がある場合があるため、ここで複数のボットに注意することができます。 ボットをインストールするギルドを選択し、承認をクリックします。
ボットがギルドに追加される前に、Discordはボットが持つすべての権限を表示します。 これにより、インストールしているものを確実に認識できます。 ボットに特定の権限を与えたくない場合は、チェックを外すことができます。 ただし、このボットは他の方法では機能しないため、これを行わないでください。 承認をクリックして、ボットを受け入れてギルドに追加します。
ギルドに戻り、新しいメンバーに関する投稿が表示されるチャンネルを確認してください。 ボットがギルドに参加したことに気付くでしょう。 ボットはオフラインで表示されますが、ボットは右側のメンバーリストにも表示されます。 これは、ボットコードを開始した後に変更されます。
ボットがギルドに追加されたので、Pythonコードを使用してボットを実現する準備が整いました。
ステップ2—プロジェクト用のPython仮想環境を作成する
コーディングを開始する前に、Python開発者環境をセットアップする必要があります。 このステップでは、管理を容易にするために、仮想環境内にPython要件をインストールしてアクティブ化します。
まず、すべての仮想環境を保存するために使用できるディレクトリをホームディレクトリに作成します。
- mkdir ~/.venvs
次に、Pythonを使用して仮想環境を作成します。
python3 -m venv ~/.venvs/discord
これにより、というディレクトリが作成されます discord
あなたの中で .venvs
ディレクトリ。 内部には、Pythonのローカルバージョンとのローカルバージョンがインストールされます pip
. これを使用して、プロジェクト用に分離されたPython環境をインストールおよび構成できます。
プロジェクトのPython要件をインストールする前に、仮想環境をアクティブ化します。
- source ~/.venvs/discord/bin/activate
プロンプトが変化して、Python仮想環境内で操作していることを示します。 次のようになります。 (discord)user@host:~$
.
仮想環境をアクティブにして、インストールします discord.py
のローカルインスタンスで pip
:
- pip install discord.py
注:仮想環境をアクティブ化したら(プロンプトが (discord)
その前に)、使用する pip
それ以外の pip3
、Python3を使用している場合でも。 ツールの仮想環境のコピーには常に名前が付けられます pip
、Pythonのバージョンに関係なく。
Discordパッケージがインストールされたので、この要件とその依存関係を保存する必要があります。 これは、必要に応じて開発者環境を再作成できるようにするための良い方法です。
使用する pip
環境の情報をに保存するには requirements.txt
ファイル:
- pip freeze > requirements.txt
これで、不和ボットを構築するために必要なライブラリができました。
ステップ3—最小限の不和ボットを構築する
ここで、Discordボットのコーディングを開始します。 完了すると、ボットはテキストチャットで共有されている特定のフレーズをリッスンし、それに応じて応答します。 具体的には、ボットはユーザーに代わってコインを投げます。
このステップでは、ボットの最小バージョンを構築します。 次に、ステップ4およびステップ5で機能を追加します。
まず、という名前のファイルを開きます bot.py
お好みのテキストエディタで:
- nano bot.py
次に、次のインポートをファイルに追加します。 os
, random
、 と discord
. The os
ライブラリを使用すると、次のような貴重な情報を読むことができます。 API Tokens
と Guild Name
環境変数から。 The random
ライブラリを使用すると、ランダムイベントの出力を生成できます。 そしてその discord
ライブラリは、discord APIとの対話に必要なメソッド、オブジェクト、およびデコレータを提供します。 コードは次のとおりです。
import os
import random
import discord
次に、環境変数からDiscordAPIトークンとボットのギルドを取得する必要があります。 この方法を使用します getenv
から os
Python標準ライブラリのライブラリ。 次のコードをに追加します bot.py
:
...
token = os.getenv("DISCORD_TOKEN")
my_guild = os.getenv("DISCORD_GUILD")
バージョン1.5では discord.py
, Intents
紹介されました。 これは、ボットがギルド内で発生する特定のイベントをサブスクライブできるようにした以前のバージョンのDiscordライブラリからの重大な変更でした。 このチュートリアルでは、クライアントの使用可能なインテントをデフォルトに設定しますが、 GUILD_PRESENCES
また GUILD_MEMBERS
意図。 これらは特権ゲートウェイインテントです。
次のコードをに追加します bot.py
インテントを適切に設定するには:
...
intents = discord.Intents.default()
client = discord.Client(intents=intents)
それでは、Discordのイベントに応答するコードを書いてみましょう。 イベントは、メッセージの送信やチャンネルへの参加など、Discordギルドで発生するアクションです。 サポートされているイベントの完全なリストについては、 Discord Event ReferenceAPIを確認してください。
コードの最初のセグメントは、 on_ready
イベント。 このイベントは、ボットがギルドにロードされたときにトリガーされます。 Discord APIは、このイベントが1回だけ発生することを保証しないことに注意してください。 1回だけ実行する必要があるコードをここに配置することを計画している場合は、実際に1回だけ実行されることを確認するためにいくつかのチェックを行います。
ボットがギルドに正常に接続したときに印刷するprintステートメントを作成します。 Discordボットは async
ボットが準備完了状態になり、呼び出しを待機するようにするメソッド。
次のコードを最後に追加します bot.py
:
...
@client.event
async def on_ready():
for guild in client.guilds:
if guild.name == my_guild:
break
print(
f"{client.user} is connected to the following guild:\n"
f"{guild.name}(id: {guild.id})"
)
あなたは for
ループして利用可能なすべてのギルドの中からギルドを見つけ、ギルドとそのギルドへの接続に関する情報を印刷します。
最後に、APIトークンを使用してスクリプトが実行されたときに実行するようにクライアントに指示する必要があります。 次の行をに追加します bot.py
ボットを実行するには:
...
client.run(token)
この時点で、コードは次のようになります。
import os
import random
import discord
token = os.getenv("DISCORD_TOKEN")
my_guild = os.getenv("DISCORD_GUILD")
intents = discord.Intents.default()
client = discord.Client(intents=intents)
@client.event
async def on_ready():
for guild in client.guilds:
if guild.name == my_guild:
break
print(
f"{client.user} is connected to the following guild:\n"
f"{guild.name}(id: {guild.id})"
)
client.run(token)
ボットがギルドに接続できるようにするスケルトンコードを記述しました。 次に、ボットの基本機能をテストします。
ステップ4—ボットをローカルでテストする
コーディングする前に、ボットがDiscordに接続できることを確認してください。 discord開発者パネルに戻り、左側のナビゲーションバーにあるボットリンクをクリックします。 ここから、ボットのユーザー名の下にあるトークンを見つけ、コピーボタンをクリックしてトークンをクリップボードにコピーします。
トークンをコピーしたら、アクティブ化された仮想環境のあるターミナルに戻ります。 起動時にボットが読み取ることができるように、Discordトークンをエクスポートします。
- export DISCORD_TOKEN=YOUR_DISCORD_TOKEN
次に、ボットが参加するギルド名を取得する必要があります。 Discordギルドに移動します。 ギルド名は、ギルドページの左上隅にあるはずです。 これは、前提条件セクションでギルドを作成したときに選択した名前です。
次に、Discord Guildをエクスポートして、ボットが起動時に読み取ることができるように環境変数で使用できるようにします。
- export DISCORD_GUILD=YOUR_DISCORD_GUILD
必要な環境変数をエクスポートしたので、ボットをテストする準備が整いました。
アプリケーションを実行します。
- python3 bot.py
数秒かかる場合がありますが、次のような出力が表示されます。 ボット番号と id
異なります:
OutputSammySharkBot#8143 is connected to the following Guild:
SammyShark(id: 801529616116350998)
Discord Guildに戻ると、ボットの名前の近くに緑色の円が表示されていることがわかります。 これは、ボットがオンラインであることを示しています。
ターミナルでコードが終了しないことに気付くかもしれません。 これは、ボットが常に実行されているプロセスであるためです。 ボットをいつでも停止するには、 CTRL +Cキーの組み合わせを押します。
ステップ5—ランダムタスクを実行するためのDiscordボットの拡張
ボットが機能しているので、次はその機能を拡張します。 ボットがテキストチャットで送信されたメッセージに応答するには、on_messageイベントをリッスンする必要があります。 この関数は1つの引数を取ります。 message
、メッセージオブジェクトを含みます。メッセージに応答するためのさまざまな属性とメソッドを含みます。
確認する必要があることの1つは、ボットがそれ自体に応答しないことです。 ボットが自身のメッセージをトリガーとして解釈すると、無限ループが発生します。 これを回避するには、メッセージを送信するユーザーがボットではないことを確認してください。
次のコードをに追加します bot.py
宣言する on_message
機能し、誰がメッセージを送信したかを確認します。
...
@client.event
async def on_message(message):
if message.author == client.user:
return
最後に、コインを投げるコードを追加します。 また、メッセージコンテンツに対して文字列操作を小文字(または必要に応じて大文字)に実行するため、文字列の大文字と小文字が完全に一致することを心配する必要はありません。 使用 randint()
Pythonの関数 random
コイントスをシミュレートするライブラリ。 最後に、メッセージを作成したら、メッセージの送信方法を使用してメッセージをチャネルに送信します。 これは非同期プログラミングであるため、を使用する必要があることを忘れないでください await
メッセージを送信するときのキーワード。
次のコードをに追加します bot.py
以内 on_message
関数; これにより、コイントス機能が追加されます。
message_content = message.content.lower()
if "flip a coin" in message_content:
rand_int = random.randint(0, 1)
if rand_int == 0:
results = "Heads"
else:
results = "Tails"
await message.channel.send(results)
以下は、ボットの完成したコードです。 コードが次のようになっていることを確認するか、次のコードをコピーして貼り付けます。
import os
import random
import discord
token = os.getenv("DISCORD_TOKEN")
my_guild = os.getenv("DISCORD_GUILD")
intents = discord.Intents.default()
client = discord.Client(intents=intents)
@client.event
async def on_ready():
for guild in client.guilds:
if guild.name == my_guild:
break
print(
f"{client.user} is connected to the following guild:\n"
f"{guild.name}(id: {guild.id})"
)
@client.event
async def on_message(message):
if message.author == client.user:
return
message_content = message.content.lower()
if "flip a coin" in message_content:
rand_int = random.randint(0, 1)
if rand_int == 0:
results = "Heads"
else:
results = "Tails"
await message.channel.send(results)
client.run(token)
ボットが完成したので、それをテストする時が来ました。 ファイルを保存して閉じます。
アプリを再実行します。
- python3 bot.py
アプリがギルドに接続したら、Discordギルドの#generalチャンネルに移動します。 タイプ flip a coin
テキストチャットで、ボットはHeadsまたはTailsのいずれかで応答します。
ボットが機能していることを確認したので、Ubuntu20.04サーバーの本番環境にボットをデプロイする準備が整いました。
ステップ6—Ubuntu20.04へのデプロイ
ボットをローカルマシンから実行したままにすることはできますが、端末をアクティブのままにしたり、停電を心配したりするのは面倒な場合があります。 便宜上、サーバーにデプロイできます。
ボットをroot以外のユーザーとして実行することをお勧めします。 このチュートリアルでは、ユーザー名sammyを使用します。
まず、コードとPythonライブラリの要件をサーバーにコピーします。 scp
指図。 すべてをユーザーのルートディレクトリに送信します。
- scp bot.py requirements.txt sammy@your_server_ip:~
次に、サーバーにSSH接続します。
- ssh sammy@my_server_ip
ここで、サーバーの端末にコマンドを入力します。
サーバーでボットを実行するには、適切なPythonシステムパッケージをインストールする必要があります。
インストール python3
, python3-venv
、 と screen
:
- sudo apt update && sudo apt install python3 python3-venv screen
次に、screenというツールを使用して仮想端末を作成します。 このツールがないと、ボットの実行中にターミナルを終了すると、プロセスが終了し、ボットがオフラインになります。 このツールを使用すると、セッションに接続および切断して、コードを実行し続けることができます。 screenの詳細については、screenのインストールと使用に関するチュートリアルをご覧ください。
スクリーンセッションを開始するには、次のコマンドを使用します。
- screen
画面にライセンス契約のプロンプトが表示されます。 Returnを押して続行します。
仮想セッションを設定したので、コードを実行するためのPython仮想環境を作成する必要があります。
まず、前と同じように、仮想環境を保存するディレクトリを作成します。
- mkdir ~/.venvs
次に、新しい仮想環境を作成します。
- python3 -m venv ~/.venvs/discord
仮想環境をアクティブ化します。
- source ~/.venvs/discord/bin/activate
次に、pipを使用して必要なライブラリをインストールします。
- pip install -r requirements.txt
ボットを実行する前に、ボットをエクスポートする必要があります DISCORD_TOKEN
と DISCORD_GUILD
ボットがAPIキーとギルド情報にアクセスできるようにします。
- export DISCORD_TOKEN=YOUR_DISCORD_TOKEN
- export DISCORD_GUILD=YOUR_DISCORD_GUILD
最後に、ボットを実行します。
- python3 bot.py
ボットが起動し、メッセージの受け入れを開始します。 キーの組み合わせCTRL+ A + D を使用して、画面セッションから切断できます。 セッションに再接続する準備ができたら、これを使用できます screen
指図:
- screen -r
Pythonを使用してDiscordボットを正常に構築しました。 アプリケーションはサーバー上で実行され、ギルドで共有されている特定のフレーズに応答します。
結論
このチュートリアルでは、Discord Guildをセットアップし、Discordボットを構築し、ボットをギルドにインストールして、Ubuntu20.04サーバーにボットをデプロイしました。 DiscordAPIの調査を始めたばかりです。 ボットは強力で拡張可能です。 他の機能については、discord.pyAPIドキュメントをご覧ください。
または、Pythonプログラミングについて詳しく知りたい場合は、チュートリアルシリーズ Python3でコーディングする方法にアクセスしてください。