discord.pyを使ってDiscordのBotを作成して簡単な応答をさせてみた
最近のゲーム関係コミュニティでよく使われているDiscord。PS5及びPS4に近日連携されるというニュースも出ていて、マルチプレイをする上では欠かせないケースもでてきそうです。私個人もかつてはプライベートにおいてもSlackを使っていましたが、現在はDiscord一色となっています。
主に以下のタイトルでの情報収集で用いており、海外産のタイトルやMMORPGを遊び始めたり、運営がDiscordを推奨している場合に参加チャンネルが更に増える感じです。
そんなDiscordにもAPIが存在しますが、これまで触っていませんでした。始めるまでに面倒なイメージが強かったためです。が、効率を求めると避けられない点もあり、すこしづつながら触ってみることにしました。とりあえずはPython製のAPIラッパー discord.py を用います。
Discordアカウントの作成
Botの作成にはDiscordアカウントが必要です。アカウントがなければ登録しましょう。
Bot動作確認用サーバの作成
手軽く確認するためサーバを作成しておきます。Discordログイン後に画面左下からサーバを作成します。
「オリジナルの作成」にて「自分と友達のため」を選択します。サーバ名に適当な名前を入れて「新規作成」をクリックします。
Botの作成
Discordアカウント作成後、Developer Portalにアクセスします。右側の「New Application」からアプリケーションとしてBotを作成します。Bot名だけ指定が必要です。
Bot作成後、左側メニューの「Bot」から「Build A Bot」を選択して実際にBotとしてチャンネル上で機能させますが、名前が被っていると追加できません。
以下のエラーが出た場合はGeneral Informationからリネーム後に再度操作します。
追加完了できたら、左側「Bot」からコーディングに利用するTokenを取得します。「Copy」をクリックするだけです。
念の為「PUBLIC BOT」をOFFしておきます。
次に権限付与を行います。左側「OAuth2」の「URL Generator」を選択します。
「Scope」のうち「Bot」を選択し、「BOT PERMISSIONS」については「Send Messages」と「Read Messages/View Channels」にチェックを入れておきます。
最後に「Generated URL」を「Copy」してアクセスしてみましょう。Botの動作確認用チャンネルを指定します。
discord.pyのセットアップ
poetryを併用してみます。
mkdir discord cd discord/ poetry init poetry add discord.py
以下、実際のログ。
% mkdir discord % cd discord/ % poetry init This command will guide you through creating your pyproject.toml config. Package name [discord]: Version [0.1.0]: Description []: Author [xxxx <xxxxxx@example.com>, n to skip]: License []: Compatible Python versions [^3.9]: Would you like to define your main dependencies interactively? (yes/no) [yes] You can specify a package in the following forms: - A single name (requests) - A name and a constraint (requests@^2.23.0) - A git url (git+https://github.com/python-poetry/poetry.git) - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop) - A file path (../my-package/my-package.whl) - A directory (../my-package/) - A url (https://example.com/packages/my-package-0.1.0.tar.gz) Search for package to add (or leave blank to continue): Would you like to define your development dependencies interactively? (yes/no) [yes] Search for package to add (or leave blank to continue): Generated file [tool.poetry] name = "discord" version = "0.1.0" description = "" authors = ["xxxx <xxxxxx@example.com>"] [tool.poetry.dependencies] python = "^3.9" [tool.poetry.dev-dependencies] [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" Do you confirm generation? (yes/no) [yes] % poetry add discord.py Creating virtualenv discord in /path/to/discord/.venv Using version ^1.7.3 for discord.py Updating dependencies Resolving dependencies... (7.2s) Writing lock file Package operations: 9 installs, 0 updates, 0 removals • Installing idna (3.3) • Installing multidict (5.2.0) • Installing async-timeout (3.0.1) • Installing attrs (21.4.0) • Installing chardet (4.0.0) • Installing typing-extensions (4.0.1) • Installing yarl (1.7.2) • Installing aiohttp (3.7.4.post0) • Installing discord.py (1.7.3)
DMにレスポンスさせてみる
まずはシンプルな動作になりますが、DMの特定文言に対してレスさせてみます。以下のコードにDeveloper Portalで取得したTokenを設定します。
import discord client = discord.Client() TOKEN = '' @client.event async def on_ready(): print(f'We have logged in as {client.user}') @client.event async def on_message(message): if message.author == client.user: return if message.content.startswith('$hello'): await message.channel.send('Hello!') client.run(TOKEN)
poetry run python3 bot.py
これでBotの動作が確認できました。
あとがき
Bot起動までの手順はやってみるとシンプルですが、何もわからない状態では戸惑うかもしれません。
Botを継続運用する場合はプロセスの常駐が必須となってきます。まずはローカル環境で必要に応じて動かすところから始めてみましょう。