게임하느라 디스코드를 쓰는 중에 '봇'을 사용하는 친구가 있었다.
명령어를 써서 노래도 틀고, 디스코드 서버 관리도 하는걸 보니 꽤 재미있어 보였다.
마침 파이썬도 배우는 참이라 삘받아서 만들어 보았다.
디스코드 봇을 만드는 언어는 여러종류가 있는데 가장 많이 쓰는 언어로는 크게 2가지가 있다고 한다.
Node.js와 파이썬, 이 두가지인데 필자는 Node.js를 아직 다뤄본적이 없으므로 파이썬으로 만들기로 했다.
먼저 디스코드 개발자 페이지로 로그인해서 봇을 만들어줘야 한다.
로그인해서 들어간 후, Applications에서 New Application
Application의 이름을 만들고 생성하면 My Application에 새롭게 추가가 된다
General Information에서 봇의 이름, 설명 등 기본 정보를 설정하고 왼쪽의 Settings에서 Bot으로 넘어가자
이 페이지에서 짚고 넘어가야하는 부분은 Token값이다
이 Token값이 봇을 구동하는데에 필요한데, github 등에 올릴때 유출이 되지 않도록 주의하자
다음으로 OAuth2로 넘어와서 Scope에 bot을 선택하자
밑으로 bot에 설정해줄 옵션창이 뜨는데, Administrator만 선택해주자
Scope 하단에 URL이 생성된다.
이 URL로 봇을 서버에 초대할수 있다.
URL을 입력하면 이렇게 서버를 선택해서 봇을 초대할 수 있다.
이제 봇의 기능을 하나씩 추가해보자
서버에 봇이 들어오면 오프라인 상태로 켜저있는데, 먼저 봇을 온라인 상태로 바꿔보자
1. 환경 설정
개발은 파이썬으로 진행하므로 파이썬 기반의 개발을 위해 필요한 라이브러리를 설치하자
(파이썬은 3.7 이상의 버전을 이용하자)
pip install discord
pip로 discord를 설치해주면 discord.py도 동시에 설치된다
2. 코딩
다음으로 봇을 구동할 코드를 작성하자
import discord, asyncio, os
from discord.ext import commands
game = discord.Game("Primary Bot")
bot = commands.Bot(command_prefix='!', status=discord.Status.online, activity=game)
bot.run('여기에 토큰을 입력')
봇을 켤수 있는 최소한의 코드만 작성한 상태이다.
bot.run()에는 아까 봇 설정에서 보았던 Token값을 넣어준다.
코드를 돌리면 봇이 온라인 상태가 된다
우선, command.Bot으로 봇 객체를 만든 후, 옵션으로 command_prefix는 봇 명령어의 접두사, status로 봇의 상태, activity로 봇 이름 밑에 활동 내용값을 설정해준다.
접두사는 영문, 한글, 문장부호 등 여러가지를 지정할 수 있으며 여러 글자로 설정해도 무방하다
status는 online, offline, do_not_disturb, idle의 4가지로 설정할 수 있으며 기본값은 online이다.
Token을 파일형태로 저장한 후 읽어오는 방식으로 전환할 수도 있다.
token_path = os.path.dirname(os.path.abspath(__file__))+'/token.txt'
t=open(token_path, "r", encoding="utf-8")
token = t.read()
...
bot.run(token)
첫번째 명령어로 가볍게 인사 기능부터 넣어보자
@bot.command(aliases=['안녕', 'hi', '안녕하세요'])
async def hello(ctx):
await ctx.send(f'{ctx.author.mention}님 안녕하세요!')
!hello를 입력해서 인사 명령을 실행할 수 있다.
@bot.command()는 이 밑 함수가 명령어라는 의미를 가지고 alias옵션은 별명으로 !안녕, !hi 를 입력해도 !hello로 인식해서 명령을 실행시킬 수 있다.
async와 await은 비동기 함수로 이 부분에서 설명하기에는 너무 길어질 듯 해서 생략하려 한다.
'파이썬 비동기 함수' 등으로 구글링하면 자세히 알 수 있을 것이다.
hello 함수안의 ctx는 Context 객체로, 매개변수로 넣어줘야 접두사를 읽고 명령을 실행할 수 있다.
다음으로 더 많은 명령어와 기능을 다뤄보려한다.