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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:21