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

如何让Discord机器人忽略特定角色用户的私信?

解决Discord机器人忽略指定角色用户私信的问题

首先,你的代码存在两个核心问题:

  • 私信场景下,message.author.roles仅包含用户的私有频道角色,无法直接获取服务器角色,必须先通过服务器ID获取用户在对应服务器的成员对象
  • 原代码中role in message.author.roles的判断逻辑错误,不能直接用字符串列表和角色对象集合做比对

修改后的完整代码

# 定义需要忽略的角色名称
IGNORE_ROLES = ['Waiting', 'RadioMute']
# 定义需要检查的服务器ID(替换成你的目标服务器ID)
TARGET_GUILD_ID = 1234567890
IGNORE_USERS = []

@bot.event
async def on_message(message):
    # 忽略机器人自身消息和指定用户
    if message.author == bot.user or message.author.id in IGNORE_USERS:
        await bot.process_commands(message)
        return

    # 仅处理私信消息的角色检查
    if isinstance(message.channel, discord.DMChannel):
        # 获取目标服务器对象
        target_guild = bot.get_guild(TARGET_GUILD_ID)
        if not target_guild:
            print("无法找到目标服务器,请检查服务器ID是否正确")
            await bot.process_commands(message)
            return
        
        # 获取用户在目标服务器的成员对象
        member = target_guild.get_member(message.author.id)
        if member:
            # 检查用户是否包含需要忽略的角色
            has_ignored_role = any(role.name in IGNORE_ROLES for role in member.roles)
            if has_ignored_role:
                await bot.process_commands(message)
                return
        
        # 转发私信到指定频道(替换成你的目标频道ID)
        target_channel = bot.get_channel(9876543210)
        if target_channel:
            await target_channel.send(f"{message.author} 发送了私信:\n{message.content}")
    
    await bot.process_commands(message)

关键改动说明

  • 新增TARGET_GUILD_ID:指定要检查角色的服务器ID,因为用户可能加入多个服务器,必须明确检查哪个服务器的角色
  • 私信场景下先获取服务器成员:通过target_guild.get_member(message.author.id)拿到用户在目标服务器的成员信息,才能获取到服务器角色
  • 角色检查逻辑:用any(role.name in IGNORE_ROLES for role in member.roles)遍历用户的所有角色,判断是否包含需要忽略的角色名称
  • 优化转发逻辑:合并了重复的转发代码,避免重复发送消息

注意事项

  • 确保机器人在目标服务器中有查看成员角色的权限
  • 替换代码中的TARGET_GUILD_ID和目标频道ID为你实际的ID
  • 如果需要检查多个服务器,可以循环遍历多个服务器ID进行判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:43:19