You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Discord Bot实现非封禁式黑名单功能

Discord Bot 黑名单功能实现问题

需求概述

  • 实现黑名单功能,覆盖服务器内/外所有用户
  • 不采用直接封禁策略,给被拉黑用户分配clown角色,限制其仅能在circus专属频道交流
  • 计划通过命令将用户ID存入blacklist.json,检测该文件ID为用户分配角色,但当前逻辑无法正常运行

问题排查与修复方案

1. 优化黑名单文件读写逻辑

确保blacklist.json的读写稳定,避免文件不存在、解析错误等问题:

import json
import os

BLACKLIST_PATH = "blacklist.json"

# 初始化空黑名单文件(若不存在)
def init_blacklist():
    if not os.path.exists(BLACKLIST_PATH):
        with open(BLACKLIST_PATH, "w") as f:
            json.dump([], f)

# 读取黑名单内容
def get_blacklist():
    with open(BLACKLIST_PATH, "r") as f:
        return json.load(f)

# 添加用户ID到黑名单
def add_to_blacklist(user_id):
    blacklist = get_blacklist()
    if user_id not in blacklist:
        blacklist.append(user_id)
        with open(BLACKLIST_PATH, "w") as f:
            json.dump(blacklist, f, indent=4)
        return True
    return False

2. 成员加入时自动检测分配角色

监听on_member_join事件,用户加入服务器时自动检查黑名单并分配角色:

@bot.event
async def on_member_join(member):
    blacklist = get_blacklist()
    # 注意JSON存储的是字符串,需与成员ID字符串匹配
    if str(member.id) in blacklist:
        guild = member.guild
        # 获取clown角色
        clown_role = discord.utils.get(guild.roles, name="clown")
        if clown_role:
            await member.add_roles(clown_role)
            # 发送提示到专属频道
            circus_channel = discord.utils.get(guild.channels, name="circus")
            if circus_channel:
                await circus_channel.send(f"{member.mention} 你已被列入黑名单,仅能在此频道交流。")

3. 批量检测现有服务器成员

添加管理员命令,手动触发对现有成员的黑名单检测:

@bot.command()
@commands.has_permissions(administrator=True)
async def check_blacklist(ctx):
    blacklist = get_blacklist()
    guild = ctx.guild
    clown_role = discord.utils.get(guild.roles, name="clown")
    
    if not clown_role:
        await ctx.send("未找到`clown`角色,请先创建该角色。")
        return
    
    processed_count = 0
    for member in guild.members:
        if str(member.id) in blacklist:
            await member.add_roles(clown_role)
            processed_count += 1
    await ctx.send(f"已为{processed_count}名黑名单成员分配`clown`角色。")

4. 处理服务器外的拉黑用户

通过命令拉黑不在服务器内的用户时,只需将其ID存入黑名单即可——待用户后续加入服务器时,on_member_join事件会自动触发角色分配。

5. 权限与配置检查

  • 确保Bot拥有管理角色权限,且clown角色的层级在Bot角色之下(否则无法为用户分配)
  • 配置circus频道权限:仅允许clown角色发言,其他角色无访问/发言权限

关键注意事项

  • 黑名单存储用户ID时请用字符串类型(JSON无法存储大整数,避免精度丢失)
  • 可在文件读写逻辑中添加try-except块,捕获JSON解析或文件操作异常
  • 确认clown角色、circus频道的名称拼写完全匹配(区分大小写)

内容的提问来源于stack exchange,提问作者L4w1i3t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:32:32