[Discord.py #01] 은비에게 인사하기 - 서버에 봇 추가하기

2023. 6. 5. 00:10Lectures - 코딩 강좌/Discord.py (Python 디스코드 봇) 강좌

 

#시작하기에 앞서서...

최근에 디스코드 서버를 개발하면서 서버 관리가 힘들어진 혜성. 혼자서 모든 것을 수동으로 관리하기는 시간적인 제약을 너무 많이 받는다! 대신해서 서버를 관리해 줄 사람이 필요한데... 때 마침 은비가 혜성을 도와 서버 관리를 도와 주겠다고 한다! 선듯 도와주겠다는 마음에 감동을 받은 혜성이었지만... 은비가 서버에 와야 혜성이를 도와 줄 수 있게 되는데...

 

 


#이번 시간의 목표!

이번 시간에는 디스코드 서버에 봇을 추가하여 서로 인사를 나눠보는 것 까지 해보도록 할거에요!

그래서 우리가 준비해야 할 것은 Python 3.10 버전(다른 버전도 상관없긴 하지만 본 강좌에서는 3.10 버전을 기준으로 할게요!), 텍스트 편집기(저는 VS Code 를 이용할거에요!), 디스코드 계정과 서버 이 정도 되겠네요!

잠깐, 봇을 만들껀데 봇도 필요한 것 아니에요???

사실 위의 준비물로는 개발 하기에 부족하죠... 하지만 더 필요한 재료들은 앞으로 강좌를 진행하면서 하나 씩 추가해 볼거에요! 그러니 다음 내용을 읽기전에 위의 준비물이 모두 준비되었는지 꼼꼼히 확인 해주기만 하면 될 것 같아요!

다 준비 되었다면 본격적으로 개발에 들어가보도록 할께요!

(Python 설치 및 환경변수 설정 과정은 생략하겠습니다. 모르겠으면 댓글이나 아래에 연락처로 질문해 주셔도 되요!)

 


#1.1. 생애 첫 디스코드 봇을 만들어 보아요

가장 처음 할 것은 디스코드 봇을 생성하는 방법 입니다! 아래의 링크를 클릭하면 디스코드 봇 개발자 홈페이지로 이동이 됩니다.

https://discord.com/developers/applications

 

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.com

디스코드 로그인 후 개발자 포탈에 들어오면 사진과 같은 화면이 보입니다. 우측 상단에 "New Application" 을 클릭하여 봇을 하나 만들어 줍시다!

예쁘게 이름 지어 주시고... 아래에 체크박스 체크해 주시고 "Create" 를 눌러 봇을 생성해 주시면 됩니다!

저는 과거에 만들었던 봇이 있기 때문에 그 봇을 재활용 하겠습니다.

 

대충 봇에 프로필 사진 넣어주고 이름 까지 설정해 주었습니다.

카테고리에서 "Bot" 을 클릭해주시고, Token에 "Reset Token"을 눌러주시면 새로운 토큰 값이 생성됩니다! 이 토큰 값을 복사해 주시고 일단 메모장 같은곳에 임시 저장 해주도록 합시다. (디스코드 채팅 채널에 토큰 값을 올리면 보안성 문제 때문에 강제로 토큰 값이 바뀌니 꼭 메모장 같은 곳에 임시 저장 해주세요!)

토큰 값은 디스코드 봇에 접근 하기 위해 생성되는 난수 값 입니다. 정말 중요한 녀석이에요! 나중에 봇에게 생명을 불어 넣어 주기 위해 꼭 필요하기 때문에 잘 저장해 주도록 할께요!

스크롤을 내려보면 "Previleged Gateway Intents" 라는 옵션이 보일거에요. 이 옵션들은 우리가 봇과 대화를 하기 위해 필수적으로 설정해 주어야 하는 옵션이에요. 모두 다 캬준 다음 꼭 저장을 해주세요!

 


#1.2. 디스코드 일상으로의 초대장

이때 까지 우리가 개발할 봇을 디스코드 서버에 데이터가 존재하도록 만들어 주었어요. 그런데 이렇게 만들어 두기만 하면 우리가 만든 봇이랑 아무런 소통을 할 수 없게 되는거에요... 그래서 우리는 꼭 봇이랑 대화를 할 수 있도록 서버에 봇을 추가해 주어야 해요. 이번에는 봇을 추가하는 방법에 대해 알아보도록 할게요! 

먼저 우측 카테고리에서 "OAuth2 - URL Generator"로 들어가 줄게요.

들어가면 "SCOPES" 옵션에 'bot' 이라고 되어 있는게 보일 텐데 이것을 체크해주도록 할게요.

그러면 봇의 권한을 설정해주는 옵션이 생기게 되는데, 맨 처음에 "Administrator"를 체크해서 초대하자마자 관리자 권한을 얻도록 해줄거에요. 물론 이 부분은 여러분이 하고 싶은대로 설정해 주면 됩니다!

다 하고 나면 맨 아래에 링크 주소가 하나 완성되어 있을거에요. 이것을 복사해서 웹페이지로 열어 주세요. (위 사진의 옵션이 바뀐것은 무시하셔도 됩니다.)

봇 초대 해주는 화면이 나왔다면 봇 개발 테스트를 위한 서버에 추가 해주도록 할께요!

추가가 완료 되었다면 서버에 오프라인 상태로 봇이 생기게 될겁니다!

 


#1.3. 디스코드 봇에 생명을...

이제 서버에도 넣었겠다 봇을 가동시킬 일만 남았겠죠?

이번에는 Discord API를 Python에서도 이용할 수 있게 모듈 하나를 설치 할 예정입니다!

cd C:\Users\(your_pc_name)\AppData\Local\Programs\Python\Python38\Scripts
pip3 install discord

폴더 하나 만들어 주고 bash 파일 하나를 만들어 주겠습니다. 텍스트 편집기에 위와 같이(your_pc_name 부분은 사용자 PC명이 들어가기 때문에 본인 컴퓨터 이름을 넣어 주면 됩니다) 작성을 해주시고, 파일명을 "install_module.bat"(확장자가 bat 이면 된다)로 인코딩은 "UTF-8"로 설정해서 저장해 줄게요. 저장한 것을 실행 시켜주면 자동으로 모듈이 설치가 됩니다.

위 bash 코드는 파이썬에 pip3를 통해 디스코드 API를 제공해 주는 모듈인 discord.py를 설치하는 코드입니다.

설치가 완료 되면 텍스트 편집기 열어서 봇을 구동하는 메인 파일을 만들어 볼거에요. 아래의 코드를 참고 하셔서 작성하시면 됩니다. 복붙용 코드도 올려드릴게요.

#0. Modules
import discord
from discord.ext import commands
from discord.ext import tasks



#1. Config

#1.1. discord bot token
token = '이곳에 토큰 값을 넣어주세요'

#1.2. state message
game_mes = "Type '/help' for help"



#2. Create Discord Client
intents = discord.Intents.all()
client = commands.Bot(command_prefix='!', intents=intents)

@client.event # Use these decorator to register an event.
async def on_ready(): # on_ready() event : when the bot has finised logging in and setting things up
    await client.change_presence(status=discord.Status.online, activity=discord.Game(game_mes))
    print("New log in as {0.user}".format(client))



#3. Run bot
client.run(token)

코드 작성을 마치고 폴더에 "main.py" 라는 이름으로 저장했습니다. 아래는 코드에 대한 설명을 적어 두었습니다.

1) Column 2~4
모듈을 불러옵니다. 아까 설치했던 discord.py를 불러와 API를 사용할 수 있도록 합니다.
2) Column 11, 19~20, 29
11번 줄에는 아까 복사해 둔 토큰값을 넣습니다. 19~20번 줄에서 클라이언트를 불러와서, 29번 줄에서 토큰 값을 가진 봇이 온라인이 되도록 합니다.

*참고로 20번 줄에는 명령어 접두사를 결정하는 코드가 있습니다. 저는 일단 !를 사용하도록 작성했습니다.
3) Column 14, 24


14번줄에는 봇의 상태 메세지에 들어갈 말을 변수에 저장하고, 24번 줄에서 상태 메세지에 적용 시킵니다.
4) Column 22~25
클라이언트 이벤트에 관한 코드가 들어오는 부분입니다. 간단하고 쉽게 말해서 봇이 채팅 내용을 읽고나서 바로 어떤 반응을 보일지 작성하게 될 곳입니다.

25번 줄에는 봇이 커졌음을 알리기 위해 터미널에 봇 이름과 함께 봇이 온라인 임을 알리는 로그를 남기는 코드가 들어 있습니다.

 

코드 작성을 마치고 "main.py"를 실행 시키면 봇이 온라인 상태가 되게 됩니다.

 


#1.4. Hello World!

이번 장의 마지막 강좌가 되겠네요! 바로 바로 채팅으로 봇과 상호작용을 할 수 있게 코딩을 해볼겁니다.

채팅창에 "은비 안녕" 으로 시작하는 문장을 입력하면 봇이 "반가워" 와 함께 채팅을 한 사람의 이름까지 불러주는 기능을 만들어 볼게요. 아래에는 복붙용 코드와 코드 해설을 적어 두었습니다.

@client.event
async def on_message(message):
   
    #인사
    if message.content.startswith("은비 안녕"):
        await message.channel.send("반가워" + message.author.name)

1) Column 27~32
이번에 추가할 기능입니다.
27~28번 줄은 클라이언트가 특정한 채팅 메세지에 반응 하도록 채팅 분석을 하여 만일 특정한 채팅이 나오면 특정한 반응을 반환하도록 하는 비동기화(어느 메소드를 실행하는 도중에도 다시 메소드를 실행이 가능, 즉 시스템의 일치가 필요하지 않음을 의미한다) 함수를 선언한 부분이다.
31번 줄은 채팅에 올라온 메세지가 "은비 안녕" 으로 시작되는지를 분석하여 참과 거짓을 결정한다.
32번 줄은 "반가워"라는 말과 함께 채팅을 보낸 사람(author)의 이름까지 채팅창으로 보내버리는 구문이다.

*32번 줄에 "message.author.name" 부분을

- "message.author" 로 바꿨을 때 식별자(discriminator, 유저 구별용 4자리 숫자)도 출력된다.
ex) 반가워 Dizzt#0116

- "message.author.nickname" 로 바꿨을 때 서버에서 사용중인 별명이 함께 출력된다.
ex) 반가워 혜성

봇을 새로고침 하고나서 채팅방에 "은비 안녕" 으로 시작되는 문장을 입력하면 잘 작동하는 것을 볼 수 있습니다!

 


#강좌를 마치며...

이번 시간에는 디스코드 봇을 생성하여 간단한 인사를 주고받는 기능을 가진 봇을 만들어 보았습니다. 아직 은비가 인사 밖에 하지 못하지만, 다음 시간에는 좀 더 복잡한 기능을 수행할 수 있도록 단단히 준비해서 오겠습니다!

혹시 이해가 잘 안된다, 제 블로그 글에 피드백이 필요한 것 같다 생각이 드는 분들은 자유롭게 댓글 남겨주셔도 좋고 아래에 연락처로 편하게 연락 해 주셔도 됩니다!

디스코드: Dizzt#0116
이메일: eorhkd69@gmail.com (이메일은 잘 못 볼 가능성이 큽니다 ㅠㅠ)

긴 글 읽어 주셔서 감사합니다!