[๐Ÿค–] ํŒŒ์ด์ฌ์œผ๋กœ ๋ด‡ ๋งŒ๋“ค๊ธฐ! - 2

Python์œผ๋กœ Discord ๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฑด ์ƒ๊ฐ๋งŒํผ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค€๋น„ ์กฐ๊ธˆ๊ณผ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ๋ด‡์„ ๋งŒ๋“ค๊ณ , ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๋‘ ๋ฒˆ์งธ ์‹œ๊ฐ„์—๋Š” ๋ด‡์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์‹คํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

[๐Ÿค–] ํŒŒ์ด์ฌ์œผ๋กœ ๋ด‡ ๋งŒ๋“ค๊ธฐ! - 2

์šฐ์„  ์–ด๋–ป๊ฒŒ Python์„ ์ด์šฉํ•ด์„œ Discord ๋ด‡์„ ๋งŒ๋“œ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

Discord๋Š” Bot์˜ ์ด์šฉ์„ ์œ„ํ•ด, API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
API๋Š” Application Programming Interface์˜ ์ค€๋ง๋กœ, ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Discord์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ๋ชจ๋‘ ์‚ดํŽด๋ณด๊ณ  ์ง์ ‘ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ ธ์žˆ๋Š” ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Pycord, The library for building Discord bots in Python.

๊ทธ ์ค‘์—์„œ๋„, 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 Developer Portal โ€” API Docs for Bots and Developers
Integrate your service with Discord โ€” whether itโ€™s a bot or a game or whatever your wildest imagination can come up with.

Discord์—์„œ ์‚ฌ์šฉํ•  ๋ด‡์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ, Discord Developer Portal์—์„œ ๋ด‡์˜ ๊ณ„์ •์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

discord.dev๋กœ ์ด๋™ ํ›„ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์œ„ ํ™”๋ฉด์—์„œ, ์™ผ์ชฝ ํƒญ์˜ Applications๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
์ดํ›„, ๋””์Šค์ฝ”๋“œ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅธ์ชฝ ์œ„์˜ New Application ๋ฒ„ํŠผ์„ ์„ ํƒํ•˜์—ฌ ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

Application์˜ ์ด๋ฆ„์€ ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ์„ ์€ ์ž์‹ ์ด ์›ํ•˜๋Š” ๋ด‡์˜ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ ํ™”๋ฉด์€ ๋””์Šค์ฝ”๋“œ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.
์™ผ์ชฝ์˜ ํƒญ์—์„œ Bot์„ ์„ ํƒํ•˜์—ฌ ๋ด‡์„ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํ™”๋ฉด์—์„œ ๋ด‡์˜ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ด‡์„ ์„ค์ •ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค๋งŒ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

  • Icon: ๋ด‡์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Banner: ๋ด‡์˜ ํ”„๋กœํ•„ ๋ฐฐ๋„ˆ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Username: ๋ด‡์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Token: ๋ด‡์˜ ๊ณ„์ •์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ณ„์ •์˜ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ฉ์นœ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ ์ƒ Token์€ ๋”ฑ 1๋ฒˆ๋งŒ ๋ณด์—ฌ์ฃผ๋ฉฐ, ์ดํ›„์— ์žƒ์–ด๋ฒ„๋ ธ๋‹ค๋ฉด Reset Token์„ ํ†ตํ•ด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ๋“ค์–ด์ง„ Token์€ ์ž์‹ ๋งŒ ์•„๋Š” ๊ณต๊ฐ„์— ์ €์žฅํ•ด๋‘ก์‹œ๋‹ค.
  • 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๋‚˜ ์™ผ์ชฝ ์œ„์˜ ์‹คํ–‰ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ๋ด‡์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” ๋ด‡์˜ ๋‹จ์ ์„ ํŒŒ์•…ํ•˜๊ณ , ์ˆ˜์ •ํ•˜์—ฌ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.