문제 해결, 그리고 기본적인 Discord bot 만들기.

HJ seo·2022년 10월 10일
2

discord-alarm-bot

목록 보기
2/6

잡담.

이리저리 검색을 해봤지만 어디서도 이전 문제와 같은 문제를 겪은 사람이 없는 것 같아 application을 하나하나 다 뒤적인 결과 결국 해결했다..!

해결 방법.

방법 자체는 간단하다. 결국 message content intent가 on으로 되어있지 않았기 때문에 발생한 문제이고, Bot의 해당 버튼을 한번 클릭하고 봇을 초대하면 되는 것이었다. OAuth2의 url generator를 사용해서 사용할 기능들을 클릭 후 초대하면 되는 것이었다.

그리고 아래는 문제가 되었던 사진.

(discord.ext.commands.bot Privileged message content intent is missing, commands may not work as expected)
해당 문제는 디스코드 봇이 message content에 대한 권한이 빠져있어서, 봇이 작동하지 않을 수도 있다는 경고문이었다.


굉장히 많은 시간을 들여 삽질했던 사항은 url generator에서 세팅을 하면 되는 것이라 생각해 message와 관련된 모든 버튼을 클릭해보면서 봇을 초대했다 뺐다 했던 것이다. 문제를 해결한 지금 와서 생각해보면 url generator에서 한 것은 봇에게 어떤 권한을 줄 것인지에 대한 것을 설정해주는 것이었으니 디스코드가 이런 기준을 가지고 나눴다는 점을 깨우친 것이 그나마 다행인 점일까?


해서 봇을 만드는 기본적인 세팅을 적어두려고 한다.

Discord bot 만들기.

정확하게 다루려고 하는 내용에 대해 미리 정의를 해놓는다.

  1. 여기서는 기본적인 pip 설치, 혹은 디스코드에 개발자 권한을 받아오는 것과 같은 과정이 이미 되있다는 가정 하에 공식 문서의 코드인
import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix=">", intents=intents)

@bot.command()
async def ping(ctx):
    await ctx.send("pong")

bot.run("token")

를 실행시키는 자세한 방법을 다룰 예정이다.

기본 코드 실행하기.

  1. 바로 위 url로 접속한다. 이때 다음과 같은 화면이 나온다.(디스코드 개발자 권한이 없을 경우 몇가지 과정을 걸쳐서 이 화면으로 넘어오면 된다, private alram bot은 내가 현재 만들고 있는 테스트로 디스코드 봇을 처음 만드는 사용자는 빈 화면이 뜰 것이다.)
  1. 오른쪽 위 New Application을 클릭 후 이름을 적고 체크박스에 체크를 한다.(사진과 같은 많이 일반적인 이름은 되도록 피하자. 중복이라고 봇 생성이 안되서 나중 사진에는 test bot1234로 이름을 바꿨다.)

  2. Application이 잘 생성되었을 때는 다음과 같은 창이 뜨게 된다.(NAME아래 description과 tag는 내가 채워준 것이고, 없어도 상관 없는 곳이다.)

  3. 왼쪽 매뉴탭에 Bot을 클릭하면 다음과 같은 창이 뜬다.

    그리고 클릭시 Application에 bot을 추가할껀지에 대한 메세지가 나오고, 확인을 누른다면 다음처럼 Application과 같은 이름을 가진 bot이 생성된다.

  4. 이제 bot의 토큰을 얻을 차례이다.
    위 그림에서 사진을 넣는 탭 옆의 TOKEN에 있는 버튼을 클릭해서 TOKEN을 얻자. 필자의 경우 디스코드에 로그인을 할 시 OTP를 통한 이중보안을 사용하고 있는데 나와 같은 경우에는 6자리 숫자를 입력하라는 메시지가 뜨고, 여기에 OTP를 눌러주면 토큰이 리셋되고 다음과 같이 토큰이 뜨게 된다.
    (완전한 토큰을 보여주는 것은 좀 그렇고 M****XIM이라 하겠다.)

    버튼을 눌러 copy를 하고, 다른 곳에 정보를 미리 저장해두자.
    (추후 파일을 만들고 상단 코드를 입력 후 코드 마지막의 bot.run('token')token에 그대로 집어넣어줄 것이다.)

  5. 이 상태에서 스크롤을 죽 내려주자.
    그리고 위에서 해결했었던 문제인 MESSAGE CONTENT INTENT에 있는 토큰을 on으로 바꿔주고, 아래 Save changes 버튼을 눌러주면 된다.(위에 설명한 것이다.)

  6. 왼쪽 매뉴탭의 OAuth2 > URL Generator로 이동하자.
    SCOPES box 내의 bot을 체크하면 BOT PERMISSON box가 뜨는데 여기가 bot이 초대할 서버 내에서 어떤 기능을 할 지 직접 셋팅을 하는 곳이다.

    예시에서는 별다른 기능 없이 응답만을 사용할 것이기 때문에 Send Messages만을 체크해준다.

    만약 이것저것 다 사용할 예정이라면 간단이 GENERAL PERMISSION 쪽의 관리자(Administrator)를 선택해주면 된다.
    마지막으로 스크롤을 맨 아래로 내려서 GENERATED URL을 복사해주자.

※ 8번의 경우 일반적으로 배포된 봇을 추가하는 것과 완전히 똑같은 방법이다.

  1. GENERATED URL은 디스코드 봇을 서버 관리 권한이 있는 서버에 초대하는 마지막 확인 절차이다. url에 접속하면 다음과 같은 창이 뜨고 자기가 관리하는, 봇을 추가할 서버를 선택할 수 있다.

서버를 선택하고 계속하기를 봇에게 어떤 권한을 줄지를 체크한 후 승인을 누르면 디스코드에 로그아웃이 된 봇(test bot1234)가 추가된다.

  1. 이제 코드로 돌아가보자. 기본 코드에서 두 가지 사항을 변경할 것이다.

    • 5번에서 얻은 token을 변수명 discord_bot_token에 저장해주고, 맨 아래 bot.run('token')도 변경해주자.
    • 코드가 정말 잘 로그인이 되었는지 console상에서도 확인하기 위해 기본 코드에 @bot.ready그리고 함수명이 on_ready인, bot의 이름을 출력해주는 함수를 더해준다.

    완성된 코드는 다음과 같다.

# __filename__ == 'test_discordbot.py'
import discord
from discord.ext import commands

discord_bot_token = 'M****XlM'
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix=">", intents=intents)

@bot.event
async def on_ready():
    print('Bot: {}'.format(bot.user))

@bot.command()
async def ping(ctx):
    await ctx.send("pong")

bot.run(discord_bot_token)
  1. 마지막으로 파일을 실행시켜주고, 봇이 추가된 디스코드 채팅창에 >ping을 입력해보자.(command 안쪽에 따로 name을 설정하지 않으면 함수명이 실행 명령어가 된다.)

-end-

after..

이정도는 되겠지? 하고 앞 1자리, 뒤 세자리만 공개했던 토큰으로부터 디스코드쪽에 공식 메시지가 도착했다..

역추측이 불가능하게 코드딴에서 일부터 틀리게까지 써놓으며 부분 공개를 하는 것은 괜찮지 않을까? 하며 올려본 사실인데 원천 비공개라는 기본 전제가 상당히 엄격한가보다..

profile
다양한 분야에 관심이 많은 초보 개발자 입니다.

1개의 댓글

comment-user-thumbnail
2023년 10월 22일

저도 이번에 처음 봇을 만들어보면서 권한 문제로 되게 고생 했거든요..ㅋㅋㅋ
에러메세지 하나 안 뜨고 실행 잘 되는데 메세지가 안 오는.. 전 삽질하다가 찾아냈지만 좀 더 빨리 이 글을 찾아낼 걸 아쉬워요
좋은 정보 감사합니다.

답글 달기