디스 코드 봇 개발자 - diseu kodeu bos gaebalja

관련글

댓글 7

+ 이전 댓글 더보기

    비공개 댓글 남기기

    Discord is the easiest way to talk over voice, video, and text. Talk, chat, hang out, and stay close with your friends and communities.

    discord.com

    디스코드 홈페이로 들어가 로그인 한 후 아래로 쭉 내려가서 개발자를 클릭한다.

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

    그러면 엄청난 영어가 우리를 반겨준다

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

    그중 좌측 상단의 Application를 클릭한다.

     

    그후 New Applcation를 누르고 이름을 입력한다.

    이게 봇의 이름이 되는 것도 아니고 변경도 가능하니 아무거나 입력하자.

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja
    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

     

    봇 계정이 생성되었다.

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

     

    이제 진짜 Bot을 추가해보자.

    왼쪽 메뉴바에서 Bot을 클릭하고 Add Bot를 누른다.

    Yes, do it! 까지 클릭해주면 봇이 추가가 된다.

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

    Username이 서버에 표시되는 봇의 이름이 된다.

     

    서버에 봇 추가

    아무런 기능도 없지만 서버에 봇을 추가해보자

    좌측 메뉴바에 OAuth2를 클릭, bot 체크, Copy클릭까지 한 후 url에 붙여넣고 봇을 추가해 보자

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja
    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

    더보기

    bot을 체크하면 밑에 탭이 하나 더 생기는데 나중에 봇의 기능에 따라 권한을 부여할 수 있다.

    지금은 아무 기능도 없으니 체크할 필요는 없고 나중에 기능을 많이 추가하면 다룰 예정이다.

     

    디스코드로 들어가보면 서버에 오프라인으로 표시된 봇이 추가되었다.

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

    파이썬

    시작하기 앞서 혹시나 파이썬 설치가 안돼있다면 인터넷 보고 설치하자.

    코딩교육이니 4차산업혁명이니 하면서 파이썬 설치만 해도 블로그 글 및 영상이 수두룩하게 있다.

    사용하는 버전은 python3.8.5이며 에디터는 wsl에서 vim을 사용하고 있으나 그냥 IDLE이나 VScode, Visual Studio, Pycham... 등등 뭘 써도 상관없다. 자신이 사용하기 편한 에디터를 사용하자

    [6] 이게 끝이 아니다. 디스코드에서 서버를 확인하려면 특정 엔드포인트에서 REST API로 GET메서드를 보내고 메시지는 /channels/{channel id}/messages에 POST를 하는 등 아주 복잡하다. 심지어는 음성을 전달할 때 Opus 코덱으로 직접 인코딩하여 웹소켓으로 보내야한다.(...)[7] 다만 API문서에 나와있는 간단한 GET / POST 요청 정도는 봇 토큰만 있어도 간단한 웹 요청 클라이언트로도 가능하다[8] 또한 디스코드에 새 기능이 추가되면 공식 API에는 거의 바로 반영되지만, 비공식 라이브러리는 반영되는 데 시간이 걸리는 점도 있다. 이러한 이유로 디스코드의 새로운 기능을 사용하고 싶고 HTTP request는 아는데 웹소켓 부분에서 막히는 경우 비공식 라이브러리에 없는 기능만 직접 API에 request를 보내서 사용하기도 한다.

    봇은 추가했는데, 아무리 기다려도 봇은 오프라인인 상태로 남아있다. 오프라인 상태라는 것은, 봇이 디스코드에 접속하지 않았다는 것을 의미하고, 그렇다는 것은 무언가의 수단을 사용해서 우리가 만든 봇을 접속하도록 해야 한다는 것을 의미한다.

    봇은 무엇이라 했는가? 자동으로 일을 해 주는 소프트웨어라고 했었다. 이는 봇이 컴퓨터 상에서 동작하기 위한 코드가 필요하다는 것을 의미한다. 그러면 봇이 동작하기 위한 코드를 작성하기 위해선 어떤 언어를 사용해야 할까?

    여기에 딱히 정답은 없다. 디스코드는 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과 관련된 환경 변수가 설정이 되지 않은 것일수도 있다. 다시 설치하면서 설치 옵션중에 환경 변수와 관련된 항목을 체크하거나, 파이썬 환경변수로 구글링을 해 보자.

    별다른 오류 메시지가 없다면 디스코드 라이브러리는 성공적으로 설치된 것이다. 그러면 자신이 사용하는 파이썬 개발 툴을 이용하여 본격적으로 프로그래밍을 시작해보도록 하자.

     

    봇 토큰 가져오기

    본격적인 프로그래밍을 시작하기 전에 하나 챙겨야 할 것이 있다. 봇 토큰이다.

    파이썬 코드로 무언가 봇을 실행할 수 있는 코드를 만들었다고 치자. 그러면 이 코드를 우리가 생성한 봇이 돌릴 수 있게 해야 한다. 그렇다면 코드 상에서 우리가 생성한 봇이 로그인 같은 것을 하도록 하는 과정, 즉 인증, 같은 것이 필요하다. 그럼 뭘로 인증을 할까? 사용자는 계정 이름과 비밀번호를 이용하여 자신을 인증한다. 그러면 봇은?

    봇은 각자 자신만의 고유한 토큰을 가지고 있다. 코드 상에서 토큰을 집어넣어서 우리가 생성한 봇이 이 코드를 실행하도록 할 수 있다. 그러면 토큰은 어디서 가져와야 할까?

    개발자 페이지로 가서 봇 화면으로 가 보자.

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

    그러면 봇의 아이콘과 이름을 짓는 곳에

    python3 -m pip install -U discord
    
    0이란 항목이 보일 것이다. 그리고
    python3 -m pip install -U discord
    
    1 버튼이 보일텐데, 이 버튼을 눌러보자. 그러면 클립보드에 토큰 정보가 들어가게 되고, 메모장 같은 곳에 붙여넣기를 하면 이상한 텍스트가 보일 것이다. 그것이 토큰이다.

    가능하면 이 토큰은 다른 사람에게 보여주지 않도록 하자. 비밀번호 같은 존재이기 때문이다. 괜히 토큰 값을 보이지 않게 한게 아니다! 이 포스팅에서도 토큰은 보여주지 않을 것이다.

    이 토큰 텍스트를 어딘가에 잘 모셔두거나, 아니면 복사할 수 있는 위치를 잘 기억해두자.

     

    대망의 첫 코드

    이제 준비가 되었다. 다음 코드를 작성하고 실행해보도록 하자.

     

    bot.py

    import discord
    
    
    # 개발자 페이지에서 봇에 대한 토큰 텍스트를 가져온 뒤, TOKEN에 대입하자
    TOKEN = "봇 페이지에서 받은 토큰 텍스트"
    
    client = discord.Client()
    
    
    # 봇이 접속하면 아래의 함수를 실행하게 된다
    @client.event
    async def on_ready():
        print(f'{client.user} online!')
    
    
    # 봇을 실행하자
    client.run(TOKEN)
    

     

    토큰 텍스트는 문자열 형태로 전달하기 위해 양 옆에 쌍따옴표(“)를 붙여주도록 하자.

    이제 이 코드를 실행하면, 콘솔 화면에는 여러분이 지은 봇 이름이 출력될 것이고, 드디어 우리가 만든 봇이 온라인 상태가 된다!

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

    코드에서 주목할만한 부분들을 찾아보자.

    client = discord.Client()
    

    디스코드 클라이언트 객체를 생성한다. 이 클라이언트 객체를 통해서 디스코드와 통신을 수행하게 된다. 봇 코드와 디스코드와의 통신을 위해선 필수로 생성해야하는 객체이다.

    @client.event
    async def on_ready():
        print(f'{client.user} online!')
    

    데코레이터를 이용하여 디스코드 API의 이벤트인 on_ready 이벤트에 대응하는 함수를 등록한다.

    python3 -m pip install -U discord
    
    2가 소문자인 것에 주목하라. Client 클래스가 아니라 client 객체이다. 만약 여러분이 클라이언트 객체를 할당한 변수의 이름이
    python3 -m pip install -U discord
    
    2가 아니라
    python3 -m pip install -U discord
    
    4라면, 데코레이터는
    python3 -m pip install -U discord
    
    5로 사용해야 할 것이다.

    on_ready 이벤트는 디스코드에 접속을 마치면 발생하게 되는 이벤트이다. 즉, 이 함수가 호출되었다는 것은 정상적으로 디스코드에 접속이 되었다는 의미이다. 지금은 파이썬 콘솔 상에서 접속이 완료 되었는지에 대한 여부를 확인하기 위해 print 함수로 봇의 이름을 출력하도록 하였다.

    client.run(TOKEN)
    

    클라이언트 객체를 이 코드를 통해 실행하게 된다. 인자로

    python3 -m pip install -U discord
    
    0을 넘기는 것에 주목하라. 위의 클라이언트 객체를 이 토큰을 가진 봇이 실행할 수 있도록 해 달라는 의미를 지니고 있다.

    그래서 만약 토큰이 유출되었다면, 다른 사람이 당신의 토큰을 가지고 멋대로 당신의 봇을 실행할 수도 있을 것이다!

     

    그리고 잘 보면 파이썬 코드가 종료되지 않고 계속 실행하고 있는 것을 확인할 수 있을 것이다. 그렇다. 봇은 계속 당신의 컴퓨터 안에서 실행되고 있는 것이다.
    그리고 강제로 파이썬 코드를 종료한다면, 시간이 약간 흐른 후 당신의 봇이 다시 오프라인으로 돌아가게 되는 것을 확인할 수 있을 것이다.

    이렇게 봇을 접속만 시키고 멍때리게 하는 대망의 첫 코드가 완성되었다. 이제 여러분은 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)
    

     

    그러면 아무 말이나 입력해보자.

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

    당신이 아무 말을 입력하면 봇이 “그렇군요!” 라고 응답을 한다! 그러면 새로 추가된 코드를 확인해보자.

    @client.event
    async def on_message(message):
    

    on_ready()를 추가할 때 처럼, 데코레이터로 on_message 이벤트에 함수를 등록해준다. 매개변수로 message가 있다는 점도 잊지말자.

        # 봇이 입력한 메시지라면 무시하고 넘어간다.
        if message.author == client.user:
            return
    

    이 부분은 좀 중요한데, on_message 이벤트는 아무튼 채팅창에 무언가가 입력되면 무조건 발생하는 이벤트이다. A사용자가 입력해도 발생하고, B사용자가 입력해도 발생하고, 자기 자신이 입력해도 발생한다.

    디스 코드 봇 개발자 - diseu kodeu bos gaebalja

    자기 자신이 입력해도 발생한다는 점이 정말 중요하다. 만약 이 코드를 추가하지 않고 봇을 실행한다면, 위의 그림처럼 자기 자신이 입력한 “그렇군요!”를 보고 또 다시 반응하여 “그렇군요!”를 계속 출력하게 된다. 따라서 자기 자신의 메시지에 반응하지 않도록 위의 예외처리는 필수로 해야 한다.

        await message.channel.send("그렇군요!")
    

    “그렇군요!” 메시지를 입력하는 코드이다.

    python3 -m pip install -U discord
    
    7라는 키워드가 보일건데, 대충 무언가 채팅을 친다던가 하는 행동을 할 때에는 앞에
    python3 -m pip install -U discord
    
    7를 붙인다고 생각하면 된다.