如何让discord.py机器人仅接收特定角色用户的私信?
实现仅接收特定角色用户的私信功能
因为私信是脱离服务器的,要实现这个功能,你得指定一个目标服务器,验证发私信的用户在该服务器中是否持有允许的角色,只有符合条件的用户才会被转发消息。
步骤1:定义关键常量
先在代码开头添加两个常量,替换成你实际的服务器ID和允许的角色ID:
# 替换成你要检查角色的服务器ID TARGET_GUILD_ID = 123456789012345678 # 替换成允许发私信的角色ID(单个或多个都可以) ALLOWED_ROLE_IDS = [987654321098765432]
步骤2:修改on_message事件
更新你的消息处理逻辑,加入角色验证:
@bot.event async def on_message(message): if message.author == bot.user or message.author.id in ignoreusers: return if isinstance(message.channel, discord.DMChannel): # 获取目标服务器对象 guild = bot.get_guild(TARGET_GUILD_ID) if not guild: print("找不到目标服务器,请检查服务器ID是否正确") return # 获取用户在目标服务器中的成员信息 member = guild.get_member(message.author.id) if not member: # 用户不在目标服务器,直接拒绝 await message.author.send("你不在指定服务器内,无法发送私信。") return # 检查用户是否拥有允许的角色 has_permission = any(role.id in ALLOWED_ROLE_IDS for role in member.roles) if not has_permission: await message.author.send("你没有权限发送私信给机器人。") return # 验证通过,转发私信到指定频道 channel = bot.get_channel(1118363617654472805) await channel.send(f"{message.author} sent:\n{message.content}") await bot.process_commands(message)
关键注意点
- ID获取方式:开启Discord的开发者模式后,右键服务器/角色就能复制对应的ID。
- 权限依赖:要在Discord开发者后台的Bot选项中,开启
Server Members Intent(服务器成员意图),否则机器人无法获取服务器成员的角色信息。
内容的提问来源于stack exchange,提问作者Nachos
相关产品推荐
相关产品推荐

