규칙 동의 인증 디스코드 봇 만들기

2026. 4. 22. 16:50·봇 개발 팁/Discord.py

규칙 채널을 읽게만 두고 끝내면 실제로 동의했는지 확인하기 어렵습니다.

서버 규모가 조금만 커져도 규칙 확인 여부와 채널 접근 권한을 분리할 필요가 생깁니다.

이럴 때 가장 많이 쓰는 방식이 버튼을 눌러 규칙 동의를 받고 인증 역할을 여는 구조입니다.

초반에는 복잡한 데이터베이스 없이 버튼 한 번으로 인증 역할을 붙이는 구조부터 만드는 게 안정적입니다.

1. 어떤 구조로 동작하는가

기본 흐름은 단순합니다.

규칙 채널에 안내 메시지를 올리고, 유저가 동의합니다 버튼을 누르면 인증 역할을 붙입니다.

인증 역할이 붙은 뒤에만 일반 채널이 보이도록 권한을 나눕니다.

이 구조는 서버 입구 정리에 먼저 도움이 됩니다.

규칙 채널은 디스코드 서버 규칙 채널 작성법, 역할 계층은 디스코드 역할 설정 완벽 가이드, 관리자 운영진 멤버 봇 역할을 처음부터 정리하는 법에서 먼저 잡아 두면 흐름이 매끈합니다.

2. 준비할 역할과 채널

아래 정도를 먼저 만들어 둡니다.

역할
- 미인증
- 인증완료

채널
- 규칙
- 공지
- 일반채팅


권한은 보통 아래처럼 나눕니다.

미인증
- 규칙 채널 보기 허용
- 공지 채널 보기 허용
- 일반채팅 보기 차단

인증완료
- 규칙 채널 보기 허용
- 공지 채널 보기 허용
- 일반채팅 보기 허용


미인증 역할을 기본 지급으로 두고, 버튼 인증 뒤 `인증완료` 역할을 붙이는 방식이 가장 흔합니다.

3. 인증 채널과 역할 ID 넣기

DISCORD_TOKEN=여기에_봇_토큰
VERIFY_ROLE_ID=여기에_인증완료_역할_ID
RULES_CHANNEL_ID=여기에_규칙채널_ID


버튼 클릭만 처리할 때도 역할 ID는 이름보다 ID로 둬야 안정적입니다.

4. 버튼 인증 흐름을 붙이는 코드

import os

import discord
from dotenv import load_dotenv

load_dotenv()

TOKEN = os.getenv("DISCORD_TOKEN")
VERIFY_ROLE_ID = int(os.getenv("VERIFY_ROLE_ID"))
RULES_CHANNEL_ID = int(os.getenv("RULES_CHANNEL_ID"))

intents = discord.Intents.default()
intents.members = True
client = discord.Client(intents=intents)


class VerifyView(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)

    @discord.ui.button(label="동의합니다", style=discord.ButtonStyle.success, custom_id="verify:agree")
    async def verify_button(self, interaction: discord.Interaction, button: discord.ui.Button):
        if interaction.guild is None:
            await interaction.response.send_message("서버 안에서만 사용할 수 있습니다.", ephemeral=True)
            return

        role = interaction.guild.get_role(VERIFY_ROLE_ID)
        if role is None:
            await interaction.response.send_message("인증 역할을 찾지 못했습니다.", ephemeral=True)
            return

        member = interaction.user
        if not isinstance(member, discord.Member):
            await interaction.response.send_message("멤버 정보를 읽지 못했습니다.", ephemeral=True)
            return

        if role in member.roles:
            await interaction.response.send_message("이미 인증이 완료된 상태입니다.", ephemeral=True)
            return

        try:
            await member.add_roles(role, reason="규칙 동의 인증 완료")
            await interaction.response.send_message("규칙 동의가 확인되었습니다. 이제 일반 채널을 볼 수 있습니다.", ephemeral=True)
        except discord.Forbidden:
            await interaction.response.send_message("봇 권한이 부족해 역할을 지급하지 못했습니다.", ephemeral=True)


@client.event
async def on_ready():
    client.add_view(VerifyView())
    print(f"로그인 성공: {client.user}")


async def send_verify_message(channel: discord.TextChannel):
    embed = discord.Embed(
        title="서버 이용 전 확인",
        description=(
            "규칙을 읽은 뒤 아래 버튼을 눌러 인증을 완료해 주세요.\n"
            "인증이 끝나야 일반 채널이 열립니다."
        ),
        color=discord.Color.green(),
    )
    await channel.send(embed=embed, view=VerifyView())


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

client.run(TOKEN)


버튼이 재시작 뒤에도 동작하게 하려면 `custom_id`가 고정된 persistent view 구조를 써야 합니다.
위 코드는 봇이 켜진 상태에서 버튼 클릭을 처리하는 기본형입니다.

5. 인증 메시지 올리기

처음 한 번은 규칙 채널에 안내 메시지를 보내야 합니다.

임시로 아래 코드를 on_ready() 안에서 한 번만 호출해도 되고, 직접 명령어를 붙여도 됩니다.

channel = client.get_channel(RULES_CHANNEL_ID)
if isinstance(channel, discord.TextChannel):
    await send_verify_message(channel)


메시지가 여러 번 중복으로 올라가지 않게, 실제 운영 전에는 한 번만 실행하고 다시 빼야 합니다.

6. 입구에서 자주 끊기는 지점

  • 버튼은 눌리는데 역할이 안 붙는 경우 봇 역할이 인증완료 역할보다 아래에 있거나 Manage Roles 권한이 없는 경우가 많습니다.
  • 버튼이 회색으로 죽는 경우 재시작 후 persistent view 등록이 안 된 경우가 많습니다.

    custom_id와 client.add_view()를 다시 봅니다.
  • 이미 인증한 유저가 계속 눌리는 경우 중복 지급 자체는 문제 없지만, 안내 문구를 따로 분기해 둬야 합니다.

7. 규칙 동의와 실제 인증은 분리해서 생각한다

이 구조는 엄밀한 본인 확인이 아니라 서버 규칙 동의 확인에 가깝습니다.

이메일 인증이나 외부 계정 연동 같은 강한 인증이 필요한 경우와는 다릅니다.

그래서 초반 커뮤니티 서버에는 충분하지만, 더 강한 인증이 필요하면 다음 단계 구조를 따로 둬야 합니다.

8. 입구 동선과 함께 써야 효과가 난다

규칙 동의 버튼만 만들어 두고 나머지 채널 구조가 흐릿하면 체감 효과가 약합니다.

규칙 읽기, 공지 확인, 자기소개 또는 질문 채널 진입이 자연스럽게 이어져야 합니다.

입구 동선을 다시 정리하려면 디스코드 서버 온보딩 채널 구성 예시와 자동 환영 인사 디스코드 봇 만들기을 묶어서 봐야 합니다.

9. 24시간 켜져 있어야 의미가 있다

인증 버튼은 새 멤버가 들어올 때마다 언제든 눌릴 수 있습니다.

운영용 서버라면 결국 상시 실행 환경이 필요합니다.

배포까지 같이 올릴 계획이라면 24시간 디스코드 봇 무료 호스팅, 디스호스트처럼 별도 서버에서 돌리는 쪽이 현실적입니다.

10. 인증 뒤에 열릴 채널 구조를 같이 본다

규칙 동의 기반 입구 인증까지 만들었다면 다음에는 코드 입력이나 추가 확인 절차가 있는 일반 인증 봇으로 확장할 수 있습니다.

지금 단계에서 권한 문제를 먼저 확인하고 싶다면 디스코드 역할이 지급되지 않을 때 해결법과 Missing Permissions(50013) 오류 해결법을 같이 점검하면 됩니다.

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

반응 역할 디스코드 봇 만들기  (0) 2026.04.21
자동 역할 부여 디스코드 봇 만들기  (0) 2026.04.20
자동 환영 인사 디스코드 봇 만들기  (0) 2026.04.19
디스코드 슬래시 명령어 권한 설정법  (0) 2026.03.31
슬래시 명령어 디스코드 봇 만드는 법, 파이썬 discord.py app_commands 입문  (0) 2026.03.28
'봇 개발 팁/Discord.py' 카테고리의 다른 글
  • 반응 역할 디스코드 봇 만들기
  • 자동 역할 부여 디스코드 봇 만들기
  • 자동 환영 인사 디스코드 봇 만들기
  • 디스코드 슬래시 명령어 권한 설정법
디스호스트
디스호스트
쉽고 안정적인 디스코드 봇 호스팅 서비스, 디스호스트의 기술 블로그입니다. 디스호스트는 24시간 구동되는 서버를 통해 디스코드 봇을 대신 구동시켜 드리는 서비스를 제공하고 있습니다.
  • 디스호스트
    디스호스트 기술 블로그
    디스호스트
  • 블로그 메뉴

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

    • 디스호스트
  • hELLO· Designed By정상우.v4.10.3
디스호스트
규칙 동의 인증 디스코드 봇 만들기
상단으로

티스토리툴바