
discord.pyでBotを作ったのでわかりやすく解説しようと思う。 [Part.1]
こんにちは、あまみです。
最近アイドルマスターシャイニーカラーズのアイドルである白瀬咲耶さんのdiscordファンサーバの運営を引き継ぎましたので、それに合わせてBotを作ってしまおうと思いここ1ヶ月頑張って基礎部分は出来たかなと思ったので簡単なところの解説をしようと思いこうして書いている次第です。
#1 環境とファイル構成
筆者の環境
Mac OS Monterey
python-3.8.5
discord-buttons-plugin (最新)
discord.py(最新)
dislash.py(最新)
筆者の環境(ファイル構成)
この記事 を参考にしました。(※読んでね!)
ファイルのバージョン管理はGithubに、サーバはherokuというところにしました。

discord.py
>メインのファイル、ここしかいじってない。img
>画像フォルダ。htmlとかでも似たような事する。LICENSE,Procfile
>触ってないです。README.md
>Githubに上げると貰うやつ。private(非公開)なのでいらない。requirements.txt
>環境整備に使う。 pip -r requirements.txtすると中に書いてあるパッケージとかがアップデートされたり固定のバージョンになったりする。後述runtime.txt
>herokuがPythonをどのバージョンで実行するかを書く。後述
requirements.txt
(#はコメント行)
###Discord
discord-buttons-plugin
discord.py
dislash.py
###Other
aiohttp
async-generator
async-timeout
attrs
certifi
cffi
chardet
charset-normalizer
chromedriver
chromedriver-binary
colorama
configparser
crayons
cryptography
h11
idna
multidict
outcome
pycparser
PyNaCl
pyOpenSSL
PySocks
requests
selenium
six
sniffio
sortedcontainers
trio
trio-websocket
typing_extensions
urllib3
webdriver-manager
wsproto
yarl
runtime.txt
python-3.8.5
requirements.txt 書きすぎじゃね??私もそう思う、でもローカルの環境とheroku側の環境同じにしたかったからしょうがない。
#2 ローカルで起動、返事まで
さっきの記事 の初期設定の通りやると
Discord Developer PortalでBot作る。
サーバにBotを登録する。
アクセストークンをメモする。
までは出来たと思います。
このあとはコードを少し書くところまでやりましょう。
discord.py
import discord
import traceback
from discord.ext import commands
from discord_buttons_plugin import *
from discord.utils import get
from dislash import InteractionClient, SelectMenu, SelectOption
from os import getenv
# Botの起動とDiscordサーバーへの接続
token = getenv('DISCORD_BOT_TOKEN') #herokuに収納するよ。
bot = commands.Bot(
command_prefix = "!",
case_insensitive=True, #コマンドの大文字小文字を無視する(True)
help_command = None #標準のhelpコマンドを無効化する(None)
)
@bot.command()
async def nya(message): # 俗に言うHello World構文
""" テスト:nyaa """
await message.send('にゃー')
@bot.command()
async def hello(message):
""" 挨拶を返す """
if message.author.bot: #botからだったら終了。
return
else:
reply = f'こんにちは、{message.author.mention}プロデューサー。'
await message.channel.send(reply)
bot.run(token)
いっぱい書いてるなかで基礎中の基礎はここです。
上のimportとかfromとかは同じでも良いと思います。
解説
async def hello(message)を例にあげて行きましょう。
#上と同じだよ。
@bot.command()
async def hello(message):
""" 挨拶を返す """
if message.author.bot: #botからだったら終了。
return
else:
reply = f'こんにちは、{message.author.mention}プロデューサー。'
await message.channel.send(reply)
詳しくは調べてほしいですが、VCに入ってきた時やサーバに入った時、コマンドに無いものを打った時に発動する @bot.eventと、
コマンドそのものを打った時に発動する@bot.command()の2つがあります。
基本新しくコマンド作るよって時は後者の方なので軽く覚えておいてください。
ifの方では送ってきたメッセージがbotから発せられたものなのか、ユーザから発せられたものなのかを仕分けてます。botから来るとモノによっては無限ループしちゃったりするかもって感じで怖いのできちんと書いてます。()
replyという変数にメッセージをいれます。{message.author.mention}と書くと
!hello
こんにちは @あまみ プロデューサー。
って感じで返ってきます。
最後にawait message.channel.send(reply)で
『メッセージを送ってきたチャンネルIDにreplyの内容を送る』ということをします。
ここまで書けたらGithubに送って、herokuにdeployします。
詳しくはここの記事
成功例

#Support 出来なかったら?分からなかったら?
Twitter: あまみ / AMAMI
discord: あまみ / AMAMI#0398
に出来ないところとかをスクショしたりして送ってくれれば答えます。
次回を待て。
いいなと思ったら応援しよう!
