새 멤버가 서버에 들어왔을 때 아무 반응이 없으면 입구가 비어 있는 느낌이 납니다.
반대로 환영 문구가 너무 길거나 여러 채널로 동시에 날아오면 부담스럽습니다.
자동 환영 인사 봇은 단순하지만 서버 첫인상을 크게 바꾸는 기능입니다.
처음에는 공개 환영 메시지 하나와 간단한 DM 안내 정도만 자동화해 두는 구성이 가장 안정적입니다.
1. 기본 뼈대부터 먼저 맞춘다
기본 파이썬 봇과 토큰 분리는 이미 끝난 상태를 기준으로 갑니다.
아직 기본 구조가 없다면 파이썬 디스코드 봇 만들기 처음부터 끝까지, discord.py 입문 가이드와 .env 환경변수로 디스코드 토큰 숨기기, 하드코딩 없이 안전하게 관리하는 법부터 먼저 맞춰 둬야 합니다.
입구 채널 구조를 아직 안 정했다면 디스코드 서버 온보딩 채널 구성 예시도 같이 열어 두면 흐름이 잘 맞습니다.
2. Members Intent를 먼저 켠다
멤버 입장 이벤트를 받으려면 Server Members Intent가 필요합니다.
코드만 맞고 Portal 설정이 빠져 있으면 on_member_join이 아예 실행되지 않습니다.
Discord Developer Portal에서 아래 순서로 켭니다.
Your Application -> Bot -> Privileged Gateway Intents
- SERVER MEMBERS INTENT 활성화
- 저장
이 설정을 놓치면 코드가 조용히 멈추는 것처럼 보여서 처음에 많이 막힙니다.
3. 입장 이벤트에 필요한 패키지 준비
pip install -U discord.py python-dotenv
이미 기본 봇을 만든 상태라면 설치가 끝나 있을 수 있습니다.
그래도 버전이 애매하면 한 번 더 올려 두면 됩니다.
4. .env 파일 예시
DISCORD_TOKEN=여기에_봇_토큰
WELCOME_CHANNEL_ID=여기에_환영채널_ID
RULES_CHANNEL_ID=여기에_규칙채널_ID
NOTICE_CHANNEL_ID=여기에_공지채널_ID
채널 ID는 개발자 모드를 켠 뒤 채널 우클릭으로 복사하면 됩니다.
문구 안에서 채널 멘션을 안정적으로 쓰려면 이름보다 ID가 낫습니다.
5. 공개 환영과 DM 안내를 같이 보내는 코드
import os
import discord
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv("DISCORD_TOKEN")
WELCOME_CHANNEL_ID = int(os.getenv("WELCOME_CHANNEL_ID"))
RULES_CHANNEL_ID = int(os.getenv("RULES_CHANNEL_ID"))
NOTICE_CHANNEL_ID = int(os.getenv("NOTICE_CHANNEL_ID"))
intents = discord.Intents.default()
intents.members = True
auto_reply_color = discord.Color.blue()
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f"로그인 성공: {client.user}")
@client.event
async def on_member_join(member: discord.Member):
welcome_channel = client.get_channel(WELCOME_CHANNEL_ID)
rules_channel = client.get_channel(RULES_CHANNEL_ID)
notice_channel = client.get_channel(NOTICE_CHANNEL_ID)
if welcome_channel is not None:
embed = discord.Embed(
title="새 멤버가 들어왔습니다",
description=(
f"{member.mention} 님, 환영합니다.\n"
f"먼저 {rules_channel.mention if rules_channel else '#규칙'} 채널을 확인하고,\n"
f"공지 사항은 {notice_channel.mention if notice_channel else '#공지'} 채널에서 볼 수 있습니다."
),
color=auto_reply_color,
)
embed.set_thumbnail(url=member.display_avatar.url)
await welcome_channel.send(embed=embed)
try:
await member.send(
"서버에 오신 것을 환영합니다.\n"
"먼저 규칙과 공지를 확인한 뒤 질문 채널을 이용해 주세요."
)
except discord.Forbidden:
print(f"DM 전송 실패: {member}")
if not TOKEN:
raise ValueError("DISCORD_TOKEN 값이 없습니다.")
client.run(TOKEN)
핵심은 `intents.members = True`와 `on_member_join` 이벤트입니다.
입장 직후 공개 채널 메시지와 DM을 같이 보내되, DM 실패는 자주 나오는 문제라 예외 처리를 넣어 둬야 합니다.
6. 입장 이벤트부터 순서대로 확인
아래 순서로 보면 빠릅니다.
- 봇을 서버에 초대했는가
- 봇 역할에 환영 채널 보기와 메시지 보내기 권한이 있는가
- Portal에서
SERVER MEMBERS INTENT를 켰는가 .env채널 ID가 실제 채널과 맞는가
실행은 아래처럼 합니다.
python main.py
테스트할 때는 부계정이나 테스트 서버를 쓰는 쪽이 훨씬 수월합니다.
실서버에서 계속 들락날락하면 기존 멤버 알림이 섞이기 쉽습니다.
7. 환영 흐름에서 자주 끊기는 지점
- 환영 채널에 아무 메시지도 안 오는 경우
WELCOME_CHANNEL_ID가 틀렸거나 봇 권한이 부족한 경우가 많습니다. on_member_join자체가 안 도는 경우 대부분SERVER MEMBERS INTENT설정 누락입니다.- DM만 실패하는 경우 유저가 서버 멤버 DM 차단을 켠 경우가 많습니다.
이 경우는 공개 환영 메시지만 보내도 충분합니다.
8. 문구는 짧게 유지해야 읽힌다
환영 메시지에 규칙, 공지, 자기소개, 이벤트, 질문 채널까지 한 번에 다 넣으면 오히려 안 읽힙니다.
처음에는 아래 세 가지 정도만 넣으면 충분합니다.
- 환영 인사
- 규칙 채널 안내
- 공지 또는 질문 채널 안내
온보딩 세부 구조는 사람이 읽는 채널 문구에서 정리하고, 봇은 첫 진입 한 번만 도와주면 됩니다.
9. 24시간 돌릴 계획이라면 서버가 필요하다
환영 봇은 멤버가 언제 들어올지 모르기 때문에 노트북을 끄면 바로 의미가 없어집니다.
상시 운영용 기능은 결국 계속 켜져 있는 서버 위에 올려 두어야 합니다.
배포 단계까지 바로 올릴 생각이라면 24시간 디스코드 봇 무료 호스팅, 디스호스트처럼 별도 서버에 두는 쪽이 현실적입니다.
10. 환영 메시지 뒤에는 역할과 입구를 본다
환영 메시지까지 자동화했다면 다음에는 입장 직후 역할을 자동으로 붙이는 흐름으로 이어갈 수 있습니다.
지금 단계에서 역할 구조를 먼저 다시 확인하고 싶다면 디스코드 역할 설정 완벽 가이드, 관리자 운영진 멤버 봇 역할을 처음부터 정리하는 법과 디스코드 봇 권한 설정법, 50013과 50001을 막는 기본 구조 정리을 먼저 맞춰 둬야 합니다.
'봇 개발 팁 > Discord.py' 카테고리의 다른 글
| 디스코드 슬래시 명령어 권한 설정법 (0) | 2026.03.31 |
|---|---|
| 슬래시 명령어 디스코드 봇 만드는 법, 파이썬 discord.py app_commands 입문 (0) | 2026.03.28 |
| 파이썬 .env 환경변수로 디스코드 토큰 숨기기, 하드코딩 없이 안전하게 관리하는 법 (0) | 2026.03.27 |
| 디스코드 봇 초대 링크 생성법, 권한이 꼬이지 않게 링크 만드는 방법 (0) | 2026.03.26 |
| Message Content Intent 설정법, 디스코드 봇이 명령어를 읽지 못할 때 먼저 볼 것 (0) | 2026.03.23 |