디스코드 봇 만들기 - 봇 실행하기
파이썬으로 간단한 디스코드 봇 만들기 시리즈 두 번째 포스팅이다. 이번엔 봇을 실행하기 위한 세팅을 해 보자.
봇이 오프라인?
봇은 추가했는데, 아무리 기다려도 봇은 오프라인인 상태로 남아있다. 오프라인 상태라는 것은, 봇이 디스코드에 접속하지 않았다는 것을 의미하고, 그렇다는 것은 무언가의 수단을 사용해서 우리가 만든 봇을 접속하도록 해야 한다는 것을 의미한다.
봇은 무엇이라 했는가? 자동으로 일을 해 주는 소프트웨어라고 했었다. 이는 봇이 컴퓨터 상에서 동작하기 위한 코드가 필요하다는 것을 의미한다. 그러면 봇이 동작하기 위한 코드를 작성하기 위해선 어떤 언어를 사용해야 할까?
여기에 딱히 정답은 없다. 디스코드는 Discord API라는 것을 제공한다. 어떤 언어를 사용하든, 이 Discord API를 사용할 수만 있다면 무슨 언어를 사용하더라도 상관없다. 다만 이 API를 사용하기 위해선 소켓 등을 이용한 통신을 할 줄 알아야 한다.
하지만 세상은 넓다. 이러한 통신을 도와주는 라이브러리들을 만드는 사람들이 있기 때문이다. 또한 이것은 무료로 제공된다. 우리는 라이브러리를 가져다 쓰면 훨씬 더 적은 노력으로 디스코드 봇을 만들 수 있다! 라이브러리를 만든 사람들에게 감사하는 마음을 가지고 본격적으로 사용해보도록 하자.
파이썬으로 시작하기
이 포스팅에서 사용할 언어는 파이썬이다. 그리고 파이썬으로 제작된 디스코드 라이브러리는 Rapptz라는 사람이 만든 discord.py라는 라이브러리이다. 링크를 따라가면 제작자의 github로 이동할 수 있다.
그러면 discord.py 라이브러리를 설치해보자. cmd에서 다음 명령어로 설치할 수 있다. 둘 중 하나는 될 것이다.
python -m pip install -U discord
python3 -m pip install -U discord
만약 그래도 안된다면 python과 관련된 환경 변수가 설정이 되지 않은 것일수도 있다. 다시 설치하면서 설치 옵션중에 환경 변수와 관련된 항목을 체크하거나, 파이썬 환경변수로 구글링을 해 보자.
별다른 오류 메시지가 없다면 디스코드 라이브러리는 성공적으로 설치된 것이다. 그러면 자신이 사용하는 파이썬 개발 툴을 이용하여 본격적으로 프로그래밍을 시작해보도록 하자.
봇 토큰 가져오기
본격적인 프로그래밍을 시작하기 전에 하나 챙겨야 할 것이 있다. 봇 토큰이다.
파이썬 코드로 무언가 봇을 실행할 수 있는 코드를 만들었다고 치자. 그러면 이 코드를 우리가 생성한 봇이 돌릴 수 있게 해야 한다. 그렇다면 코드 상에서 우리가 생성한 봇이 로그인 같은 것을 하도록 하는 과정, 즉 인증, 같은 것이 필요하다. 그럼 뭘로 인증을 할까? 사용자는 계정 이름과 비밀번호를 이용하여 자신을 인증한다. 그러면 봇은?
봇은 각자 자신만의 고유한 토큰을 가지고 있다. 코드 상에서 토큰을 집어넣어서 우리가 생성한 봇이 이 코드를 실행하도록 할 수 있다. 그러면 토큰은 어디서 가져와야 할까?
개발자 페이지로 가서 봇 화면으로 가 보자.
그러면 봇의 아이콘과 이름을 짓는 곳에 TOKEN
이란 항목이 보일 것이다. 그리고 Copy
버튼이 보일텐데, 이 버튼을 눌러보자. 그러면 클립보드에 토큰 정보가 들어가게 되고, 메모장 같은 곳에 붙여넣기를 하면 이상한 텍스트가 보일 것이다. 그것이 토큰이다.
가능하면 이 토큰은 다른 사람에게 보여주지 않도록 하자. 비밀번호 같은 존재이기 때문이다. 괜히 토큰 값을 보이지 않게 한게 아니다! 이 포스팅에서도 토큰은 보여주지 않을 것이다.
이 토큰 텍스트를 어딘가에 잘 모셔두거나, 아니면 복사할 수 있는 위치를 잘 기억해두자.
대망의 첫 코드
이제 준비가 되었다. 다음 코드를 작성하고 실행해보도록 하자.
bot.py
import discord
# 개발자 페이지에서 봇에 대한 토큰 텍스트를 가져온 뒤, TOKEN에 대입하자
TOKEN = "봇 페이지에서 받은 토큰 텍스트"
client = discord.Client()
# 봇이 접속하면 아래의 함수를 실행하게 된다
@client.event
async def on_ready():
print(f'{client.user} online!')
# 봇을 실행하자
client.run(TOKEN)
토큰 텍스트는 문자열 형태로 전달하기 위해 양 옆에 쌍따옴표(“)를 붙여주도록 하자.
이제 이 코드를 실행하면, 콘솔 화면에는 여러분이 지은 봇 이름이 출력될 것이고, 드디어 우리가 만든 봇이 온라인 상태가 된다!
코드에서 주목할만한 부분들을 찾아보자.
client = discord.Client()
디스코드 클라이언트 객체를 생성한다. 이 클라이언트 객체를 통해서 디스코드와 통신을 수행하게 된다. 봇 코드와 디스코드와의 통신을 위해선 필수로 생성해야하는 객체이다.
@client.event
async def on_ready():
print(f'{client.user} online!')
데코레이터를 이용하여 디스코드 API의 이벤트인 on_ready 이벤트에 대응하는 함수를 등록한다.
client
가 소문자인 것에 주목하라. Client 클래스가 아니라 client 객체이다. 만약 여러분이 클라이언트 객체를 할당한 변수의 이름이 client
가 아니라 test
라면, 데코레이터는 @test.event
로 사용해야 할 것이다.
on_ready 이벤트는 디스코드에 접속을 마치면 발생하게 되는 이벤트이다. 즉, 이 함수가 호출되었다는 것은 정상적으로 디스코드에 접속이 되었다는 의미이다. 지금은 파이썬 콘솔 상에서 접속이 완료 되었는지에 대한 여부를 확인하기 위해 print 함수로 봇의 이름을 출력하도록 하였다.
client.run(TOKEN)
클라이언트 객체를 이 코드를 통해 실행하게 된다. 인자로 TOKEN
을 넘기는 것에 주목하라. 위의 클라이언트 객체를 이 토큰을 가진 봇이 실행할 수 있도록 해 달라는 의미를 지니고 있다.
그래서 만약 토큰이 유출되었다면, 다른 사람이 당신의 토큰을 가지고 멋대로 당신의 봇을 실행할 수도 있을 것이다!
그리고 잘 보면 파이썬 코드가 종료되지 않고 계속 실행하고 있는 것을 확인할 수 있을 것이다. 그렇다. 봇은 계속 당신의 컴퓨터 안에서 실행되고 있는 것이다.
그리고 강제로 파이썬 코드를 종료한다면, 시간이 약간 흐른 후 당신의 봇이 다시 오프라인으로 돌아가게 되는 것을 확인할 수 있을 것이다.
이렇게 봇을 접속만 시키고 멍때리게 하는 대망의 첫 코드가 완성되었다. 이제 여러분은 discord.py의 ‘hello world!’를 시작한 것이다.
채팅 입력에 반응하기
그러면 봇이 무언가에 반응을 할 수 있도록 해 보자. 사용자가 채팅을 입력하면 대충 아무말이나 하도록 하는 코드를 작성해보자.
그렇다면 봇이 채팅창에 무언가의 메시지가 입력되었다! 라는 것을 알아야 한다. 아마 디스코드 API는 이러한 이벤트를 제공하고 있을 것이다. 그 이벤트는 on_message이다.
누군가가 채팅을 쳤다면 “그렇군요!” 라는 대답을 하는 코드를 작성해보자.
import discord
# 개발자 페이지에서 봇에 대한 토큰 텍스트를 가져온 뒤, TOKEN에 대입하자
TOKEN = "봇 페이지에서 받은 토큰 텍스트"
client = discord.Client()
# 봇이 접속하면 아래의 함수를 실행하게 된다
@client.event
async def on_ready():
print(f'{client.user} online!')
# 채팅창에 누군가가 메시지를 입력하면 아래의 함수를 실행하게 된다
@client.event
async def on_message(message):
# 봇이 입력한 메시지라면 무시하고 넘어간다.
if message.author == client.user:
return
# 메시지가 들어온 채팅창에 "그렇군요!" 라고 입력한다.
await message.channel.send("그렇군요!")
# 봇을 실행하자
client.run(TOKEN)
그러면 아무 말이나 입력해보자.
당신이 아무 말을 입력하면 봇이 “그렇군요!” 라고 응답을 한다! 그러면 새로 추가된 코드를 확인해보자.
@client.event
async def on_message(message):
on_ready()를 추가할 때 처럼, 데코레이터로 on_message 이벤트에 함수를 등록해준다. 매개변수로 message가 있다는 점도 잊지말자.
# 봇이 입력한 메시지라면 무시하고 넘어간다.
if message.author == client.user:
return
이 부분은 좀 중요한데, on_message 이벤트는 아무튼 채팅창에 무언가가 입력되면 무조건 발생하는 이벤트이다. A사용자가 입력해도 발생하고, B사용자가 입력해도 발생하고, 자기 자신이 입력해도 발생한다.
자기 자신이 입력해도 발생한다는 점이 정말 중요하다. 만약 이 코드를 추가하지 않고 봇을 실행한다면, 위의 그림처럼 자기 자신이 입력한 “그렇군요!”를 보고 또 다시 반응하여 “그렇군요!”를 계속 출력하게 된다. 따라서 자기 자신의 메시지에 반응하지 않도록 위의 예외처리는 필수로 해야 한다.
await message.channel.send("그렇군요!")
“그렇군요!” 메시지를 입력하는 코드이다. await
라는 키워드가 보일건데, 대충 무언가 채팅을 친다던가 하는 행동을 할 때에는 앞에 await
를 붙인다고 생각하면 된다.
자세한 내용은 파이썬의 async/await에 대해 알아보도록 하자.
이제 봇이 무언가 반응을 하는 코드까지 작성하였다.
다음에는 본격적으로 봇 명령어를 만들어서, 특정 명령을 수행하도록 하는 코드를 작성해보자.
Reference : 이 포스팅은 다음 사이트를 참고하여 작성하고 있다.
https://realpython.com/how-to-make-a-discord-bot-python/
https://discordpy.readthedocs.io/en/latest/
Comments