디스코드 투표 봇 만들기

2026. 5. 15. 17:00·봇 개발 팁/Discord.py

일정 하나 정하려고 채팅만 수십 개 쌓이고 결론은 끝내 안 나오는 서버라면, 필요한 건 더 많은 의견이 아니라 결정을 수집하는 구조입니다.

투표 봇의 역할은 참여를 유도하는 데서 끝나지 않고, 운영진이 흩어진 반응을 짧게 모으는 데 있습니다.

이 글에서는 슬래시 명령어로 제목과 선택지를 받아 버튼 기반 투표 메시지를 보내는 가장 작은 합의 수집 구조를 만듭니다.

1. 투표는 의견보다 결론이 먼저 필요할 때 쓴다

운영진이 공지를 올리기 전에 멤버 반응을 빠르게 모아야 할 때 잘 맞습니다.

길게 토론하는 것보다 짧게 선택하게 만드는 쪽이 나은 상황이 분명히 있습니다.

예를 들면 아래 상황입니다.

  • 이벤트 날짜 선택
  • 새 채널 개설 여부 투표
  • 역할 색상이나 명칭 선호 조사

공지 구조는 디스코드 공지 채널 운영법, 이벤트 흐름은 디스코드 이벤트 채널 기획법과 같이 보면 잘 맞습니다.

2. 처음에는 선택지 두세 개면 충분하다

선택지가 너무 많으면 오히려 참여율이 낮아집니다.

입문용 투표는 찬성/반대 또는 세 개 안팎 선택지부터 시작하면 됩니다.

3. 입문용 투표는 집계보다 중복 처리 한계부터 안다

지금 글의 기본형은 투표 수를 메모리로만 들고 있습니다.

즉 재시작하면 집계가 초기화되고, 같은 사람이 여러 번 누르는 것도 그대로 반영됩니다.

하지만 버튼 기반 상호작용 흐름을 익히기에는 충분합니다.

실제 운영 단계에서는 저장과 중복 투표 방지를 붙이는 순간부터 이 글과 역할이 달라집니다.

4. 서버 테스트 값 먼저 넣기

DISCORD_TOKEN=여기에_봇_토큰
GUILD_ID=테스트_서버_ID


이 글에서는 서버 단위 슬래시 명령어와 버튼 UI를 같이 씁니다.

5. 제목과 선택지를 바로 투표 패널로 바꾸는 코드

import os

import discord
from discord import app_commands
from dotenv import load_dotenv

load_dotenv()

TOKEN = os.getenv("DISCORD_TOKEN")
GUILD_ID = int(os.getenv("GUILD_ID"))

intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
guild = discord.Object(id=GUILD_ID)


class VoteView(discord.ui.View):
    def __init__(self, option1: str, option2: str):
        super().__init__(timeout=None)
        self.option1 = option1
        self.option2 = option2
        self.counts = {option1: 0, option2: 0}

    @discord.ui.button(label="선택지 1", style=discord.ButtonStyle.primary)
    async def vote_first(self, interaction: discord.Interaction, button: discord.ui.Button):
        self.counts[self.option1] += 1
        await interaction.response.send_message(f"{self.option1}에 투표했습니다.", ephemeral=True)

    @discord.ui.button(label="선택지 2", style=discord.ButtonStyle.secondary)
    async def vote_second(self, interaction: discord.Interaction, button: discord.ui.Button):
        self.counts[self.option2] += 1
        await interaction.response.send_message(f"{self.option2}에 투표했습니다.", ephemeral=True)


@client.event
async def on_ready():
    await tree.sync(guild=guild)
    print(f"로그인 성공: {client.user}")


@tree.command(name="투표", description="간단한 2지선다 투표를 생성합니다.", guild=guild)
@app_commands.describe(title="투표 제목", option1="첫 번째 선택지", option2="두 번째 선택지")
async def create_vote(interaction: discord.Interaction, title: str, option1: str, option2: str):
    view = VoteView(option1, option2)
    view.vote_first.label = option1
    view.vote_second.label = option2

    embed = discord.Embed(title=title, description="아래 버튼을 눌러 투표해 주세요.", color=discord.Color.blurple())
    await interaction.response.send_message(embed=embed, view=view)


if not TOKEN:
    raise ValueError("DISCORD_TOKEN 값이 없습니다.")

client.run(TOKEN)


이 예제는 가장 단순한 2지선다 구조입니다.
버튼을 눌러 반응하게 만들면 일반 채팅보다 훨씬 보기 좋습니다.

6. 공지 전에 눌러 볼 수 있는 패널인지 확인

python main.py


`/투표`를 실행해 제목과 선택지를 넣어 봅니다.
투표 패널이 뜨고 버튼 클릭 시 본인에게만 확인 메시지가 오면 정상입니다.

7. 버튼 상태와 투표 기록에서 자주 막히는 부분

  • 버튼은 보이는데 눌러도 반응이 이상한 경우 뷰 객체 상태를 메모리로만 들고 있어 재시작 후 동작이 달라질 수 있습니다.
  • 슬래시 명령어가 안 보이는 경우 서버 sync 문제나 applications.commands 스코프를 먼저 확인합니다.
  • 중복 투표를 막고 싶은 경우 유저 ID별 기록 저장을 추가해야 합니다.

8. 투표는 참여 기능이 아니라 운영 판단 도구에 가깝다

이벤트 일정이나 운영 변경 공지는 그냥 읽고 지나가도 됩니다.

반면 투표는 눌러야 하므로 누가 어떤 방향을 택했는지 흔적이 남습니다.

그래서 공지 채널, 이벤트 채널, 투표 기능을 같이 써야 합니다.

단순 반응 이모지보다 기준이 선명한 결정을 만들고 싶을 때 특히 그렇습니다.

9. 확장 방향은 뚜렷하다

다음 단계에서는 아래로 쉽게 확장됩니다.

  • 선택지 3개 이상
  • 투표 종료 시간 설정
  • 중복 투표 방지
  • 결과 집계 명령어 추가

처음에는 이 기본형만 돌아가도 충분합니다.

10. 투표 결과는 공지와 이벤트 흐름으로 넘긴다

결정이 모인 뒤 공지와 반복 참여까지 이어 보려면 디스코드 공지 채널 운영법, 디스코드 이벤트 채널 기획법, 디스코드 출석 체크 봇 만들기을 차례로 붙이면 됩니다.

'봇 개발 팁 > Discord.py' 카테고리의 다른 글

디스코드 출석 체크 봇 만들기  (0) 2026.05.14
디스코드 레벨링 봇 만들기  (0) 2026.05.13
초대 링크 추적 디스코드 봇 만들기  (0) 2026.05.09
욕설 필터 디스코드 봇 만들기  (0) 2026.05.08
링크 차단 디스코드 봇 만들기  (0) 2026.05.07
'봇 개발 팁/Discord.py' 카테고리의 다른 글
  • 디스코드 출석 체크 봇 만들기
  • 디스코드 레벨링 봇 만들기
  • 초대 링크 추적 디스코드 봇 만들기
  • 욕설 필터 디스코드 봇 만들기
디스호스트
디스호스트
쉽고 안정적인 디스코드 봇 호스팅 서비스, 디스호스트의 기술 블로그입니다. 디스호스트는 24시간 구동되는 서버를 통해 디스코드 봇을 대신 구동시켜 드리는 서비스를 제공하고 있습니다.
  • 디스호스트
    디스호스트 기술 블로그
    디스호스트
  • 블로그 메뉴

    • 홈
    • 디스호스트 사용 가이드
    • 디스코드 봇 호스팅, 24시간 서버 구동
    • 분류 전체보기 (107) N
      • 디스코드 (9)
      • 디스호스트 가이드 (12)
      • 봇 개발 팁 (42) N
        • Discord.js (11)
        • Discord.py (30) N
      • DiscordJS 개발 튜토리얼 (15)
      • 디스코드 서버 운영 (18)
      • 디스코드 봇 오류 해결 (10)
  • 링크

    • 디스호스트
  • hELLO· Designed By정상우.v4.10.3
디스호스트
디스코드 투표 봇 만들기
상단으로

티스토리툴바