스팸 방지 디스코드 봇 만들기

2026. 5. 6. 16:56·봇 개발 팁/Discord.py

서버가 조금만 커져도 반복 메시지, 광고 링크, 도배 같은 문제가 바로 들어옵니다.

운영진이 수동으로만 지우기 시작하면 대응이 늦고 기준도 흔들리기 쉽습니다.

초반에는 완벽한 안티스팸 시스템보다 기본 차단선 하나를 자동으로 세워 두는 쪽이 훨씬 안전합니다.

이번 글에서는 짧은 시간 안에 같은 유저가 메시지를 많이 보내면 경고 후 메시지를 정리하는 기본 스팸 방지 봇을 만듭니다.

1. 어떤 기준으로 막을까

스팸 기준을 너무 빡빡하게 잡으면 일반 대화도 막힙니다.

반대로 너무 느슨하면 자동화 의미가 없습니다.

처음에는 아래 정도 기준이 무난합니다.

  • 10초 안에 5개 이상 메시지
  • 같은 내용 반복 전송
  • 초대 링크나 외부 광고 링크 반복 게시

광고성 신고 흐름은 디스코드 신고 채널 운영 가이드와도 같이 봐야 합니다.

2. 기준 채널과 예외 값 넣기

DISCORD_TOKEN=여기에_봇_토큰
LOG_CHANNEL_ID=운영로그채널_ID


스팸 차단 결과를 운영 로그 채널에 남겨 두면 기준을 조정하기 쉬워집니다.

3. 반복 메시지를 잡는 기본 필터 코드

import os
import time
from collections import defaultdict, deque

import discord
from dotenv import load_dotenv

load_dotenv()

TOKEN = os.getenv("DISCORD_TOKEN")
LOG_CHANNEL_ID = int(os.getenv("LOG_CHANNEL_ID"))
WINDOW_SECONDS = 10
MESSAGE_LIMIT = 5

intents = discord.Intents.default()
intents.messages = True
intents.message_content = True
intents.guilds = True
client = discord.Client(intents=intents)
user_message_times: dict[int, deque[float]] = defaultdict(deque)


async def send_log(guild: discord.Guild, lines: list[str]):
    channel = guild.get_channel(LOG_CHANNEL_ID)
    if not isinstance(channel, discord.TextChannel):
        return

    embed = discord.Embed(title="스팸 차단 로그", description="\n".join(lines), color=discord.Color.red())
    await channel.send(embed=embed)


def is_invite_or_link(content: str) -> bool:
    lowered = content.lower()
    return "discord.gg/" in lowered or "http://" in lowered or "https://" in lowered


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


@client.event
async def on_message(message: discord.Message):
    if message.author.bot or message.guild is None:
        return

    now = time.time()
    timestamps = user_message_times[message.author.id]
    timestamps.append(now)

    while timestamps and now - timestamps[0] > WINDOW_SECONDS:
        timestamps.popleft()

    if len(timestamps) >= MESSAGE_LIMIT or (is_invite_or_link(message.content) and len(timestamps) >= 3):
        try:
            await message.channel.purge(limit=MESSAGE_LIMIT, check=lambda m: m.author.id == message.author.id)
        except discord.Forbidden:
            return

        warning_text = f"{message.author.mention} 너무 빠른 반복 메시지가 감지되어 최근 메시지를 정리했습니다."
        await message.channel.send(warning_text, delete_after=5)
        await send_log(
            message.guild,
            [
                f"대상: {message.author.mention}",
                f"채널: {message.channel.mention}",
                f"기준: {WINDOW_SECONDS}초 안에 {MESSAGE_LIMIT}개 이상 메시지",
                f"최근 메시지: {message.content[:100] or '내용 없음'}",
            ],
        )
        timestamps.clear()
        return


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

client.run(TOKEN)


가장 단순한 구조는 시간창 안의 메시지 개수를 세고, 기준을 넘으면 최근 메시지를 정리하는 방식입니다.
실전에서는 링크, 멘션 폭탄, 같은 문자열 반복 여부를 더 세분화할 수 있습니다.

4. 코드에서 먼저 손볼 부분

위 코드는 입문용 기본형이라 그대로 운영에 넣기 전에 기준을 조정해야 합니다.

특히 일반 채팅이 빠른 서버에서는 10초 안에 5개 기준이 너무 빡빡할 수 있습니다.

초반에는 아래 둘을 먼저 조정합니다.

  • WINDOW_SECONDS
  • MESSAGE_LIMIT

5. 도배 패턴부터 먼저 찍어 보기

python main.py


테스트 채널에서 같은 계정으로 빠르게 여러 메시지를 보내 봅니다.
기준을 넘으면 최근 메시지가 정리되고 경고 문구와 로그가 남아야 정상입니다.

6. 기준값 조정에서 흔한 실패

  • 메시지가 안 지워지는 경우 봇에 Manage Messages 권한이 없을 수 있습니다.
  • 일반 대화도 과하게 잡히는 경우 기준이 너무 낮은 경우가 많습니다.

    테스트 서버에서 먼저 값을 조정해야 합니다.
  • 광고 링크를 한두 번만 보내도 안 잡히는 경우 지금 구조는 기본형이라 링크 차단 전용 규칙이 강하지 않습니다.

    다음 글에서 링크 차단을 따로 다루면 더 잘 맞습니다.

7. 운영진 예외 처리를 둘지 결정한다

운영진이 공지나 이벤트 안내를 짧은 시간에 여러 번 보낼 수도 있습니다.

이럴 때까지 잡히면 불편합니다.

그래서 운영진 역할은 예외 처리하거나, 공지 채널은 검사 대상에서 빼야 합니다.

8. 신고 채널과 로그 채널이 같이 있어야 기준을 조정하기 쉽다

스팸 자동 차단은 완벽하지 않습니다.

오탐이 나오거나 놓치는 경우가 반드시 있습니다.

그래서 신고 채널과 운영 로그를 같이 두고 기준을 조금씩 조정하는 쪽이 현실적입니다.

신고 동선은 디스코드 신고 채널 운영 가이드, 기본 로그 구조는 디스코드 로그 기록 봇 만들기과 같이 보면 됩니다.

9. 상시 운영이라 배포가 사실상 필수다

스팸은 사람이 없는 시간에 더 자주 들어옵니다.

그래서 안티스팸 봇은 항상 켜져 있어야 의미가 있습니다.

실제 운영용으로 옮길 때는 24시간 디스코드 봇 무료 호스팅, 디스호스트처럼 상시 실행 환경을 같이 준비해야 합니다.

10. 스팸 기준은 로그와 권한을 함께 봐야 굳어진다

스팸 기본 차단선까지 세웠다면 이제 반복 광고 링크만 더 세게 막는 링크 차단 구조로 넘어갈 수 있습니다.

지금 단계에서 권한과 로그 구조를 다시 점검하고 싶다면 디스코드 서버 보안 설정 체크리스트와 처벌 로그 디스코드 봇 만들기을 함께 보면 됩니다.

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

처벌 로그 디스코드 봇 만들기  (0) 2026.05.04
입장 퇴장 로그 디스코드 봇 만들기  (0) 2026.05.03
디스코드 로그 기록 봇 만들기  (0) 2026.05.02
디스코드 모달 입력창 기본 사용법  (0) 2026.05.01
모달 폼 접수 디스코드 봇 만들기  (0) 2026.04.30
'봇 개발 팁/Discord.py' 카테고리의 다른 글
  • 처벌 로그 디스코드 봇 만들기
  • 입장 퇴장 로그 디스코드 봇 만들기
  • 디스코드 로그 기록 봇 만들기
  • 디스코드 모달 입력창 기본 사용법
디스호스트
디스호스트
쉽고 안정적인 디스코드 봇 호스팅 서비스, 디스호스트의 기술 블로그입니다. 디스호스트는 24시간 구동되는 서버를 통해 디스코드 봇을 대신 구동시켜 드리는 서비스를 제공하고 있습니다.
  • 디스호스트
    디스호스트 기술 블로그
    디스호스트
  • 블로그 메뉴

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

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

티스토리툴바