유명한 천문학 사이트 중 하나인 APOD(Astromical Picture of the Day)를 디스코드 봇으로 만들어보려고 한다.
APOD에서는 매일 주목할만한 천문학 관련 이미지(가끔 gif나 영상도 올라온다)를 선정해 설명과 함께 업로드하는데, 평소에 동아리 단톡방에 그 내용을 정리해서 올리곤 했다. 그렇지만 솔직히 정리하기 귀찮기도 하고... 번역하기도 귀찮고 해서 안 한 적이 훨씬 많다. 그래서 조금이라도 수고를 덜고자 카카오톡은 아니지만 디스코드에서 APOD 정보를 불러오는 봇을 만들 생각이다.
목표하는 기능은 일단은 다음과 같다.
1. 오늘의 apod contents 불러오기 (/apod today) -> 옵션에 따라 번역된 description 제공 (google 번역 api?)
2. 특정 날짜의 apod contents 불러오기 (/apod {YYYY-MM-DD})
아무튼 이런 기능을 만들어 성공적으로 사용하려면, 기본적인 bot의 뼈대부터 세워야 한다... 그래서 이 글에서는 기본 봇을 만드는 방법을 설명해보려고 한다.
(0단계의 경우 스크린샷을 찍지 못해 테스트 봇을 만드는 과정을 첨부했다. 1단계부터는 APOD 봇으로 진행된다.)
0. 봇 계정 생성 및 초대
1) Discord Developer Portal에서 로그인
2) New Application을 클릭하고 Application의 이름을 짓는다. 이 때 이름이 너무 흔하면 이후 Add bot 단계에서 진행이 불가능하다.
3) 이런 화면이 나타난다.
기본적인 봇 설정은 여기서 할 수 있다.
4) Bot 탭으로 이동해 Add Bot을 클릭한다.
(2단계 인증을 설정해 두었다면 6자리 코드를 입력해야 한다. Google OTP 등 2단계 인증 앱에서 코드를 확인할 수 있다.)
5) 이런 화면이 나타난다.
6) 생성된 봇을 서버에 초대하기 위해, OAuth2 탭을 클릭한다.
7) SCOPES에서 bot을 체크하고, 필요한 권한을 선택한 후 생성된 URL을 복사해 접속한다.
8) 서버를 선택하고 승인하면 봇이 서버에 초대된다.
1. 기본적인 봇 만들기
1) discord 패키지를 설치하자. Powershell 등 터미널에서 명령어를 입력해준다.
pip install discord.py
2) 각자 사용하는 IDE에서 프로젝트 폴더와 python 파일을 만든다. 이 때 python 파일명이 discord이면 안 된다.
3) python 파일에 다음과 같은 코드를 작성해준다. discord.py 공식 홈페이지의 예제 코드에 intents 관련 내용을 조금 추가한 것이다.
import discord
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print('We have logged in as {0.user}'.format(client))
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
client.run('여기에 복사한 토큰이 들어갑니다.')
코드에 관한 설명은 discord.py 퀵스타트 문서에서 확인할 수 있다.
또한 이 단계에서 봇의 token을 복사해주어야 하는데, Discord Developer Portal의 Bot 탭에서 copy 버튼을 클릭하면 된다. token을 확인하지 못했다면, reset token을 눌러 새로운 token을 생성해 copy한다.
4) 작성한 python 파일을 저장하고 실행한다.
python bot.py
5) 실행하면 봇은 온라인 상태가 된다.
6) 다음과 같이 정상적으로 작동하면 기본적인 봇이 완성되었다.
2. 오류?
코드를 작성하고 실행하는 과정에서 다음과 같은 오류를 마주했다
Client.__init__() missing 1 required keyword-only argument: 'intents'
1.5버전부터 Intents라는 것이 생기면서, 코드에서도 intents에 관한 명시를 해주어야 한다. 정확히 어떤 매커니즘으로 작동하는지는 아직 이해하지 못했지만, 아래 두 방법으로 해결할 수 있었다.
1) Discord Developer Portal의 Bot 탭에서 intents 권한을 허용한다.
2) 다음 코드를 추가한다.
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
intents에 관한 내용은 이후 추가로 학습한 후 보충할 예정이다.
3. 참고한 사이트
https://discordpy.readthedocs.io/en/stable/
https://discordpy-ko.github.io/index.html
'프로젝트' 카테고리의 다른 글
[pymyrep] python pep8, docstring (0) | 2023.10.03 |
---|---|
[discord.py] 2. 웹 크롤링 구현하기 (0) | 2023.02.23 |