음악재생 디스코드 봇, wasureta 개발기1

2026. 1. 10. 12:51개발일지

 

디스코드 봇 개발기

개발일지로는 처음으로 쓰는 글이네요. 말은 참 개발을 하고 싶지만, 할 줄 아는 게 없다는 핑계로 자꾸 미루기만 하게 되었었는데, 그냥 할 줄 아는 거로만 한 번 해보자라는 생각으로 시작했어요.

 

 

1. 만들게된 계기

디스코드를 중학생 때부터 몇 년 사용하다 보니, 음악 봇이 참 필요한데, 맨날 알 수 없는 이유로 지원 중단되면서, 몇 개월에 한 번씩 다른 봇으로 갈아 탔어야 했어요. 그 점이 되게 불편하게 느껴졌고, 왜 안 되는지도 궁금하기도 해서, 직접 음악 재생하는 봇을 만들어보기로 했어요.

만들기 시작한 건, 2024년 11월, 중간고사가 막 끝났을 시점이였어요. 그게 또, 기말이 지나고, 계절이 지나고, 띵가띵가 하다보니 1월이 되었네요. 이걸 처음 시작할 때는, git을 쓰는 방법조차 몰랐어요. 그냥 알고리즘만 좀 할 줄 아는 사람으로써, 파이썬 이외의 언어는 모르기도 했고요.

 

 

2. 만들면서

디스코드 봇 제작 사이트 이쪽에서 자신의 봇을 등록할 수 있어요.

그래서, 언어는 파이썬을 사용 했어요, discord.py가 있어서, 이걸 통해서 개발했어요. 기본적으로, 로컬에 있는FFmpeg라는 프로그램을 통해서, 영상을 다운로드 해와서, 그것을 디스코드 봇으로 스트리밍 해주는 구조예요.

FFmpeg라는 프로그램으로 되게 많은 데이터를 긁어올 수 있어요. 영상의 길이부터, 좋아요, 재생 수와 같은 정보나, 영상 설명란의 정보들까지, 하지만, 그 중에서 필요한 건 오디오 정보이죠.

with yt_dlp.YoutubeDL(self.yt_dl_opts) as ydl:
    video_data = ydl.extract_info(url, download=False)

url_data = video_data['url']
music_info = discord.FFmpegPCMAudio(url_data, executable="로컬 위치", **self.ffmpeg_options)
ctx.guild.voice_client.play(music_info)

이 정보를 music_info에 담은 뒤에, 그걸 재생하는게 핵심코드예요. (많이 생략하긴 했지만, 뭐 자세한 건 더 전문적인 블로그들이 많으니까...),

아무튼, 로컬에서 돌리는 것이다 보니까, 한계점이 있긴 해요.

FFmpeg로는 단일 영상의 정보뿐만 아니라, 플레이리스트의 정보도 가져올 수 있더라고요. 다른 봇들의 불편한 점을 고치고자, 제가 만든 봇은, 검색어를 입력하면, 검색 결과를 5개 보여주면서 그 중에서 원하는 곡을 선택할 수 있고, 그렇지 않고, 유튜브 링크를 가져오면, 바로 그 영상을 보여주면서, 플레이리스트를 가져오면, 그 곡들을 재생할 수 있도록, 다방면으로 한 번 만들어봤어요.

다른 기능들도 있는데, 그건 깃허브에 설명서를 올려놨으니, 관심있으시면 그 쪽에서 확인해주세요.

플레이리스트의 경우, 첫 곡을 우선적으로 다운로드 받아서 일단 재생시키고, 나머지를 비동기적으로 다운로드 받는 방식을 택했는데, 이로 인해서, 와장창 다운로드 받는 도중에는, 재생하고 있던 곡이 잠시 끊기는 문제가 발견되었어요. 하지만, 아직 이 문제를 해결하진 못 했어요. 다른 상용 봇들도 재생 중간중간에 잠시 끊기는 문제가 있었는데, 이게 아마 비동기적으로 다운로드 받는 문제 때문이였겠다고 생각이 되네요. 서버 별로 데이터는 나눠뒀지만, 동작은 한 군데에서 몰아서 하니까, 다른 서버에서 플리를 올린 것이 전 서버에 영향을 미칠 것으로 생각이 되서 좀 걱정되는군요.

 

 

3. Mysql 연동

사실 뭐 DB를 처음 써 봤는데, 생각보다 그렇게 어렵지는 않더라고요. 기본적인 CRUD구문을 배워서 쓰는 것은 하루면 배우는 거 같아요.

load_dotenv()
ID = os.getenv("ID")
PW = os.getenv("PW")

#연결
connect = pymysql.connect(
   host = "localhost",
   user = ID,
   password = PW,
   port = 3306 #mysql 전용 port
)

#커서 생성
cursor = connect.cursor()

#예시
cursor.execute(SELECT * FROM mysql.users);

뭐 이렇게 하면 연결되요. 그래서, 처음에는 로컬에 큐를 전부 딕셔너리에 키값으로 저장하고 있었는데, 점점 인덱스 번호 찾기도 어려워지고, 실행할 때마다 데이터가 날라가는 문제가 싹 해결되었어요. 생각보다 쉽고 좋네요.

 

 

4. 호스팅

사실 이게 젤 큰 문제였어요. 처음에는, AWS EC2를 이용해서, 봇을 돌릴려고 했어요. AWS는 12개월 무료인가로 클라우드를 이용할 수 있어서, 적절한 선택지였어요. 다른 봇들이였다면, 이걸로 돌리기에 충분 했을 거예요. 하지만, 오류 메세지가 떴고, 그 정확한 원인을 모르겠지만, AWS나 GCP같은 대규모 서버의 ip를 유튜브에서 차단한 것으로 추정하고 있어요. 아무래도, FFmpeg는 로컬에 있는 프로그램으로, 내 계정의 이름으로, 유튜브에서 정보를 추출해오는 것이기 때문에, 로컬에서는 내 pc에 로그인 된 계정으로 긁어오면 되었지만, 클라우드에선 그게 안 되는 거 같아요.

임시 방편으로, 내 유튜브에서 쿠키를 뜯어와서 그 쿠키를 사용하면 된다는 글을 봐서 그렇게 했지만, 그랬더니, 한 번 정도 되다가, 제 pc의 구글 계정이 로그아웃 되고, 클라우드 쪽도 쿠키가 막히면서, 안 되더라고요.

구매해서 작동 중인, 라즈베리파이5 8GB

그래서, 그냥 로컬에서 돌리기로 생각했어요. 이왕 나중에도 쓸 거 같으니까 라즈베리파이 하나 장만 해서, 우분투를 설치해서, 그 우분투에 프로그램을 넣어서, 현재는 집에서 라즈베리파이로 24시간 돌리고 있어요. 이 정도 코드로는 라즈베리파이로 돌리는데 크게 무리는 없는 거 같아요. 애초에 대규모 봇을 지향한 것이 아니라, 소규모 봇으로, 서버마다 재생횟수도 알려주고 그 곡을 넣을 수 있게 하자는 게 이 봇의 메인 기능이기 때문에 말이예요.

 

 

5. 마치면서

아무튼 대충 베타버전을 만들어서, 친구들과 잘 쓰고 있어요. 버그나 개선사항 있으면 알려주시면 감사하겠습니다.

Wasureta bot 사용하기 아직 뭐 beta버전이긴한데 서버에 추가해서 사용해보세요!

tmi로 봇 이름이 Wasureta인 것은, 신원미상이라는 지메 유튜버의 놀라운 와수레타 플레이 영상에서 따왔습니다.

별 거 없는 코드긴 하지만, 깃헙은 여기 있습니다.

https://github.com/SodiumD5/discord_bot_wasureta