본문 바로가기

IT/개발

chatGPT를 discord bot으로 만들어보자(초간단, 대화기억, chatGPT-4o)

반응형

1. discord 서버 생성하기

 

우선 discord bot 일을 하기 위한 서버환경을 만들어 줘야 합니다하나 생성해볼까요?

 

discord 실행하고  좌측의 + 버튼을 눌러서 서버를 생성합니다.

 

 

 

서버의 이름을 지정하고 서버 이미지도 간단하게 넣어줍니다.

이후 만들기 버튼을 누르면 왼쪽 서버목록에 추가된 것을 있습니다.

 

 

 

초대한 사람만 사용할 있도록 채널권한을 비공개로 변경해 줍니다.

 

 

2. Bot 생성하기

 

다음 url 접속해서 application 생성합니다.

 

https://discord.com/developers/applications 

 

Discord Developer Portal — API Docs for Bots and Developers

Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with.

discord.com

 

 

 

 

오른쪽 상단의 New Application 버튼을 클릭합니다.

 

 

정상적으로 생성되면 다음과 같은 화면이 표시됩니다.

이제 왼쪽의 Bot 선택합니다.

 

 

 

개인용으로 제한하여 사용할 것이기 때문에 PUBLIC BOT off하고 나머지는 열어주었습니다.  이부분의 상세한 역할은 추가적으로 알아봐야 같습니다.

 

 

3. Bot 서버에 연결하기

 

왼쪽에서 OAuth2 선택하면 URL Generator 표시됩니다.

scope에서 bot 설정합니다.

 

 

 

이러면 아래쪽에 BOT 에서 사용가능한 퍼미션 목록이 나열됩니다.

목록에서 Send Messages 선택합니다. 그런데 봇을 서버에 초대하기 위해서는 Administrator 권한을 줘야 하는듯 합니다. 퍼미션은 조금더 공부를 해봐야할듯 하네요.

 

사용할 기능들을 선택하면 url 자동 생성되고 url 이용하여 연결을 합니다.

URL 생성기는 앱에 대해 선택한 범위와 권한을 기반으로 설치 링크를 생성합니다. 링크를 사용하여 자신의 서버에 앱을 설치하거나 다른 사람이 설치할 수 있도록 공유할 수 있습니다.

 

 

 

여기서  생성된 url 복사합니다 값은 discord app에서 사용할 것입니다.

 

브라우저 주소창에 URL 붙여놓고 실행합니다.

이후 연결할 서버를 선택하고 계속하기를 누릅니다.

 

 

이제 승인을 누르면 생성한 bot 서버가 연결완료 됩니다.

 

 

추가된 아이디를 눌러보면 정보가 표시됩니다.  아이콘을 보니 오프라인으로 표시되어 있네요.

이제 개발을 시작할 준비가 되었습니다.

 

4. bot 토큰 생성 복사하기

아까 개발자 사이트로 돌아가서 Bot 토큰을 생성해 줍니다.

bot 메뉴에서 Reset Token 버튼을 누르면 봇에 대한 Token 생성되며 식별자로 사용됩니다.

 

 

"보안을 위해 토큰은 생성 시 한 번만 볼 수 있습니다. 토큰을 잊어버리거나 액세스 권한을 잃어버린 경우 새 토큰을 다시 생성하세요."

 

라는 문구가 보이네요. 한번만 보여주고 사라지니 저장해놓고 까먹으면 새로 생성해야 합니다.

 

 

5. 개발 코드와 bot 연동 간단 테스트 하기

discord는 개발에 많은 언어를 지원하고 있습니다만 여기서는 파이썬을 사용하도록 하겠습니다. 

 

https://github.com/Rapptz/discord.py

 

GitHub - Rapptz/discord.py: An API wrapper for Discord written in Python.

An API wrapper for Discord written in Python. Contribute to Rapptz/discord.py development by creating an account on GitHub.

github.com

 

 

저는 rocky linux 상에서 python 3.9 사용하고 vscode 구현하였습니다.

 

  • 패키지  설치

 

먼저 discord python 패키지를 설치합니다.

pip3 install discord

 

  • 키값 숨기기

openai key discord bot 토큰이 노출되지 않도록 주의 하세요.

다른 파일에 기록하고 load해서 사용하도록 구현해서 숨겨놓는게 중요하겠죠?

환경변수를 사용하던 json으로 만들던 편한 방식을 사용하세요.

 

저는 토큰값 노출을 막기 위해 리눅스 .bashrc 파일에 정의하고 os.environ.get() 이용하여 가져오는 방식으로 사용하였습니다.

 

 

.bashrc 파일 >

export OPENAI_API_KEY='OPENAI API '

export DISCORD_BOT_TOKEN='디스코드 TOKEN '

 

 

다음 기본 코드는 bot 로그인되면 정보를 표시하고

메시지가 수신되었을 내용을 표시해주는 코드입니다.

 

discord.py는 이벤트 개념을 중심으로 작동합니다. 어떤 메시지가 발생하면 그에 대한 이벤트를 수신하여 응답할 수 있습니다.

 

 

i
mport discord
import os

import discord


discord_bot_token = os.environ.get('DISCORD_BOT_TOKEN')
channel_id = '자신의 채널 번호' #채널에 오른쪽 버튼 누르면 보입니다.

class MyClient(discord.Client):
    async def on_ready(self):
        print(f'Logged on as {self.user}!')
        channel = client.get_channel(int(channel_id))
        await channel.send("hi") #시작하면 무조건 표시

    async def on_message(self, message):        
        if message.author == client.user:
            #봇 자신이 보낸건 처리하지 않기
            print(f'Message from me {message.author}: {message.content}')            
            return

        #$hello 문자열이 들어오면 Hello!로 인사하기
        if message.content.startswith('$hello'):
            await message.channel.send('Hello!')
            print(f'Message from {message.author}: {message.content}')
           

intents = discord.Intents.default()
intents.message_content = True

client = MyClient(intents=intents)
client.run(discord_bot_token)
 

 

 

다음 코드를 수행하면 console 다음과 같은 메시지가 표시됩니다.

이때 discord에서 생성한 서버에 rot 상태가 온라인으로 변경되면 문제 없는 것입니다.

 

2024-06-18 14:08:30 INFO     discord.client logging in using static token

2024-06-18 14:08:32 INFO     discord.gateway Shard ID None has connected to Gateway (Session ID: xx).

 

 

discord에서 생성한 봇에게 DM 날려보니 콘솔에 표시가 됩니다.

 

 

 

6.  chatGPT API 이용해서 챗봇 만들어보기

 

이제 진짜 목적인 챗봇을 만들어 보겠습니다. 

 

먼저 openAI API 사용을 위한 KEY를 발급 받으셔야 합니다.

 

OpenAI 계정 생성 후 Key 발급은 아래에서 하시면 됩니다.

https://platform.openai.com/api-keys

 

openai key 동일하게 .bashrc 파일에 넣고 읽어오는 방식으로 하였습니다.

아래 코드는 이전 대화를 기억하면서 계속 채팅을 이어갈 있도록 구현 하였습니다.

 

chatGPT의 응답을 assistant role로 계속 누적해서 넣어주는 것이죠

 

import discord
import os
from openai import OpenAI

discord_bot_token = os.environ.get('DISCORD_BOT_TOKEN')
openai_api_key = os.environ.get('OPENAI_API_KEY')
channel_id = '자신의 채널 번호' #채널에 오른쪽 버튼 누르면 보입니다.

history_messages = [{"role": "system", "content": "너는 똑똑한 helper"}]

class MyClient(discord.Client):
    async def on_ready(self):
        print(f'Logged on as {self.user}!')
        channel = client.get_channel(int(channel_id))
        await channel.send("난똑똑해! 무엇이든 물어봐~~")

    async def on_message(self, message):        
        if message.author == client.user:
            #봇자신이 보낸건 처리하지 않기
            print(f'Message from me {message.author}: {message.content}')            
            return

        #이전 대화에 현재 질문 추가하기  
        history_messages.append({"role": "user", "content": f"{message.content}"})

        completion = chatClient.chat.completions.create(
            model="gpt-4o",
            messages = history_messages
        )
       
        #chatgpt응답을 assistant role로 다시 전달하기 위해 저장
        response = {"role": "assistant", "content": f"{completion.choices[0].message.content}"}
        history_messages.append(response)
       
        #실제 질문 답변
        answer = completion.choices[0].message.content
        print(response)
        print(answer)
       
        await message.channel.send(answer)
       
                   

intents = discord.Intents.default()
intents.message_content = True

chatClient = OpenAI()
client = MyClient(intents=intents)
client.run(discord_bot_token)
 
 
 

 

이제 시험해보겠습니다.

 

 

 

 

이전 메시지를 기억하는지도 보겠습니다.

 

 

 

만들어진것 같네요~

 

몇줄 안되는 코드로 훌륭한 chatGPT discord bot이 생겼습니다~~~

 

반응형