今までDiscord.pyを使ってBotを作成してきたが、今後Updateがされないと発表されていることからPycordに乗り換えて、比較的SlashCommandも対応しやすいことが確認できたので共有したい。
現時点でdiscord.pyの開発はされているため、選択肢としてpy-cordを選択するのは良いですが、日本語のドキュメントも充実しているdiscord.pyのほうが良いかもしれません。
私個人は現在(2023/01/26)でもpy-cordで開発しています。(結構構文違うのでマイグレーションメンドイ)
初心者でも0から構築できるように説明していきますのでよろしくおねがいします。
まず準備から
以下のインストールをしていきます
- Python 3.10
- Visual Studio Code
Pythonの準備
Python今回はPythonを使ってDiscord向けのコマンドを作成するのでインストールしていきます。
下の記事を参考にしながらインストールしていけばOKですが、バージョンが少し古いので現在(2022/03/26)の最新バージョンの3.10をインストールするのをオススメします。
2023/01/26時点でpy-cordがPython3.11で動作しないなどサポートされていない事確認しましたので3.10が現時点でおそらく一番無難です。
コマンドプロンプトはWindowsボタンを押してcmd
と打つとすぐに開くことができます
Visual Studio Codeの準備
Visual Studio Codeでコーディングをする前提なので以下の記事などを参考にしながらインストールします。
個人的には以下のチェックはいれる事を推奨しています
- エクスプローラーのファイルコンテキストメニューに[Code で開く] アクションを追加する
- エクスプローラーのディレクトリコンテキストメニューに[Code で開く] アクションを追加する
上記のチュートリアル通りに勧めばPythonの実行までが確認できると思います。
Discord BOTの準備
まずDiscord Developer Portalでログインします
ログインすると右上にNewApplicationというボタンがあるのでそれをクリックし、
左のメニューバーにあるBotをクリックし、Add Botをクリックします
すると以下のような画面が出てきますので、Reset Tokenを押してトークンを取得します
一度BOTを入れておくフォルダを作成しておき、適当な名前のテキストファイルに
以下のようにTOKEN =
という文字を頭に付けて、""
で囲った状態で保存します
保存し終わったらサーバーに対してBOTを追加していきます。
まず、左のメニューからOAuth2
を選択し、URL Generator
を選択、
チェックボックスのbot
とapplications.commands
を有効にしておきます。
また、下にスクロールするとBOT PERMISSONSというものがあるので、今回はSend Messages
のみ選択してください。
(Administratorを選択すると全ての権限が付与されるのですが、悪意のあるユーザーにTOKEN
を知られた際にサーバーを荒らされるなどのリスクがあります)
サーバー管理者の場合は以下の通りに実行します
サーバーの管理者でない場合は以下スキップしてください
ブラウザのアドレスバーにURLを入力すると以下の画面になるので、
自分の呼び込みたいサーバーを選択してはい
を押します。
ここでAdministratorなどを選択していた場合は管理者権限を与える事になりますので、今回はメッセージを送信のみがチェックされていることを確認してください。
あなたが人間かをチェックします
すると以下のように新しいBotが追加されるのが確認できると思います。
サーバー管理者ではない場合
サーバー管理者ではない場合はセルフで追加ができません。
なので、サーバー管理者に入れて貰う必要があります。
先程コピーしたURLをDiscordに貼り付けしてもらうとサーバー管理者がBOTを導入することができます。
このときに管理者権限が無いことを確認してもらう事が重要なので、その旨を伝えていただけると良いと思います。
個人的には上記で示した権限であれば全然問題ないレベルだと思っています
(最悪連投荒らし的に使われたりする可能性は十分にありますが)
もう少し準備があります。
BOTのTOKENをテキストファイルに保存した際に新しいフォルダを作成したものがあると思いますので、それを右クリックしCode で開く
を選択しVisual Studio Codeを起動します。
インストール時にチェックを入れ忘れていた場合はこの項目は出てきません。
Visual Studio Codeを再度インストールしてチェックを付けておくと使いやすいです。
するとこのような画面で起動すると思いますので、
下のターミナルの部分のPS H:\discordbot>
となっている部分をクリックしてカーソルをもっていきます。
この部分はコマンドプロンプトとほぼ同等の機能が提供されているので、ここにコマンドを打ち込むことでプログラムの実行などが可能になっています。
ここに今回使うライブラリのインストールコマンドを入力します。
py -3 -m pip install py-cord
py -3 -m pip install python-dotenv
今回紹介するSlashCommandはプレリリース版が必要なため --pre の引数が追加されます。
現時点では正式にSlashCommandが利用できるので --preは必要ありません
以下のようにSuccessfully
と出ればOKです(現在(2023/01/26)はバージョン2.3.xが最新となります)
Successfully installed py-cord-2.0.0b5
Successfully installed python-dotenv-0.20.0
これで準備万端です!
ライブラリというのは基本的にはプログラムを簡略化して書くことができるようにいろんな人が作ってくれてるものです。
これがないとプログラムを作るのは至難の業となりますので、製作者やコントリビュートしてくれる方に感謝しながら使いましょう
やっとBOTのが作れる!
Visual Studio Codeで適当な名前のpythonファイルを作成しましょう、
こちらではbot.py
としましたが.py
拡張子がついていれば基本的にどんな名前でも大丈夫なはずです。
とりあえず最初はコピペでOKです!
import discord
from discord import Option
import os
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv("TOKEN")
bot = discord.Bot()
GUILD_IDS = [0000000000000] # ← BOTのいるサーバーのIDを入れます
@bot.event
async def on_ready():
print(f"Bot名:{bot.user} On ready!!")
@bot.slash_command(description="あなたの名前か入力した名前に挨拶します", guild_ids=GUILD_IDS)
async def hello(
ctx: discord.ApplicationContext,
name: Option(str, required=False, description="名前を入力してね", )
):
if not name:
name = ctx.author
await ctx.respond(f"こんにちは! {name} さん!")
bot.run(TOKEN)
SlashCommandではサーバーID(Guild ID)が必要になるためBOTのいるサーバーを右クリックしてIDをコピーしてきます
先程のソースの以下の部分を変更します
GUILD_IDS = [0000000000000] # ←ここの000...と置き換えます
基本的な処理部分は完成です!
dotenvを使えるようにします
ソース上の以下命令は「.env
ファイルからTOKENを取得してきなさい。」という命令なので、.env
ファイルがない場合は機能しません。
import os
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv("TOKEN")
準備でメモしておいたTOKENが書いてあるテキストファイルは.env
の書式で書いたものになるので、
ファイル名を変えることで対応します。
ファイルを選択した状態でF2
キーを押すとファイル名の変更ができるので.env
としてファイル名を変更します。
すると歯車状のアイコンに変化して文字に色がついてくれるので間違いがないことが確認できます。
あとは実行するだけです!
ターミナルに以下のコマンドを入れて実行します
bot.py
の部分はあなたの作ったPythonファイル名を入力します
py -3 bot.py
すると、以下のような実行結果が出て準備が完了していることがわかります
Bot名:New Bot#2308 On ready!!
この状態で/hello
と入力するとあなたの入力したBOTが起動している事がわかります
そのままエンターを押すとコマンドを呼び出した人が表示されていることがわかります
また今回は任意引数としてname
という値を一緒に受け取ることができるので
任意の名前を呼ぶことができるようになっています!
ここまで読んでくれた方に感謝
けっこう長い説明になってしまいましたが、読んでくれてありがとうございます!
詳しいPycordの仕様や、Pythonの書き方などは別途説明できる機会があれば説明しようと思いますが、今回はここまでです。
Pycordの詳しいドキュメントは英語で書いているので読みにくいかもしれませんが、詳しくはそちらを見ると何ができるか?などが書かれていますので、こんなものが作りたいなどあればWord検索などを駆使して読んでみると良いと思います!