스팸을 막기 시작하면 그다음 바로 걸리는 것이 광고 링크입니다.
반복 도배보다 더 자주 들어오는 경우도 많고, 초대 링크 하나만 남기고 빠지는 식의 유입도 흔합니다.
이럴 때는 일반 스팸 감지와 별도로 링크 차단 규칙을 하나 두면 운영이 훨씬 편합니다.
이번 글에서는 디스코드 초대 링크와 외부 URL을 감지해 삭제하고 운영 로그에 남기는 기본 링크 차단 봇을 만듭니다.
1. 링크 차단은 왜 따로 두는가
스팸 방지 규칙만으로는 링크 광고를 깔끔하게 다루기 어렵습니다.
메시지 개수는 적어도 광고 효과가 큰 경우가 있기 때문입니다.
그래서 아래 둘을 분리해서 생각해야 합니다.
- 빠른 반복 메시지 차단
- 링크 포함 메시지 차단
기본 스팸 흐름은 스팸 방지 디스코드 봇 만들기에서 먼저 정리했습니다.
2. 어떤 링크를 막을지 먼저 정한다
처음에는 너무 복잡하게 가면 안 됩니다.
대부분 서버는 아래 두 종류부터 막으면 충분합니다.
discord.gg,discord.com/invite형태 초대 링크http://,https://가 들어간 일반 외부 링크
운영용 서버라면 공지 채널이나 관리자 채널은 예외로 두는 경우가 많습니다.
3. 차단할 채널과 예외 값 정리
DISCORD_TOKEN=여기에_봇_토큰
LOG_CHANNEL_ID=운영로그채널_ID
링크 삭제 사실을 기록해 두려면 로그 채널 하나는 같이 둬야 합니다.
4. URL 감지와 삭제 흐름 코드
import os
import re
import discord
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv("DISCORD_TOKEN")
LOG_CHANNEL_ID = int(os.getenv("LOG_CHANNEL_ID"))
INVITE_PATTERN = re.compile(r"(discord\.gg/|discord\.com/invite/)", re.IGNORECASE)
URL_PATTERN = re.compile(r"https?://", re.IGNORECASE)
intents = discord.Intents.default()
intents.messages = True
intents.message_content = True
intents.guilds = True
client = discord.Client(intents=intents)
async def send_log(guild: discord.Guild, lines: list[str]):
channel = guild.get_channel(LOG_CHANNEL_ID)
if isinstance(channel, discord.TextChannel):
embed = discord.Embed(title="링크 차단 로그", description="\n".join(lines), color=discord.Color.orange())
await channel.send(embed=embed)
def has_blocked_link(content: str) -> bool:
return bool(INVITE_PATTERN.search(content) or URL_PATTERN.search(content))
@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
if not has_blocked_link(message.content):
return
try:
await message.delete()
await message.channel.send(
f"{message.author.mention} 외부 링크 또는 초대 링크는 이 채널에서 허용되지 않습니다.",
delete_after=5,
)
await send_log(
message.guild,
[
f"대상: {message.author.mention}",
f"채널: {message.channel.mention}",
f"내용: {message.content[:150] or '내용 없음'}",
],
)
except discord.Forbidden:
print("링크 메시지를 삭제할 권한이 없습니다.")
if not TOKEN:
raise ValueError("DISCORD_TOKEN 값이 없습니다.")
client.run(TOKEN)
기본형은 단순합니다.
메시지에 링크 패턴이 보이면 삭제하고, 짧은 경고와 로그를 남깁니다.
5. 먼저 손볼 만한 부분
위 코드는 입문용이라 모든 채널을 동일하게 검사합니다.
실운영에서는 공지 채널, 관리자 채널, 제휴 채널 같은 예외를 두는 경우가 많습니다.
예를 들어 아래처럼 확장할 수 있습니다.
- 특정 채널 ID는 검사 제외
- 특정 역할은 예외 처리
- 디스코드 초대 링크만 막고 일반 URL은 허용
6. 허용 링크와 차단 링크를 같이 확인
python main.py
테스트 채널에서 일반 링크와 디스코드 초대 링크를 각각 보내 봅니다.
메시지가 삭제되고 경고 문구와 로그가 남으면 정상입니다.
7. 정규식과 예외 처리에서 자주 막히는 곳
- 링크가 안 지워지는 경우 봇에
Manage Messages권한이 없는 경우가 많습니다. - 공지 채널에서도 삭제돼 버리는 경우 채널 예외 처리를 아직 안 넣은 상태일 수 있습니다.
discord.com/invite는 잡는데 단축 주소를 놓치는 경우 정규식 패턴을 조금 더 넓혀야 할 수 있습니다.
8. 스팸 방지와 같이 써야 의미가 커진다
링크 차단만 있고 반복 메시지 차단이 없으면 운영 체감이 반쪽입니다.
반대로 반복 메시지 차단만 있고 링크 규칙이 없으면 광고 대응이 늦습니다.
그래서 보통은 스팸 방지 디스코드 봇 만들기와 묶어서 쓰면 좋습니다.
9. 신고 흐름과 로그도 같이 본다
오탐이나 예외 상황은 반드시 생깁니다.
삭제 사실을 로그로 남기고, 필요하면 신고나 문의 채널에서 복구 요청을 받을 수 있게 둬야 합니다.
운영 기준은 디스코드 신고 채널 운영 가이드, 기본 로그 구조는 디스코드 로그 기록 봇 만들기과 같이 보면 좋습니다.
10. 링크 차단 뒤에는 스팸 로그까지 붙여 본다
링크 차단까지 붙였다면 다음에는 금칙어와 욕설처럼 텍스트 필터를 다루는 흐름으로 이어갈 수 있습니다.
지금 단계에서 보안 설정을 다시 점검하고 싶다면 디스코드 서버 보안 설정 체크리스트와 처벌 로그 디스코드 봇 만들기을 같이 보면 됩니다.
'봇 개발 팁 > Discord.py' 카테고리의 다른 글
| 스팸 방지 디스코드 봇 만들기 (0) | 2026.05.06 |
|---|---|
| 처벌 로그 디스코드 봇 만들기 (0) | 2026.05.04 |
| 입장 퇴장 로그 디스코드 봇 만들기 (0) | 2026.05.03 |
| 디스코드 로그 기록 봇 만들기 (0) | 2026.05.02 |
| 디스코드 모달 입력창 기본 사용법 (0) | 2026.05.01 |