์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
์ตœ์‹  ๋ฒ„์ „
1.6
ํ•„์š” ํŒŒ์ด์ฌ ๋ฒ„์ „
3.5.3 ์ด์ƒ 3.9 ๋ฏธ๋งŒ

1. ๊ฐœ์š”2. ์ œ์ž‘ ์‹œ ์œ ์˜ ๋ฐ ์ฃผ์˜ํ•ด์•ผํ•  ์ 
2.1. ์ œ์ž‘ ์ „2.2. discord์™€ discord.ext
2.2.1. 1.0.0 ๋ฒ„์ „ ๋ฏธ๋งŒ๊ณผ ์ด์ƒ๊ณผ์˜ ๋ช…๋ น์–ด ํ˜ธํ™˜
2.3. ๊ฐœ๋ฐœ ์ค‘ ๋ฐ ์œ ์ง€
3. ์—…๋ฐ์ดํŠธ4. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ˆ์ œ
4.1. discord.ext.commands
4.1.1. ๊ธฐ๋ณธ ๋Œ€ํ™” ๋ฐ ์ถœ๋ ฅ
4.2. discord.Client()
4.2.1. ๊ธฐ๋ณธ ๋Œ€ํ™” ๋ฐ ์ถœ๋ ฅ
5. discord.Client()์˜ prefix

1. ๊ฐœ์š”[ํŽธ์ง‘]

discord.py๋Š” ํŒŒ์ด์ฌ์šฉ ๋””์Šค์ฝ”๋“œ ๋ด‡ API์ด๋‹ค. ๊ฐœ๋ฐœ ์ง„์ž…์žฅ๋ฒฝ์ด ๋‚ฎ์€ discord.py๋ฅผ ์ž…๋ฌธ์œผ๋กœ์„œ ๋งŽ์ด ์„ ํƒํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ด์ง€ ๊ธฐ๋ณธ์ ์ธ ํŒŒ์ด์ฌ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ผญ ๊ธฐ์ดˆ์ ์ธ ๋ฌธ๋ฒ•์„ ์ตํžˆ๊ณ  ๊ณต๋ถ€ํ•˜์ž.

2. ์ œ์ž‘ ์‹œ ์œ ์˜ ๋ฐ ์ฃผ์˜ํ•ด์•ผํ•  ์ [ํŽธ์ง‘]

2.1. ์ œ์ž‘ ์ „[ํŽธ์ง‘]

๋‹น์—ฐํ•˜์ง€๋งŒ ๋จผ์ € Python์„ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. http://python.org์—์„œ ๋ณธ์ธ์˜ OS์— ๋งž๊ฒŒ ์„ค์น˜ํ•˜์ž. ํŽธ์ง‘๊ธฐ๋Š” IDLE์ด๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์•Œ์•„์„œ ๊น”๋ฆฌ๋‹ˆ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. [1]

ํŒŒ์ด์ฌ ๋ฒ„์ „์€ 3.5.3 ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฉฐ, ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ ํŒŒ์ด์ฌ ๋ฒ„์ „์€ 3.6 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ์ด์ „ python 2์—์„œ ์ง€์›ํ•˜๋˜ ํฌ๋งทํŒ… ๋ฐฉ์‹์ธ %-formatting์™€ str.format() ๋ฐฉ์‹ ์—ญ์‹œ python3์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ด๋“ค์˜ ๋ฌธ์ œ์ ์€ ์ž…๋ ฅํ•  ๊ฐ’์ด ๋งŽ์•„์งˆ ์ˆ˜๋ก ๋งค์šฐ ๊ธธ์–ด์ง€๋ฉฐ ์ง€์ €๋ถ„ํ•ด ๋ณด์ด๋ฉฐ ์žฆ์€ ์‹ค์ˆ˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ ๋ง๊ณ ๋„ ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์ธ ํ™œ์šฉ๋ฒ•์„ ๋ณด์ž.

๊ณตํ†ต์  ๋ณ€์ˆ˜:
discord_py="discord.py"
discord="discord"
api="API"
namuwiki="๋‚˜๋ฌด์œ„ํ‚ค"

์˜ˆ์‹œ(%-formatting):
>>> print("%s๋Š” %s์˜ %s์ž…๋‹ˆ๋‹ค. %s ๋ฌธ์„œ๋Š” %s์—์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.)" % (discord_py, discord, api, discord_py, namuwiki)
'discord.py๋Š” discord์˜ API์ž…๋‹ˆ๋‹ค. discord.py ๋ฌธ์„œ๋Š” ๋‚˜๋ฌด์œ„ํ‚ค์—์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.'

์˜ˆ์‹œ(str.format()):
>>> print("{}๋Š” {}์˜ {}์ž…๋‹ˆ๋‹ค. {} ๋ฌธ์„œ๋Š” {}์—์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.)".format(discord_py, discord, api, discord_py, namuwiki)
'discord.py๋Š” discord์˜ API์ž…๋‹ˆ๋‹ค. discord.py ๋ฌธ์„œ๋Š” ๋‚˜๋ฌด์œ„ํ‚ค์—์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.'

3.6 ์ด์ƒ์„ ์ถ”์ฒœํ•˜๋Š” ์ด์œ ๋Š” 3.6 ์ด์ƒ๋ถ€ํ„ด f-string๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์˜ˆ์‹œ(f-string):
>>> print(f"{discord_py}๋Š” {discord}์˜ {api}์ž…๋‹ˆ๋‹ค. {discord_py} ๋ฌธ์„œ๋Š” {namuwiki}์—์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.")
'discord.py๋Š” discord์˜ API์ž…๋‹ˆ๋‹ค. discord.py ๋ฌธ์„œ๋Š” ๋‚˜๋ฌด์œ„ํ‚ค์—์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.'

๋ณผ ์ˆ˜ ์žˆ๋“ฏ ๋งค์šฐ ๊น”๋”ํ•˜๋‹ค.

ํŒŒ์ด์ฌ ๋ฒ„์ „์„ ๋งž์ถ”์—ˆ๋‹ค๋ฉด, ์ด๋ฒˆ์—” discord.py์˜ ๋ฒ„์ „์„ ๋งž์ถœ ์ฐจ๋ก€๋‹ค. ์ž‘์„ฑ ์‹œ์  ๊ธฐ์ค€ discord.py๋Š” 1.3.3์ด ์ตœ์‹  ๋ฒ„์ „์ด์ง€๋งŒ, 1.0.0์ด ์—…๋ฐ์ดํŠธ๋œ 19๋…„ 4์›”๊ฒฝ ์ „๊นŒ์ง€๋Š” 17๋…„ 10์›”๊ฒฝ์— ์—…๋ฐ์ดํŠธ๋œ 0.16.12 ๋ฒ„์ „์„ ๋Œ€์ฒด๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ต์ˆ™์น˜์•Š์€ ์ž…๋ฌธ ๋ฐ ์ดˆ๋ณด์ž๋Š” ๊ธฐ๋ณธ ์ง€์‹์„ ์–ป๊ธฐ ์œ„ํ•ด ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑ๋œ discord.py ๊ด€๋ จ ์ž๋ฃŒ๋“ค์„ ์ธํ„ฐ๋„ท์—์„œ ์ฐพ์•„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ธํ„ฐ๋„ท์— ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑ๋œ discord.py ๊ธ€๋“ค์€ 0.16.x ๋ฒ„์ „์ด ๋Œ€๋ถ€๋ถ„์ด๋‹ค. ์ด๊ฒŒ ์™œ ์œ ์˜ํ•ด์•ผ ํ•  ์ ์ด๋ƒ๋ฉด, 0.16.x ๋ฒ„์ „๊ณผ 1.0.0 ์ด์ƒ์˜ ๋ฒ„์ „์€ ์ƒ๋‹น ๋ถ€๋ถ„ ํ˜ธํ™˜์ด ์•ˆ๋˜์–ด 0.16.x๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋“ค์€ 1.0.0 ์ด์ƒ์—์„œ ๊ตฌ๋™์ด ์–ด๋ ต๋‹ค. ์ด๋กœ์ธํ•ด ๋งŒ์•ฝ 1.0.0 ๋ฏธ๋งŒ์œผ๋กœ ์ž‘์„ฑ๋œ ๊ธ€๋“ค์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, pip๋ฅผ ์ด์šฉํ•ด pip install discord.py==0.16.12[2]๋ฅผ ์ž…๋ ฅํ•˜๋ฉด == ๋’ค ๋ฒ„์ „์œผ๋กœ ๋‹ค์šด๋œ๋‹ค. ๋งŒ์•ฝ ๋ณธ์ธ์ด ์˜๋ฌธ ๋“ฑ์œผ๋กœ ์ž‘์„ฑ๋œ ํ•ด์™ธ ๊ธ€๋“ค์„ ์ฐพ์•„ ์ฝ์„ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ธฐ๋ณธ์ ์ธ ์ง€์‹์ด ์žˆ๋‹ค๋ฉด 1.0.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.[3]

discord.py ๋น„๊ณต์‹ ํ•œ๊ตญ์–ด ๋ฌธ์„œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.
๋ฐ”๋กœ๊ฐ€๊ธฐ

2.2. discord์™€ discord.ext[ํŽธ์ง‘]

์œ„์— ์ ํ˜€์žˆ๋“ฏ, ๊ตญ๋‚ด ์ž๋ฃŒ๋“ค์—์„  ๋Œ€๋ถ€๋ถ„ 1.0.0 ๋ฏธ๋งŒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. discord.ext๋Š” 1.0.0์— ์ถ”๊ฐ€๋œ ํ•จ์ˆ˜๋“ค ํด๋”๋กœ, 1.0.0 ๋ฏธ๋งŒ์—” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ํ•œ๊ตญ ์ž๋ฃŒ ๋‹ค์ˆ˜์—์„  ๊ตฌ๋ฒ„์ „ ๋ฐฉ์‹์ธ discord.Client()๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ•ด์™ธ์—” ext ์•ˆ์— ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ์‹์ธ bot์œผ๋กœ ์ž‘์„ฑ๋œ ๋ด‡์˜ ์ž๋ฃŒ๋“ค์ด ์ž‘์„ฑ๋˜์–ด๊ฐ€๊ณ ์žˆ์œผ๋ฉฐ, ์ด๋ฏธ ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค.

Client() ์˜ˆ์ œ:
import discord

client = discord.Client()

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.event
async def on_message(message):
    if message.content.startswith('!ping'):
        await message.channel.send('pong')

client.run('token')


์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์ฝ”๋“œ๋Ÿ‰์ด ๋งŽ์•„์งˆ ์ˆ˜๋ก ์ง€์ €๋ถ„ํ•ด์ง€๊ณ  ์„ธ๋ถ„ ๋ฐ ์ฒด๊ณ„ํ™”๊ฐ€ ์–ด๋ ต๋‹ค. ์ด๋Ÿฌํ•œ ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๋œ๊ฒŒ discord.ext ํด๋” ๋‚ด์— ์žˆ๋Š” discord.ext.commands.Bot ๊ฐ์ฒด ๋ฐฉ์‹์ด๋‹ค.

github์— ์†Œ๊ฐœ ๋˜์–ด์žˆ๋Š” commands.Bot ์˜ˆ์ œ:
import discord
from discord.ext import commands

bot = commands.Bot(command_prefix='!')

@bot.event
async def on_ready():
    print('Logged in as')
    print(bot.user.name)
    print(bot.user.id)
    print('------')

@bot.command()
async def ping(ctx):
    await ctx.send('pong')

bot.run('token')


API์— ๋Œ€ํ•ด ์ดํ•ด๋„๊ฐ€ ์กฐ๊ธˆ ์Œ“์—ฌ์žˆ๋Š” ์ƒํƒœ๋ผ๋ฉด commands.Bot ๋ฐฉ์‹์ด ํ›จ์”ฌ ์ฒด๊ณ„์ ์ด๋ฉฐ ๊น”๋”ํ•˜๊ณ  ์œ ์—ฐํ•˜๋ฉฐ, ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ cooldown, has_permission ๋“ฑ์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด ๊ตณ์ด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋„ฃ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์œ„์—์„œ ๋ฒˆ์—ญ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋ผ๋„ ํ•ด์™ธ ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ๋Š” ์ด์œ ๊ฐ€ ์ด ๋•Œ๋ฌธ์ด๋‹ค. ์˜๋ฌธ์ด๋ผ ์ฝ๋Š”๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์„์ง„ ๋ชฐ๋ผ๋„, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์žˆ์–ด์„  ํ›จ์”ฌ ์ •๊ฐˆํ•˜๊ณ  ์‰ฝ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์— ์ด๋ฏธ ํ•ด์™ธ์—์„  commands.Bot ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด discord.ext๋งŒ importํ•˜๋ฉด ๋˜๋ƒ๋ฉด, ๊ทธ๊ฒƒ๋„ ์•„๋‹Œ ๊ฒŒ ๊ธฐ์กด์˜ discord ๊ธฐ๋ณธ ๋ชจ๋“ˆ์— ์žˆ๋Š” discord.Embed, discord.Role ํด๋ž˜์Šค ๊ฐ™์€ ๊ฒƒ ๋“ค๋„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‘˜ ๋‹ค ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค. ์ด๋Š” ํ›„์ˆ ๋  ์˜ˆ์ œ์—์„œ ์ฐธ๊ณ ํ•˜์ž.

2.2.1. 1.0.0 ๋ฒ„์ „ ๋ฏธ๋งŒ๊ณผ ์ด์ƒ๊ณผ์˜ ๋ช…๋ น์–ด ํ˜ธํ™˜[ํŽธ์ง‘]

๋งŒ์•ฝ 1.0.0 ๋ฒ„์ „ ๋ฏธ๋งŒ์„ ์‚ฌ์šฉํ•˜๋‹ค 1.0.0 ์ด์ƒ์˜ ๋ฒ„์ „์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ ๊ตฌ๋™์—์„œ ํ˜ธํ™˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ๋ชจ๋‘ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ์ƒˆ๋กœ ์ž‘์„ฑ๋œ bot.command์˜ ๋ช…๋ น์–ด ๋ฐ˜์‘์— ์žˆ์–ด ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” 1.0.0 ๋ฏธ๋งŒ์—์„œ ์‚ฌ์šฉํ•˜๋˜ on_message ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ธ๋ฐ, on_message ๋ฐฉ์‹์€ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ž…๋ ฅ๋˜๋Š” ๋ฉ”์„ธ์ง€์—์„œ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ถœํ•ด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณตํ•œ๋‹ค๋Š” ์  ๋•Œ๋ฌธ์— bot.commands๊ฐ€ ํ”„๋กœ์„ธ์Šค๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ด ์ƒํƒœ๋ก  ๋‘˜์„ ํ•จ๊ป˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ on_message ์•„๋ž˜ ์–ด๋А๊ณณ์—๋“  @bot.command๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” await bot.process_commands(message) ๋˜๋Š” @client.command๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” await client.process_commands(message)๋ฅผ ์ž…๋ ฅํ•ด๋‘๋ฉด ๋‘˜์„ ํ•จ๊ป˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

2.3. ๊ฐœ๋ฐœ ์ค‘ ๋ฐ ์œ ์ง€[ํŽธ์ง‘]

๋งŒ์•ฝ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ๋˜ ๋ด‡์ด ์–ด๋А๋‚  ์ •์ƒ ์ž‘๋™์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, discord.py์˜ ๋ฒ„์ „์„ ์ฒดํฌํ•ด๋ด์•ผํ•œ๋‹ค. ์—…๋ฐ์ดํŠธ๋˜์–ด ํ˜ธํ™˜์ด ์•ˆ๋˜๊ฑฐ๋‚˜ ๊ตฌ๋ฒ„์ „ ๋ฐ ์ƒ์œ„ ๋ฒ„์ „ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋‚  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๋‹ค. ํ•ด๊ฒฐ๋ฒ•์€ ์œ„์—์„œ ์žˆ๋“ฏ ==๋ฅผ ํ†ตํ•ด ์ „์— ์‚ฌ์šฉํ•˜๋˜ ๋ฒ„์ „์œผ๋กœ ์žฌ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

์ด๊ฑด discord.py๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ด‡ ์™ธ์— ๋ชจ๋‘ ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ์ ์ด์ง€๋งŒ, ๋ด‡ ํ† ํฐ์„ ํƒ€์ธ์—๊ฒŒ ์ ˆ๋Œ€ ๋…ธ์ถœํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋ด‡ ํ† ํฐ์€ ๊ฐ ๋ด‡๋“ค์˜ ์‹ ๋ถ„์ฆ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ์ค‘์ธ ๋ด‡์ด ์–ด๋–ค ๋ด‡์ธ๊ฐ€ ์ฆ๋ช…ํ•˜๋Š” ์ˆ˜๋‹จ์ด๋‹ค. ๋…ธ์ถœ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ๋‚ด ๊ป๋ฐ๊ธฐ๋ฅผ ๋’ค์ง‘์–ด ์”Œ๊ณ  ๋ณธ์ธ์ธ ๊ฒƒ ๋งˆ๋ƒฅ ํ–‰์„ธํ•˜๋Š” ๊ฒฉ์˜ ์ผ์ด ๋ฒŒ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋ด‡์˜ ์‚ฌ์šฉ์ธ์›์ด๋‚˜ ๊ทœ๋ชจ๊ฐ€ ์กฐ๊ธˆ ์ปค์ง€๋ฉด ํ…Œ์ŠคํŠธ์šฉ ๋ด‡์„ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ ํ›„ ์˜ฎ๊ฒจ์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์„ ์ถ”์ฒœํ•œ๋‹ค. ์–ด๋– ํ•œ ์ด์œ ๋กœ ์ฝ”๋“œ๊ฐ€ ์œ ์‹ค๋˜๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ ์™ธ์—๋„ ์œ ์ง€๋ณด์ˆ˜์˜ ์ˆ˜์›”ํ•จ์„ ์œ„ํ•ด extension ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ์„ธ๋ถ„ํ™” ์‹œํ‚ค๊ณ  ์ฝ”๋“œ ํŒŒ์ผ๋“ค์„ ๋ถˆ๋Ÿฌ๋“ค์ด๋ฉด ์ข‹๋‹ค.

discord.py 1.3.3์— ์ด์Šˆ๊ฐ€ ์ƒ๊ฒผ๋‹ค. Discord API๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ํ•ด๊ฒฐ๋ฒ•์€ ์ด๋ ‡๋‹ค.
pip install --upgrade discord.py

python 3.9 ์—…๋ฐ์ดํŠธ ๊ด€๋ จํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.
pip install discord.py
๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, Falied to build yarl multidict๋ผ๋Š” ๋ฌธ๊ตฌ์™€ ํ•จ๊ป˜ ๋‹ค์šด๋กœ๋“œ์— ์‹คํŒจํ•œ๋‹ค.https://github.com/Rapptz/discord.py/discussions/5898#discussioncomment-91100
์ด๋Š” ํŒŒ์ด์ฌ์ด 3.9 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉด์„œ ์ƒ๊ธด wheels ์ œ๊ณต ๊ด€๋ จ ๋ฌธ์ œ๋กœ, [4] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘์ž๊ฐ€ ์ด์— ๋งž๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜, python 3.8.6 ๋ฒ„์ „์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

discord.py ์„ค์น˜์‹œ, ์ฝ˜์†”์ด ์˜ค๋ฅ˜๋ฅผ ๋ฟœ์–ด๋‚ผ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์–ด๋А ์ •๋„๊นŒ์ง€๋Š” ์ž˜ ๋˜๋‹ค๊ฐ€ ๋งˆ๋Š”๋ฐ, MS visual c++ build tools 2015 ์ด์ƒ์„ ์„ค์น˜ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ๋œ๋‹ค. ์œ„์˜ ์˜ค๋ฅ˜๊ฐ€ ์•„๋งˆ ๊ฐ™์€ ๊ฒƒ์ผ ๋“ฏ. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„์ง...

3. ์—…๋ฐ์ดํŠธ[ํŽธ์ง‘]

discord.py๋Š” ๊นƒํ—ˆ๋ธŒ์—์„œ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฆด๋ฆฌ์ฆˆ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค pypl์— ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋Š” ์‹์ด๋‹ค. ์ด์— ๋”ฐ๋ผ ์•„์ง ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ์— ์ถ”๊ฐ€ ๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ๋“ค์„ ๋ฏธ๋ฆฌ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊นƒํ—ˆ๋ธŒ์—์„œ git์„ ์ด์šฉํ•ด ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.
์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•:
pip install -U git+https://github.com/Rapptz/discord.py.git
๊นƒํ—ˆ๋ธŒ์— ์˜ฌ๋ผ์˜จ ๋ชจ๋“ˆ์„ ๊ทธ๋Œ€๋กœ ์—…๋ฐ์ดํŠธ์‹œํ‚ค๋Š” ๋ช…๋ น์ด๋ฏ€๋กœ (์ •์‹ ๋ฆด๋ฆฌ์ฆˆ ํŒ์— ๋น„ํ•ด) ๋ฒ„๊ทธ, ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์•„์ง ์ •์‹ ๋ฒ„์ „์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์€ (์˜ˆ๋ฅผ ๋“ค์–ด message.reply) ๊ธฐ๋Šฅ๋“ค์„ ๋ฏธ๋ฆฌ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

4. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ˆ์ œ[ํŽธ์ง‘]

์ด๋ฏธ ์ธํ„ฐ๋„ท์— ํ•œ๊ตญ์–ด ๋ฌธ์„œ๊ฐ€ ์žˆ๋Š” ๊ตฌ๋ฒ„์ „ discord.Client()๋ณด๋‹จ discord.ext.comamnds.Bot ํด๋ž˜์Šค๋ฅผ ์ฃผ๋กœ ์ด์šฉํ•ด์„œ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ž…๋ฌธ์šฉ์œผ๋กœ ๋งŽ์ด ์„ ํ˜ธํ•˜๋Š”๋งŒํผ discord.py์™€ ๊ด€๋ จ๋œ ํ•จ์ˆ˜์— ์„ค๋ช… ์ฃผ์„์„ ๋„ฃ์–ด์ฃผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” ์˜ˆ์ œ์ธ๋งŒํผ ์•„๋ž˜ ๋ฐฉ์‹๋ฟ๋งŒ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋„ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ๋ฐฉ์‹์ด์ง€๋งŒ ์˜๋ฏธ๊ฐ€ ๋ฏธ๋ฏธํ•œ ์ˆ˜์ค€์ด๋ฉด ์ถ”๊ฐ€๋Š” ์‚ผ๊ฐ€ ์ฃผ์„ธ์š”. ํŒŒ์ด์ฌ ์ž์ฒด์— ๋Œ€ํ•œ ์„ค๋ช…์€ Python ๋˜๋Š” ํ•ด์™ธ ์ž๋ฃŒ๋ฅผ ํ†ตํ•ด ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

4.1. discord.ext.commands[ํŽธ์ง‘]

4.1.1. ๊ธฐ๋ณธ ๋Œ€ํ™” ๋ฐ ์ถœ๋ ฅ[ํŽธ์ง‘]

discord.Client() ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋‘ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด๋Š” discord.Client() ๊ฐ์ฒด๋ฅผ ์ƒ์†ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

from discord.ext import commands

bot = commands.Bot(command_prefix='!')

'''
๋ด‡์ด ๋ฐ˜์‘์„ ํ•ด์•ผํ•˜๋Š” ๋ช…๋ น์–ด์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„ธ์ง€ ์•ž์— ๋ถ™์ด๋Š” ์ ‘๋‘์‚ฌ(prefix)๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ !๋กœ 
์„ค์ •๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ณณ์„ ๋ณ€๊ฒฝ์‹œ ํ•ด๋‹น ๋ฌธ์ž๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ext์—์„  discord.Client() ํด๋ž˜์Šค ์ฒ˜๋Ÿผ 
str.startswith ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
'''

@bot.event
async def on_ready():
    print('Logged in as')
    print(bot.user.name) # ํ† ํฐ์œผ๋กœ ๋กœ๊ทธ์ธ ๋œ bot ๊ฐ์ฒด์—์„œ discord.User ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜จ ๋’ค name ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถœ๋ ฅ
    print(bot.user.id) # ์œ„์™€ ๊ฐ™์€ ํด๋ž˜์Šค์—์„œ id ํ”„๋กœํผํ‹ฐ ์ถœ๋ ฅ
    print('------')

@bot.command()
async def ping(ctx):
    await ctx.send(f'pong! {round(round(bot.latency, 4)*1000)}ms') # ๋ด‡์˜ ํ•‘์„ pong! ์ด๋ผ๋Š” ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ์ „์†กํ•œ๋‹ค. f-string์€ ์œ„์— ์„œ์ˆ ๋˜์–ด ์žˆ๋‹ค์‹œํ”ผ ๋ฒ„์ „ 3.6 ์ด์ƒ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

@bot.command(name="1234")
async def _1234(ctx):
    await ctx.send("5678")
#ํŒŒ์ด์ฌ ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ์—๋Š” ์ฒซ๊ธ€์ž์—๋Š” ์ˆซ์ž๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†๋Š”๋ฐ, ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์‹ถ๋‹ค๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„ ์ž๋ฆฌ๋Š” ๋‹ค๋ฅธ ์•„๋ฌด๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ณ  ๊ด„ํ˜ธ ์•ˆ์— name=""์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

bot.run('token')

4.2. discord.Client()[ํŽธ์ง‘]

4.2.1. ๊ธฐ๋ณธ ๋Œ€ํ™” ๋ฐ ์ถœ๋ ฅ[ํŽธ์ง‘]

import discord

client = discord.Client()

@client.event
async def on_ready(): # ๋ด‡์ด ์‹คํ–‰ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ํ–‰๋™ํ•  ๊ฒƒ
    print('Logged in as')
    print(client.user.name) # ํด๋ผ์ด์–ธํŠธ์˜ ์œ ์ € ์ด๋ฆ„์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    print(client.user.id) # ํด๋ผ์ด์–ธํŠธ์˜ ์œ ์ € ๊ณ ์œ  ID๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    # ๊ณ ์œ  ID๋Š” ๋ชจ๋“  ์œ ์ € ๋ฐ ๋ด‡์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์ˆซ์ž๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ID์ž…๋‹ˆ๋‹ค.
    print('------')

@client.event
async def on_message(message): # ์ž…๋ ฅ๋˜๋Š” ๋ฉ”์„ธ์ง€์—์„œ ์ฐพ๊ธฐ
    if message.content.startswith('!ping'): # ๋งŒ์•ฝ ๋ฉ”์„ธ์ง€๊ฐ€ '!ping'์œผ๋กœ ์‹œ์ž‘๋œ๋‹ค๋ฉด
        await message.channel.send('pong') # ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ์˜ฌ๋ผ์˜จ ์ฑ„๋„์— 'pong'์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

    if message.content.startswith('!pong'):
        await message.channel.send('ping!')

    '''
    on_message์—์„œ ๋˜๋‹ค๋ฅธ ๋ช…๋ น์–ด ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด
    if message.content.startswith๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š”๋ฐ, elif๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ if๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
    '''
client.run('token')

๋งŒ์•ฝ ๋ด‡์˜ ๋ฉ”์„ธ์ง€๋Š” ๋ฐ˜์‘ํ•˜๊ณ ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, on_message ์ตœ์ƒ๋‹จ์—
if message.author == client.user: # ๋งŒ์•ฝ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ ์‚ฌ๋žŒ๊ณผ ๋ด‡์ด ์„œ๋กœ ๊ฐ™์„ ๋•Œ
    return

if message.author.bot: # discord.User.bot ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ฐธ์ผ ๋•Œ
    return

์„ ํ•˜๋ฉด ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.[5]

์•„๋ž˜๋Š” client๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๋” ๊น”๋”ํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
import discord

client = discord.Client()
prefix ='!' # ์ ‘๋‘์‚ฌ

@client.event
async def on_ready(): 
    print('Logged in as')
    print(client.user.name) 
    print(client.user.id)
    print('------')

@client.event
async def on_message(message): 
    cmd = message.content.split(prefix)[1].split()[0] # ๋ช…๋ น์–ด๋ฅผ ์ €์žฅํ•œ๋‹ค
    args = message.content.split(cmd)[1][1:].split() # ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ args๋ฅผ ์ €์žฅํ•œ๋‹ค
    if cmd == 'ping': # message.content.startswith('!ping') ์ด๋ž‘ ๋˜‘๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค
        await message.channel.send('ping!')
client.run('token')

5. discord.Client()์˜ prefix[ํŽธ์ง‘]

๊ธฐ์กด discord.Client() ์ž์ฒด์—์„  Prefix(์ ‘๋‘์‚ฌ)๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.
import discord

client = discord.Client()
prefix = "!" # ์ ‘๋‘์‚ฌ ์„ค์ •ํ•˜๊ธฐ

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.event
async def on_message(message):
    if message.content.startswith(f'{prefix}ping'):
        await message.channel.send('pong')

client.run('token')
[1] ๋‹ค๋งŒ ๊ฐœ๋ฐœ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด PyCharm์ด๋‚˜ Visual Studio Code ๋“ฑ ์ „์šฉ IDE๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
[2] pip ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด py -3 -m pip install -U discord.py==0.16.12
[3] ๊ด€๋ จ ์ง€์‹์ด ์—†์–ด๋„ ์•„๋ž˜์— ํ›„์ˆ ๋  ์ด์œ  ๋•Œ๋ฌธ์—์„œ๋ผ๋„ ๋ฒˆ์—ญ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋ผ๋„ 1.0.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.
[4] ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ aiohttp, yarl, multidict๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๊ณ  ์žˆ๋‹ค.
[5] ํŒŒ์ด์ฌ์€ ํ•ญ์ƒ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ•œ์ค„์”ฉ ๊ตฌ๋™๋œ๋‹ค๋Š” ์ ์„ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์˜ ํŠน์ง•์œผ๋กœ, ๋งŒ์•ฝ ์ € ์ฝ”๋“œ๊ฐ€ ๋ช…๋ น์–ด ์•„๋ž˜์— ์žˆ๋‹ค๋ฉด ๋จผ์ € ์‹คํ–‰๋˜์ง€ ์•Š์•„ ์†Œ์šฉ์ด ์—†๋‹ค.