17
13

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.

Discord Botを作ってみよう #01 - Hello, Pycord!

Last updated at Posted at 2022-12-03

まえがき

ひとりアドベントカレンダーという狂気の企画、2日目記事です。

はじめに

この記事(群)は、PythonとPycordを利用してDiscord Botを開発しようとする方に向けたものです。

本記事群では、以下の流れでPycordの機能を紹介していきます。

  1. #01 - Hello, Pycord!(本記事)
  2. #02 - スラッシュコマンドを使ってみよう
  3. #03 - イベントリスナを使ってみよう
  4. #04 - インタラクティブなGUIを作ってみよう
  5. #05 - Cogを導入しよう
  6. #06 - (番外編)デプロイ環境のはなし

この記事は、対象読者をPythonの記法に関する基礎知識はあるが、公式ドキュメントだけで実装できるほど慣れても居ない方としています。

もしこの記事を読んでもコードの意味がわからない場合は、基礎知識が不足している可能性があります。Paizaなどの入門サイトや技術書を参照しながら、足りない知識を補完していくことを推奨します。

  • 動作確認日: 2022/12/3
  • 各種バージョン
    • Python: 3.10.7
    • Pycord: 2.3.1

開発の前に

Botアカウントを作成する

Discord上でBotを動かすためには、Discord Developer PortalからBotアカウントを作成する必要があります。

以下の手順に従って、Botアカウントの作成を行ってください。

  1. **Discord Developer Portal**へアクセス
  2. "New Application"をクリックし、出てきたモーダルにBotアカウントの名前を入力し、Createボタンで登録する
    image.png
  3. サイドバーからBotを選択し、Add Botをクリック
    image.png
  4. 出てきた画面でReset Tokenをクリック
    image.png
  5. 表示された長い文字列(トークン)をコピーし、メモ帳などに貼り付けておく
  6. 少し下にスクロールして、Privileged Gateway Intentsの中にある3つのスイッチをすべて有効化して保存してください
    image.png

トークンとは?
トークンは、Botごとに発行される一意な文字列で、これを用いて「どのBotが起動しているのか」をDiscordに知らせる、いわばユーザIDとパスワードを合体させたようなものです。

このトークンさえわかれば、誰でも、あらゆるコードをあなたのBotとして起動させることができます。そのため、慎重に扱われなければなりません。

例えば、GithubのPublicリポジトリに公開するとか、Discordサーバーに貼っておくとかはすべきではありません。

Privileged Gateway Intents(特権インテント)とは?
DiscordがBotの安全性を担保するために設けているものです。
いくつかのデータを読み取るために、Developer Portalの中で個別で有効化し、更にプログラムの中でも設定を行わなければなりません。
今回有効化した3つのIntentsは、それぞれ次のようなデータを読み取るための設定です。

  • PRESENCE INTENT : サーバー内のユーザーのステータスを確認する
  • SERVER MEMBERS INTENT : サーバー内のメンバーの増減やニックネーム・ロールの変更などを取得する
  • MESSAGE CONTENT INTENT : サーバー内で送信されたメッセージを取得する

Developer Portalにも書いてあるとおり、100以上のサーバーで利用されているBotは、この特権インテントを利用するためにDiscordによる許可が必要です。
逆に言えば、100未満のサーバーで利用するのであれば、これらを気にする必要はありません。全てONにしておいて大丈夫です。

Botをサーバーに参加させる

ここまでで、BotをDiscordに登録することができました。
しかし、それだけではBotを動かすことはできません。サーバーに参加させて初めて利用することができます。

以下の手順に従って、Botをサーバーに参加させてみましょう。

  1. Developer PortalのサイドバーからOAuth2 -> URL Generatorを選択image.png
  2. SCOPESの中から以下のものにチェックを入れるimage.png
    1. applications.commands
      • あとで利用する「スラッシュコマンド」に必要です
    2. bot
      • botとして動作させるために必要です
      • BOT PERMISSIONSは、サーバーに参加した時に最初からもっている権限を設定することができます。
        • 参加後は、通常のロール編集を行えばBotの権限を変更できます。
        • 今回は何も設定しなくて大丈夫です。
  3. 下部のGENERATED URLの内容をコピーし、ブラウザで開く
  4. 参加させたいサーバーを選んでAuthorizeするimage.png

Botを動かしてみよう

ここから、Pythonで実際にBotのプログラムを書いていきます。

最初は、簡単なテンプレートを使って動かしていきましょう。

  • Pythonの環境構築ができていることが前提となります
    • まだの方はこちらも参照してください。
  • 開発に際しては、venvなどを利用してpipでパッケージを導入する先を独立させると良いでしょう。

pycordのインストール

pip install py-cord

main.pyの作成

プロジェクトのディレクトリにmain.pyを作成し、以下のコードをコピペしてください。

# Pycordを読み込む
import discord

# アクセストークンを設定
TOKEN = "YOUR_ACCESS_TOKEN"  # 自分のアクセストークンと置換してください

# Botの大元となるオブジェクトを生成する
bot = discord.Bot(
        intents=discord.Intents.all(),  # 全てのインテンツを利用できるようにする
        activity=discord.Game("Discord Bot入門"),  # "〇〇をプレイ中"の"〇〇"を設定,
)


# 起動時に自動的に動くメソッド
# #03で詳しく説明します
@bot.event
async def on_ready():
    # 起動すると、実行したターミナルに"Hello!"と表示される
    print("Hello!")


# Botが見える場所でメッセージが投稿された時に動くメソッド
@bot.event
async def on_message(message: discord.Message):
    # メッセージ送信者がBot(自分を含む)だった場合は無視する
    if message.author.bot:
        return

    # メッセージが"hello"だった場合、"Hello!"と返信する
    if message.content == 'hello':
        await message.reply("Hello!")


# Botを起動
bot.run(TOKEN)

実行

それでは、main.pyを実行させてみましょう。

ターミナルにHello!と表示されたら成功です!

そのまま、先程Botを参加させたサーバーでhelloと発言してみましょう。
画像のように、Botから返信が来ると思います。来ない場合は権限を見直してみましょう。
Botがそのチャンネルを閲覧でき、かつメッセージを送信できる必要があります。
image.png

今日はここまで!

このシリーズの他の記事

17
13
2

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
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?