8
17

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 3 years have passed since last update.

discord.py入門

Last updated at Posted at 2021-01-08

雛形

雛形とはプログラムコードを書く上で型となる部分のことを指します

discord.pyの雛形

import discord
token = "" #ここにトークンを代入
client = discord.Client()

#Botの準備ができた時の処理
@client.event
async def on_ready():
    print("ready")

#ここから下にその他の処理を書く↓


# —-ここまで—-


client.run(token)

#イベントハンドラ
イベントハンドラとはdiscord上発生するイベントごとに処理を分けるための関数を指します。
677FBF82-E001-466D-AAE7-4FF69604AD33.jpeg

イベントハンドラの記述方法は以下の通りです。

@client.event
async def イベントハンドラ名(引数):
    処理

主なイベントハンドラ

イベントハンドラ名 引数 説明
on_message message メッセージが送信された時に発生するイベント
add_reaction reaction,user メッセージにリアクションが付与された時に発生する
on_member_join member メンバーがサーバーに参加した時に発生する。

注意
同じイベントハンドラを複数登録すると、動かなくなります。

ex)

#ダメな例
@client.event
async def on_message(message):
    処理

@client.event
async def on_message(message):
    処理

イベントハンドラのリファレンス
discord.py API refarence

#discord.pyの型

discord.pyにはstrintのようにdiscord.py独自の型があります

主な型

discord.Message

メッセージの情報がまとまっている、
主な属性

属性 説明 返り値の型
content メッセージの内容を返します str
author メッセージの送信者を返します discord.User
channel メッセージを送信したチャンネルを返します。 discord.TextChannel
id メッセージのIDを返します。 int
guild メッセージが送信されたサーバーを返します discord.Guild

Reference

discord.TextChannel

テキストチャンネルの情報がまとまっています
主な属性

属性 説明 返り値の型
name チャンネル名を返します。 str
id チャンネルのIDを返します。 int
category チャンネルの存在するカテゴリを返します discord.CtegoryChannel
guild チャンネルが存在するサーバーを返します。 discord.Guild
members チャンネルのメンバーリストを返します。 list[discrd.Members]

Reference

###discord.Role
ロールの情報がまとまっています。

主な属性

属性 説明 返り値の型
name ロール名を返します str
id ロールのIDを返します int
members ロールが付与されているメンバーリストを返します list[discord.Member]
color ロールの色を返します discord.Colour
permissions ロールの権限を返します。 discord.Permissions

Reference

discord.Member

メンバーの情報がまとまっています。

属性 説明 返り値の型
name ユーザーの名前を返します str
id ユーザーのIDを返します int
avatar_url ユーザーのアバターのURLを返します discord.Asset
roles ユーザーが所持しているロールリストを返します list[discord.Role]
guild メンバーが存在してるサーバーを返します discord.Guild
status メンバーのステータスを返します。 discord.Status

Reference

#discordを操作
それぞれの型には属性(Attribute)だけではなく、メッセージを送ったり、ロール付与を行うためのメソッドがあります。
以下からはメソッドの説明と、よく使うメソッドを挙げていきます。

awaitについて

discord.TextChannel の型にはメッセージを送信するメソッドであるsend()があります。
また、discord.Guild の型にはチャンネルを取得するメソッドであるget_channel(チャンネルのID)があります。

一応それぞれのメソッドの概要をまとめておきます

メソッドを持つ型 メソッド メソッドの引数 メソッドの返り値
discord.TextChannel send content(str)... discord.Message
discord.Guild get_channel チャンネルのID(int) abc.GuildChannel
@client.event
async def on_message(message):
    send_message = "メッセージを受け取りました。" #メッセージ内容
    guild = message.guild #メッセージが送信されたサーバー
    channel = guild.get_channel(00000000000) #チャンネルを取得
    await send_channel.send(send_message)#メッセージを送信

6行目で使用した send() メソッドにはawaitがついています。
一方5行目で使用したget_channelメソッドにはawaitはついていません。

ここからはこのawaitについて解説していきますが、
難しければ、多少語弊はあるかもしれないですが、discord上で目に見える形で操作をする
ex( メッセージを送信,リアクションをつける,チャンネルを作る

ものにはawaitが必要であると思ってください。

逆に、チャンネルを取得したり、ユーザーがフレンドか確認するといった,
情報を取得するような処理をするmethodにはawaitがつかないと解釈してください

##awaitの解説

awaitは実行する関数がコルーチンである際に先頭につけるものです
これをasync/await構文と呼びます。

async が付く関数はコルーチン関数と呼ばれます、

コルーチン関数とは何か?

通常の関数は同期処理として実行されます。
つまり、関数Aを実行中に、関数Bを実行した場合、関数Aの処理は途中で中断され、関数Bの処理が始まります。関数Bが終了次第、関数Aの処理は再開します。
D06E1A4F-22BD-47E9-A2D7-F7F76502950A.jpeg

ですが、コルーチン関数は非同期処理として実行され、
別の処理と並行してタスクを実行できます。
CFD37752-AC43-4E8C-9DA5-9001EF27737F.jpeg

import time

def wait_A():
    print("処理Aを開始")
    time.sleep(1)
    print("処理Aを終了")

def wait_B():
    print("処理Bを開始")
    time.sleep(2)
    print("処理Bを終了")

def wait_C():
    print("処理Cを開始")
    time.sleep(3)
    print("処理Cを終了")

if __name__ == "__main__":
    wait_A()
    wait_B()
    wait_C()

こちらのプログラムを実行します。

~出力~
処理Aを開始
処理Aを終了
処理Bを開始
処理Bを終了
処理Cを開始
処理Cを終了

となります。

これをコルーチン関数として定義します

import asyncio
async def wait_A():
    print("処理Aを開始")
    asyncio.sleep(3)
    print("処理Aを終了")

async def wait_B():
    print("処理Bを開始")
    asyncio.sleep(2)
    print("処理Bを終了")

async def wait_C():
    print("処理Cを開始")
    asyncio.sleep(1)
    print("処理Cを終了")

if __name__ == "__main__":
    await wait_A()
    await wait_B()
    await wait_C()

出力
処理Aを開始
処理Bを開始
処理Cを開始
処理Cを終了
処理Bを終了
処理Aを終了

となります。

複数の処理を並行して実行していることがわかるでしょう。

つまり、discord.pyのモジュールにおいて、
型のメソッドがコルーチン関数として定義されていた場合にawaitをつける必要があります。

型のメソッドが、コルーチン関数として定義されているか、されていないかの確認をするにはdiscord.pyのドキュメントを確認する必要があり、
BD2BC61E-B3D0-4CEC-A665-494593BE6A3B.png

各型の説明の先頭にMethodの項目があります。
その一覧の先頭にasyncがついているものはコルーチン関数メソッドです。

色々なメッセージを送る

##埋め込みメッセージ

@client.event
async def on_message(message):
    if message.content == "/埋め込み":
        send_embed = discord.Embed(title="埋め込みのタイトル",description="埋め込みの説明",colour=discord.Colour.red())
        send_embed.add_field(name="フィールドの名前",value="フィールドの説明書き")
        await message.channel.send(embed=embed)

discord.Embedはdiscord.pyのデータクラスです。
4行目でデータクラスのインスタンス化を行い、その際に、タイトル,説明,色を指定できます。
add_fieldはEmbedデータクラスのメソッドでコルーチン関数ではありません。
add_fieldにはnamevalueの引数の他に,inlineという引数があり、これにはbool値を指定できます。inlineのデフォルト値はTrueで、
他のフィールドと横に並列して表示させます。
inline=Falseにした場合
フィールドを縦に表示させます。

###画像を送信する。

await message.channel.send(File=discord.File("sample.png"))

sendの引数にはFileを指定することができ、
Fileの引数はdiscord.Fileのデータクラスを指定します。
Fileの引数をインスタンス化する際に直接,ファイルのパスを文字列型で指定することで画像を送信することができます。

1/8更新済み

8
17
1

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
8
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?