Python으로 Discord 봇 만들기! - 2
Python으로 Discord 봇을 만드는 건 생각만큼 어렵지 않습니다. 준비 조금과 몇 줄의 코드로 봇을 만들고, 실행 할 수 있습니다! 두 번째 시간에는 봇의 기본적인 구조를 이해하고, 실행해보겠습니다.
우선 어떻게 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나 왼쪽 위의 실행 버튼을 통해 봇을 실행할 수 있습니다.
다음 시간에는 봇의 단점을 파악하고, 수정하여 보도록 하겠습니다.