自動審核機器人
建立自動化審核流程:偵測禁止內容、警告使用者,並對重複違規者執行踢出。這套機制可用 discli 指令在簡單 Python 腳本中完成。
問題背景
Discord 伺服器成長後,垃圾訊息、詐騙連結、低品質訊息會越來越難人工管理。你需要一個即時機制,能即時處理違規、按使用者追蹤違規次數,並逐步升級處置。
解法
用一段 Python 腳本:
- 透過
discli listen持續監聽訊息事件 - 檢查訊息是否命中黑名單(關鍵字、樣式或 AI 分類)
- 用
discli message delete刪除違規訊息 - 以
discli message send提醒使用者 - 對超過次數限制者用
discli member kick
基礎版本無需資料庫,違規次數僅保留在記憶體。
完整可執行範例
#!/usr/bin/env python3"""自動審核機器人 — 用 discli 自動偵測垃圾訊息並執行規則。"""
import jsonimport subprocessimport sysfrom collections import defaultdict
# --- 設定 ---BANNED_WORDS = {"spam", "scam", "phishing", "free nitro", "discord.gg/scam"}WARN_THRESHOLD = 3 # 達到此次數後踢出
def run_discli(*args): """執行 discli 指令並回傳結果。""" result = subprocess.run( ["discli", "-y", *args], capture_output=True, text=True, ) if result.returncode != 0: print(f"[錯誤] discli {' '.join(args)}: {result.stderr.strip()}", file=sys.stderr) return result
def run_discli_json(*args): """執行帶 JSON 輸出的 discli 指令並解析回傳。""" result = subprocess.run( ["discli", "--json", "-y", *args], capture_output=True, text=True, ) if result.returncode != 0: return None try: return json.loads(result.stdout) except json.JSONDecodeError: return None
# 追蹤每位使用者違規次數violations = defaultdict(int)
# 開始監聽所有訊息(可選是否包含 bot)proc = subprocess.Popen( ["discli", "--json", "listen", "--events", "messages"], stdout=subprocess.PIPE, text=True,)
print("自動審核機器人已啟動,按 Ctrl+C 可停止。", file=sys.stderr)
for line in proc.stdout: line = line.strip() if not line: continue
try: event = json.loads(line) except json.JSONDecodeError: continue
content = event.get("content", "").lower() author = event.get("author", "unknown") author_id = event.get("author_id", "") channel_id = event.get("channel_id", "") message_id = event.get("message_id", "") server = event.get("server", "")
# 檢查違規字串 found = [w for w in BANNED_WORDS if w in content] if not found: continue
print(f"[違規] {author} ({author_id}): 命中 {found}", file=sys.stderr)
# 步驟一:刪除違規訊息 run_discli("message", "delete", channel_id, message_id)
# 步驟二:累積違規並升級處理 violations[author_id] += 1 count = violations[author_id]
if count >= WARN_THRESHOLD: # 踢除使用者 run_discli( "member", "kick", server, author_id, "--reason", f"自動化處置:違規次數 {count} 次", ) run_discli( "message", "send", channel_id, f"**{author}** 已因 {count} 次違規而被移除。", ) del violations[author_id] print(f"[已踢除] {author} ({author_id}),已超過 {count} 次違規", file=sys.stderr) else: remaining = WARN_THRESHOLD - count run_discli( "message", "send", channel_id, f"{author},你的訊息已違反伺服器規範而移除。" f"**{remaining}** 次警告後將啟動踢除。", ) print(f"[警告] {author} ({author_id}): {count}/{WARN_THRESHOLD}", file=sys.stderr)逐步解說
設定機器人權限
實際執行審核前,機器人需要以下 Discord 權限:
- 讀取訊息:接收事件串流
- 管理訊息:刪除違規訊息
- 移除成員:移除重複違規使用者
在 Discord 開發者後台,將這些權限加入 bot 的 OAuth2 權限。
使用 discli --profile moderation 可限制機器人僅執行審核相關指令。詳細可參考 安全性與權限。
定義規則
BANNED_WORDS 內放小寫關鍵字,依序比對訊息內容。由於是子字串比對,scam 會同時命中 this is a scam link。
BANNED_WORDS = {"spam", "scam", "phishing", "free nitro"}WARN_THRESHOLD = 3監聽訊息
腳本會以 discli listen --events messages 啟動長生命週期程序,所有訊息會以 JSON 行輸出。
discli --json listen --events messages刪除與警告
偵測到違規後,先用 discli message delete 刪訊息,再發出警告。-y 可略過確認提示。
discli -y message delete CHANNEL_ID MESSAGE_IDdiscli message send CHANNEL_ID "警告訊息內容"升級到踢除
當違規次數達到 WARN_THRESHOLD,改為踢出使用者並寫入稽核紀錄。--reason 會記在 Discord 稽核日誌。
discli -y member kick "My Server" USER_ID --reason "自動化: 3 次違規"邊際案例與陷阱
機器人權限階層。 如果目標成員角色高於機器人角色,Discord 會拒絕踢除。若要避免失敗,將機器人角色置於一般成員之上、但低於管理權限角色。
大量垃圾訊息衝擊。 每秒大量訊息可能使 Bot 對每則都呼叫刪除 API,接近速率限制。若垃圾訊息頻率極高,建議直接封鎖而非逐條警告。
大小寫與 Unicode。 範例用 .lower() 比對,但惡意使用者可混用類似字符規避。上線前可加上 unicodedata.normalize("NFKC", content) 再比對。
記憶體狀態。 violations 僅維持在程序記憶體,重啟後會清空。若要持久化,應寫入 JSON 檔或 SQLite。
擴充方向
AI 內容分析
將關鍵字比對改為 Claude 解析上下文,辨識隱性毒性、內容型詐騙、社交工程手法。可參考 AI 客服代理。
每伺服器差異化規則
從 JSON 組態檔讀取規則,讓每個伺服器可自定義黑名單、警告次數、處置方式。
暫時封鎖
用 discli member ban 加上定時解封,可建立暫時封鎖流程。可在資料庫中記錄封鎖到期時間。
稽核日誌輸出
透過 discli message send "#mod-log" ... 將每筆操作記錄到專門頻道,供管理者快速複盤。