๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•

์ด์ „ ๊ธ€

2023.10.19 - [Language/Python] - ํŒŒ์ด์ฌ์œผ๋กœ ๋””์Šค์ฝ”๋“œ(Discord) ์•Œ๋ฆผ ๋ฉ”์„ธ์ง€ ๋ด‡ ๋งŒ๋“ค๊ธฐ(1) - ๋ด‡ ์ƒ์„ฑ ๋ฐ ์ถ”๊ฐ€

 

ํŒŒ์ด์ฌ์œผ๋กœ ๋””์Šค์ฝ”๋“œ(Discord) ์•Œ๋ฆผ ๋ฉ”์„ธ์ง€ ๋ด‡ ๋งŒ๋“ค๊ธฐ(1) - ๋ด‡ ์ƒ์„ฑ ๋ฐ ์ถ”๊ฐ€

00. ๊ฐœ์š” ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์•ฑ ๋””์Šค์ฝ”๋“œ(Discord), ์ด ๋””์Šค์ฝ”๋“œ์— ๋ด‡์„ ๋งŒ๋“ค์–ด ์•Œ๋ฆผ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒจ์„œ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค. 01. ๋ด‡(Bot) ์ƒ์„ฑ ๋ฐ ์ถ”

cjwoov.tistory.com

 

 

00. ๊ฐœ์š”

 ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋””์Šค์ฝ”๋“œ ์•Œ๋ฆผ ๋ด‡์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์‚ฌ์ „ ์ƒ์„ฑ ๊ณผ์ •์„ ๋‹ค๋ค„๋ณด์•˜๋‹ค.

์ด๋ฒˆ์—๋Š” ๋ณธ๊ฒฉ์ ์œผ๋กœ ํŒŒ์ด์ฌ์œผ๋กœ ์•Œ๋ฆผ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

 

01. ์•Œ๋ฆผ ๋ฉ”์„ธ์ง€ ์ „์†ก ์ฝ”๋“œ ์ž‘์„ฑ

ํŒจํ‚ค์ง€ ์„ค์น˜

 ํŒŒ์ด์ฌ์—์„œ ๋””์Šค์ฝ”๋“œ ๋ด‡์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

pip install discord

 

์ฝ”๋“œ ์ž‘์„ฑ

import discord
from discord.ext import commands

DISCORD_CHANNEL_ID = 921103 # ์ฑ„๋„ ์•„์ด๋””๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
DISCORD_BOT_TOKEN = 111111 # ๋ด‡์˜ ํ† ํฐ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

if __name__ == "__main__":
    intents = discord.Intents.default()
    intents.message_content = True

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

    @bot.event
    async def on_ready():
        print(f'Bot is ready')
        
        channel = bot.get_channel(DISCORD_CHANNEL_ID)
        if channel is None:
            print('์ฑ„๋„์ด ์—†์–ด์š” ๐Ÿ˜‚')
            return
        print('์•ˆ๋…•ํ•˜์„ธ์š”? ๐Ÿ˜Š')
    
    bot.run(DISCORD_BOT_TOKEN)

 ์•„์ฃผ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋‹ค.

 

    intents = discord.Intents.default()

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

 ๋ด‡์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ intents๋ž€ ๊ฒƒ์„ ๋งŒ๋“ค์–ด ์ค˜์•ผํ•œ๋‹ค.

intents?
๋””์Šค์ฝ”๋“œ ๋ด‡์ด ์„œ๋ฒ„์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„์˜ฌ์ง€๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋ฒคํŠธ๋“ค์€ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ๋ฉค๋ฒ„๊ฐ€ ์„œ๋ฒ„์— ๋“ค์–ด์˜ค๊ฑฐ๋‚˜ ๋‚˜๊ฐ€๋Š” ๋“ฑ์˜ ์ƒํ™ฉ์„ ํฌํ•จํ•œ๋‹ค.

 ์šฐ๋ฆฌ๋Š” ์ผ๋ฐฉ์ ์œผ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ๊ฒƒ์ด๋ฏ€๋กœ ๋”ฑํžˆ ์„ค์ •์„ ํ•ด์ฃผ์ง„ ์•Š๋Š”๋‹ค.

 

command_prefix๋Š” ๋ด‡์— ๋ช…๋ น์„ ๋‚ด๋ฆด ๋•Œ ์ฑ„ํŒ…์˜ ๋งจ ์•ž์— ๋ถ™์ด๋Š” ์ ‘๋‘์‚ฌ๋กœ์จ ํ•ด๋‹น ์ ‘๋‘์‚ฌ๋ฅผ ํ†ตํ•ด ๋ช…๋ น์–ด์ธ์ง€ ์ธ์ง€ํ•œ๋‹ค.

ex) !์ธ์‚ฌ, !์ •๋ณด, ...

์—ญ์‹œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์ผ๋‹จ ์ž‘์„ฑํ•ด์ค€๋‹ค.

 

    @bot.event
    async def on_ready():
        print(f'Bot is ready')
        
        channel = bot.get_channel(DISCORD_CHANNEL_ID)
        if channel is None:
            print('์ฑ„๋„์ด ์—†์–ด์š” ๐Ÿ˜‚')
            return
        print('์•ˆ๋…•ํ•˜์„ธ์š”? ๐Ÿ˜Š')

@bot.event ๋Š” ํŒŒ์ด์ฌ์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Decorator)๋กœ, ํ•ด๋‹น ๋กœ์ง์—์„œ๋Š” bot์˜ ์ด๋ฒคํŠธ๋ฅผ ๊พธ๋ฉฐ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

on_ready ํ•จ์ˆ˜๋Š” ๋ด‡์ด ์ ‘์†์ด ์™„๋ฃŒ ๋œ ํ›„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœ์ด ๋˜๋Š”๋ฐ, ์œ„ ๋กœ์ง์—์„œ๋Š” ์ฑ„๋„์„ ์–ป์–ด์™€ ํ•ด๋‹น ์ฑ„๋„์— ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

    bot.run(DISCORD_BOT_TOKEN)

 ๋ด‡์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ผ์ธ์ด๋‹ค, DISCORD_BOT_TOKEN์€ ์ด์ „ ๊ธ€ ์—์„œ ๋‹ค๋ฃจ์—ˆ์œผ๋‹ˆ ํ•ด๋‹น ํ† ํฐ์„ ๋ณต์‚ฌ, ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•œ๋‹ค.

 

 ๊ทธ๋Ÿฌ๋ฉด DISCORD_CHANNEL_ID๋Š” ์–ด๋–ป๊ฒŒ ์–ป์–ด์˜ค๋Š” ๊ฑธ๊นŒ? 

 

 

02. ๋””์Šค์ฝ”๋“œ ์ฑ„๋„ ์•„์ด๋”” ์–ป์–ด์˜ค๊ธฐ

 ๋””์Šค์ฝ”๋“œ ์•ฑ์—์„œ ์‚ฌ์šฉ์ž ์„ค์ • - ๊ณ ๊ธ‰ - ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ๋ฅผ ONํ•ด์ค€๋‹ค.

 

 ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๊ณ ์ž ํ•˜๋Š” ์ฑ„๋„์— ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ - ์ฑ„๋„ ID ๋ณต์‚ฌํ•˜๊ธฐ๋กœ ์ฑ„๋„ ID๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ฝ”๋“œ์— ๋ถ™์—ฌ๋„ฃ์–ด์ค€๋‹ค. ๐Ÿ˜Š

 

 

03. ๊ฒฐ๊ณผ

 ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ์•Œ๋ฆผ ๋ฉ”์„ธ์ง€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ „์†ก๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•