如何让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
相关产品推荐
相关产品推荐

