[๐ค] ํ์ด์ฌ์ผ๋ก ๋ด ๋ง๋ค๊ธฐ! - 2
Python์ผ๋ก Discord ๋ด์ ๋ง๋๋ ๊ฑด ์๊ฐ๋งํผ ์ด๋ ต์ง ์์ต๋๋ค. ์ค๋น ์กฐ๊ธ๊ณผ ๋ช ์ค์ ์ฝ๋๋ก ๋ด์ ๋ง๋ค๊ณ , ์คํ ํ ์ ์์ต๋๋ค! ๋ ๋ฒ์งธ ์๊ฐ์๋ ๋ด์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ์คํํด๋ณด๊ฒ ์ต๋๋ค.
![[๐ค] ํ์ด์ฌ์ผ๋ก ๋ด ๋ง๋ค๊ธฐ! - 2](/content/images/size/w1200/2025/05/untitled-1.png)
์ฐ์ ์ด๋ป๊ฒ Python์ ์ด์ฉํด์ Discord ๋ด์ ๋ง๋๋์ง์ ๋ํด์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
Discord๋ Bot์ ์ด์ฉ์ ์ํด, API๋ฅผ ์ ๊ณตํฉ๋๋ค.
API๋ Application Programming Interface์ ์ค๋ง๋ก, ๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด ์ด๋ค ํ๋ก๊ทธ๋จ์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ๊ณผ ์ํธ์์ฉํ๋ ๊ตฌ์กฐ๋ฅผ ๋ปํฉ๋๋ค.
ํ์ง๋ง Discord์์ ์ ๊ณตํ๋ API๋ฅผ ๋ชจ๋ ์ดํด๋ณด๊ณ ์ง์ ํต์ ํ๋ ๊ฒ์ ์ด๋ ค์ด ์ผ์ด๊ธฐ ๋๋ฌธ์, ์ด๋ฏธ ๋ง๋ค์ด์ ธ์๋ ๋ชจ๋์ ์ด์ฉํ์ฌ ๋ง๋ค ๊ฒ์ ๋๋ค.

๊ทธ ์ค์์๋, Pycord๋ฅผ ํตํด ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
Pycord๋ discord.py์์ ๊ฐ๋ผ์ ธ ๋์จ, ์ฌ๋ฌ ๋์ค์ฝ๋์ฉ ๋ชจ๋ ์ค ํ๋์
๋๋ค.
1. Pycord ์ค์นํ๊ธฐ


์ฐ์ cmd
๋, Powershell
, Windows Terminal
์ ์คํํฉ๋๋ค.
Windows ๊ฒ์์ ํตํด ํ๋ก๊ทธ๋จ์ ์ฐพ์ ์ ์์ต๋๋ค.

pip install py-cord
์ ๋ช
๋ น์ด๋ฅผ ํตํด pip
๋ก ๋ชจ๋์ ์ค์นํฉ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก, ํ์ด์ฌ ์ต์ ๋ฒ์ ์ ์ค์นํ ๊ฒฝ์ฐ์ Pycord์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
pip install audioop-lts
๊ทธ๋ฐ ๊ฒฝ์ฐ์ ์ ๋ช
๋ น์ด๋ฅผ ํตํด audioop
๋ชจ๋์ LTS๋ก ์ค์นํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์์ต๋๋ค.
๋ฏธ๋ฆฌ ์ค์นํด๋ ์๊ด์์ต๋๋ค!
2. Discord ๋ด ์์ฑํ๊ธฐ

Discord์์ ์ฌ์ฉํ ๋ด์ ๋ง๋ค๊ธฐ ์ํด์, Discord Developer Portal์์ ๋ด์ ๊ณ์ ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
discord.dev๋ก ์ด๋ ํ ๊ณ์ ์ ์์ฑํ๊ฒ ์ต๋๋ค.

์ ํ๋ฉด์์, ์ผ์ชฝ ํญ์ Applications
๋ฅผ ์ ํํฉ๋๋ค.
์ดํ, ๋์ค์ฝ๋ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํฉ๋๋ค.

์ค๋ฅธ์ชฝ ์์ New Application
๋ฒํผ์ ์ ํํ์ฌ ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๊ฒ ์ต๋๋ค.

Application์ ์ด๋ฆ์ ์ธ์ ๋ ์ง ๋ณ๊ฒฝ ํ ์ ์์ต๋๋ค.
์ฐ์ ์ ์์ ์ด ์ํ๋ ๋ด์ ์ด๋ฆ์ผ๋ก ์ง์ ํฉ๋๋ค.

์ง๊ธ ํ๋ฉด์ ๋์ค์ฝ๋์ ์ ํ๋ฆฌ์ผ์ด์
ํ๋ฉด์
๋๋ค.
์ผ์ชฝ์ ํญ์์ Bot
์ ์ ํํ์ฌ ๋ด์ ์ค์ ํ๊ฒ ์ต๋๋ค.

์ด ํ๋ฉด์์ ๋ด์ ์ธ๋ถ์ ๋ณด๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
๋ด์ ์ค์ ํ ๋ ์์ฃผ ์ฌ์ฉํ๋ ๊ฒ๋ค๋ง ์ค๋ช
ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
- Icon: ๋ด์ ํ๋กํ ์ฌ์ง์ ์ง์ ํ ์ ์์ต๋๋ค.
- Banner: ๋ด์ ํ๋กํ ๋ฐฐ๋๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
- Username: ๋ด์ ์ฌ์ฉ์ ์ด๋ฆ์ ์ง์ ํ ์ ์์ต๋๋ค.
- Token: ๋ด์ ๊ณ์ ์
๋๋ค. ์ผ๋ฐ์ ์ธ ๊ณ์ ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ํฉ์น ๊ฒ์ด๋ผ๊ณ ์๊ฐํด๋ ์ข์ต๋๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณด์ ์ Token์ ๋ฑ 1๋ฒ๋ง ๋ณด์ฌ์ฃผ๋ฉฐ, ์ดํ์ ์์ด๋ฒ๋ ธ๋ค๋ฉด
Reset Token
์ ํตํด ์๋ก ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๋ง๋ค์ด์ง Token์ ์์ ๋ง ์๋ ๊ณต๊ฐ์ ์ ์ฅํด๋ก์๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณด์ ์ Token์ ๋ฑ 1๋ฒ๋ง ๋ณด์ฌ์ฃผ๋ฉฐ, ์ดํ์ ์์ด๋ฒ๋ ธ๋ค๋ฉด
- Public BOT: ๋ด์ ์๋ฌด๋ ์ด๋ํ ์ ์๊ฒ ์ค์ ํ ์ ์์ต๋๋ค. ์ด ์์ ์์๋ ํ์ฉํด๋์ด์ผ ํฉ๋๋ค.
- Privileged Gateway Intents ์ค์ ๋ค
- Presence Intent: ์ํ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ด ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- Server Members Intent: ์๋ฒ ๋ฉค๋ฒ์ ์ ๋ณด๋ฅผ ๋ด์ด ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- Message Content Intent: ์๋ฒ์์ ๋ณด๋ด๋ ๋ฉ์ธ์ง๋ฅผ ๋ด์ด ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- ๋ด์ด ๋ช ๋ น์ด๋ฅผ ์ธ์ํ๊ณ , ๋๋ตํด์ผ ํ๋ฏ๋ก ์ด ์์ ์์ ํ์ฉํด์ผ ํฉ๋๋ค.
๊ฐ ์ต์ ๋ค์ ๋ํด ์ํ๋ ๋๋ก ์ค์ ํ ํ, Token์ ๋ฐ๊ธํ๊ฒ ์ต๋๋ค.

Reset Token
๋ฒํผ์ ๋๋ฅธ ํ, Yes, do it!
์ผ๋ก ์น์ธํฉ๋๋ค.

๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด Token์ด ๋ฐ๊ธ๋ฉ๋๋ค.
์์์ ์ค๋ช ํ๋ค์ํผ, Token์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๊ฐ ํฉ์ณ์ ธ ์๊ธฐ ๋๋ฌธ์ ๊ทธ ์์ฒด๋ก ๋ก๊ทธ์ธ ํ ์ ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Token์ ์ด๋์๋ ๊ณต๊ฐ๋๋ฉด ์๋๋ฉฐ, ์ค์ง ์์ ๋ง์ด ์๋ ๊ณต๊ฐ์ ์ ์ฅ๋์ด์ผ ํฉ๋๋ค.
๋ง์ฝ Token์ด ๊ณต๊ฐ๋์๊ฑฐ๋, ์์ด๋ฒ๋ ธ๋ค๋ฉด Reset Token
์ ํตํด ์ด๊ธฐํ ํ ์ ์์ต๋๋ค.
3. Discord ๋ด ์ด๋ํ๊ธฐ
๋ด์ ๋ง๋ค์์ผ๋, ์ด์ ์๋ฒ์ ์ด๋ํด์ผํฉ๋๋ค.

์ด์ ์ ํ๋ฉด์์, ์ผ์ชฝ ํญ์ OAuth2
๋ฅผ ์ ํํฉ๋๋ค.

์ฌ๊ธฐ์์ ๋ฐ์ผ๋ก ํ๋ฉด์ ์ญ ๋ด๋ฆฌ๊ฒ ๋๋ฉด ์ฌ๋ฌ ์ต์ ์ด ๋์ต๋๋ค.

๊ทธ ์ต์
์ค์์, bot
์ด๋ผ๋ ์ต์
์ ์ ํํ๋ฉด ๋ ๋ง์ ์ต์
์ ๋ฐ์์ ์ ํ ํ ์ ์์ต๋๋ค.

์ถ๊ฐ๋ก ์ต์ ์ ๊ณ ๋ฅด์ง ์๊ณ , ๋งจ ๋ฐ์ ๋ง๋ค์ด์ง ์ฃผ์๋ฅผ ํตํด ์ด๋ํ ์ ์์ต๋๋ค.
Generated Url
์ ๋ณต์ฌํ์ฌ, Discord์ ๋ถ์ฌ๋ฃ๊ณ ์ด๋ํ๊ฑฐ๋
์น์ฌ์ดํธ์ ๋ถ์ฌ๋ฃ๊ณ ์ด๋ํ๊ฑฐ๋ ํ ์ ์์ต๋๋ค.
๋ํ ์ด ์ฃผ์๋ฅผ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋ณด๋ด๋ฉด ๋ค๋ฅธ ์ฌ๋๋ ์ด ๋ด์ ์ด๋ํ ์ ์์ต๋๋ค.
4. Python ํ์ผ ๋ง๋ค๊ธฐ
์ด์ ๋ด์ ๋ง๋ค ์ค๋น๊ฐ ์์ ํ ๋๋ฌ์ต๋๋ค.
๋ณธ๊ฒฉ์ ์ผ๋ก ๋ด์ ๋ง๋ค๊ธฐ ์ํด์ ํ์ผ์ ์์ฑํ๊ฒ ์ต๋๋ค.

์ ๋ ํ์ผ ํ์๊ธฐ์ ๋ฌธ์์ ํ์ผ์ ์์ฑํ๊ฒ ์ต๋๋ค.
๊ตณ์ด ๋ฌธ์๊ฐ ์๋์ด๋ ์ํ๋ ์์น์ ์์ฑํด๋ ๊ด์ฐฎ์ต๋๋ค.

์ ๋ Python Bot Test
๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ง๋ค๊ฒ ์ต๋๋ค.
๋ฌผ๋ก ํด๋์ ์ด๋ฆ๋ ์ํ๋ ๋๋ก ํด๋ ์๊ด์์ต๋๋ค.
ํ์ง๋ง, Python์ ๋ชจ๋์ ๋ถ๋ฌ์ฌ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ ํด๋ ์ด๋ฆ์ ํผํด์ผํฉ๋๋ค.
- os
- json
- discord

์ ๋ VSCode๋ฅผ ์ค์นํ ๋, Code(์ผ)๋ก ์ด๊ธฐ
์ต์
์ ์ ํํ๊ธฐ ๋๋ฌธ์ ํด๋์ ๋น ๊ณต๊ฐ์ ์ฐํด๋ฆญ ํด ๋ฐ๋ก VSCode๋ฅผ ์คํํ ์ ์์ต๋๋ค.
ํ์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ VSCode๋ฅผ ์คํํ์ฌ ์ด๋ฉด ๋ฉ๋๋ค.

VSCode ์คํ ํ, File
ํญ์์ Open Folder...
๋ฅผ ์ ํํ์ฌ ํด๋๋ฅผ ์ด ์ ์์ต๋๋ค.

์ ๋ ์๊น ๋ง๋ค์ด ๋ ํด๋๋ฅผ ์ด๊ฒ ์ต๋๋ค.

์ดํ, VSCode๊ฐ ํด๋์ ์ ๊ทผํ๊ฒ ํ๊ฐํฉ๋๋ค.

๊ทธ๋ฆฌ๊ณ ์ผ์ชฝ์ ํ์ผ ํญ์ ์ ํํ๊ณ , ํด๋์ ์ด๋ฆ ์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ๊ฐ๊ฐ ์ ํ์ผ, ์ ํด๋, ์๋ก๊ณ ์นจ, ๋ชจ๋ ํด๋ ๋ซ๊ธฐ ๊ธฐ๋ฅ์ด ๋์ค๊ฒ ๋ฉ๋๋ค.
์ ํ์ผ ๋ฒํผ์ ์ ํํ์ฌ ์ ํ์ด์ฌ ํ์ผ์ ๋ง๋ค๊ฒ ์ต๋๋ค.

ํ์ผ์ ์ด๋ฆ์ ์ด๋ป๊ฒ ์ง์ ํด๋ ์๊ด ์์ง๋ง, VSCode๊ฐ ์ธ์ ํ ์ ์๊ฒ ๋์ .py
๋ก ์ง์ ํด์ผ ํฉ๋๋ค.

์ด์ ์ค๋ฅธ์ชฝ ํ๋ฉด์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ํธ์งํ ์ ์์ต๋๋ค.Ctrl + S
๋ก ์ ์ฅํ๊ณ , F5
๋ ์ผ์ชฝ ์ ์คํ ๋ฒํผ์ผ๋ก ์คํ ํ ์ ์์ต๋๋ค.

F5
๋ ์คํ ๋ฒํผ์ ๋๋ฅด๋ฉด ์์์ ๋ค์๊ณผ ๊ฐ์ ์ฐฝ์ด ๋์ค๋๋ฐ, ์ฌ๊ธฐ์ Python Debugger
๋ฅผ ์ ํํฉ๋๋ค.

์ดํ Python File
์ ์ ํํ์ฌ ํ์ผ์ ์คํํฉ๋๋ค.

๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ด ์ ์คํ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
5. VSCode์์ ์ฝ๋ ์์ฑํ๊ธฐ
import discord
intent = discord.Intents.all()
client = discord.Client(intents=intent)
@client.event
async def on_ready():
print(client.user.name)
await client.change_presence(activity=discord.Game("ํ๋ฒ๊ฑฐ"))
@client.event
async def on_message(msg: discord.Message):
if msg.author.bot:
return
if msg.content == "%์๋
":
await msg.reply("์๋
!")
if msg.content == "%์๊ฐ":
await msg.reply("๊ทธ๋ ์๋
!")
client.run('<์ฌ๊ธฐ์ TOKEN ์
๋ ฅ>')
์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import discord
intent = discord.Intents.all()
client = discord.Client(intents=intent)
์ ์ฝ๋๋ pip
๋ฅผ ํตํด ์ค์นํ Pycord
๋ชจ๋์์ discord๋ฅผ import
ํ๊ณ , ๋ด์ ์๋ฏธํ๋ client
์ intent
๋ก ์์์ ์ค์ ํ Intent๋ฅผ ์ง์ ํ๋ ์ฝ๋์
๋๋ค.
@client.event
async def on_ready():
print(client.user.name)
await client.change_presence(activity=discord.Game("ํ๋ฒ๊ฑฐ"))
์ ์ฝ๋๋ client
์ event
์ค์ ํ๋์ธ, ๋ด์ ์ค๋น๊ณผ์ (on_ready
)์์ ์คํ๋๋ ๋ถ๋ถ์
๋๋ค.
๋ด์ด ์ ์์ ์ผ๋ก ์ผ์ก๋ค๋ฉด, print(client.user.name)
์ ์ํด ๋ด์ ์ฌ์ฉ์ ์ด๋ฆ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
await client.change_presence(activity=discord.Game("ํ๋ฒ๊ฑฐ"))
๋ฅผ ํตํด ๋ด์ ์ํ๊ฐ discord.Game
์ "ํ๋ฒ๊ฑฐ"
๋ก ์ง์ ๋์ด, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ด์ ์ํ๊ฐ ํ๋ฒ๊ฑฐ ํ๋ ์ค์ผ๋ก ๋์ค๊ฒ ๋ฉ๋๋ค.
@client.event
async def on_message(msg: discord.Message):
if msg.author.bot:
return
if msg.content == "%์๋
":
await msg.reply("์๋
!")
if msg.content == "%์๊ฐ":
await msg.reply("๊ทธ๋ ์๋
!")
์ ์ฝ๋๋ client
์ event
์ค์ ํ๋์ธ, ๋ด์ด ๋ฉ์ธ์ง๋ฅผ ๋ฐ์์ ๋(on_message
) ์คํ๋๋ ๋ถ๋ถ์
๋๋ค.
๋ง์ฝ ๋ด์ด ๋ณด๋ธ ๋ฉ์ธ์ง๋ผ๋ฉด(msg.author.bot
), ๋ฌด์(return
)ํ๋ฉฐ,
๋ง์ฝ ๋ฉ์ธ์ง์ ๋ด์ฉ์ด "%์๋
"
์ด๋ผ๋ฉด, ๊ทธ ๋ฉ์ธ์ง์ "์๋
!"
์ด๋ผ๊ณ ๋ต์ฅํ๊ณ ,
๋ง์ฝ ๋ฉ์ธ์ง์ ๋ด์ฉ์ด "%์๊ฐ"
๋ผ๋ฉด, ๊ทธ ๋ฉ์ธ์ง์ "๊ทธ๋ ์๋
!"
์ด๋ผ๊ณ ๋ต์ฅํฉ๋๋ค.
client.run('<์ฌ๊ธฐ์ TOKEN ์
๋ ฅ>')
client.run
์ ๊ดํธ ์์ ๋ค์ด๊ฐ ๋ด์ฉ์ Token์
๋๋ค.
ํ์ด์ฌ์ ๋ฌธ์ ํ์์ธ '
(๋ฐ์ดํ)๋ "
(์๋ฐ์ดํ)๋ก ์ ํ์ผํฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ํ์ผํฉ๋๋ค.client.run('MTM3MzYxMTUyNjMyOTczMzEzMA.GDc6jl.NmOFJQhoVKk_Amsyr-RyYrBqddjoNKMdXjwUtM')
์ดํ ์ฝ๋๊ฐ ๋ชจ๋ ์์ฑ๋์๋ค๋ฉด, VSCode์์ F5
๋ ์ผ์ชฝ ์์ ์คํ ๋ฒํผ์ ํตํด ๋ด์ ์คํํ ์ ์์ต๋๋ค.
๋ค์ ์๊ฐ์๋ ๋ด์ ๋จ์ ์ ํ์ ํ๊ณ , ์์ ํ์ฌ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.