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

Discord.py 如何给私信机器人的服务器用户添加指定角色?

Discord.py 私信场景下给用户添加服务器角色解决方案

原代码问题点

  • 多余属性调用:message.message.author.id 写法错误,message 本身已携带author属性,无需额外嵌套.message
  • 调用不存在的API:Discord.py 无bot.members()方法,需要先获取服务器(Guild)对象,再从服务器中获取成员对象
  • 参数类型错误:add_roles() 方法需要传入Role类型对象,不能直接传入角色ID字符串
  • 权限缺失前提:未开启必要的网关意图(Intents),无法正常获取服务器成员列表和执行角色操作

前置配置要求

首先要在Discord开发者后台开启「Server Members Intent」,同时代码初始化bot时要声明对应意图:

import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.members = True # 必须开启,否则无法获取服务器成员
intents.message_content = True # 必须开启,否则无法读取私信内容

bot = commands.Bot(command_prefix='!', intents=intents)

修正后的功能代码

if isinstance(message.channel, discord.DMChannel) and message.author != bot.user:
    # 直接从message对象取用户ID
    user_id = message.author.id
    # 替换为你的实际服务器ID
    guild_id = 123456789012345678 
    # 替换为你的实际角色ID
    target_role_id = 876543210987654321 

    # 获取服务器对象
    guild = bot.get_guild(guild_id)
    if not guild:
        # 服务器不存在/机器人不在该服务器内时直接返回
        return
    
    # 从服务器中获取成员对象,注意:用户必须已经加入该服务器才能拿到
    member = guild.get_member(user_id)
    if not member:
        await message.channel.send("你未加入对应服务器,无法分配角色")
        return
    
    # 获取角色对象
    target_role = guild.get_role(target_role_id)
    if not target_role:
        return
    
    # 给用户添加角色
    await member.add_roles(target_role)
    await message.channel.send("角色已成功分配")
else:
    return

注意事项

  • 机器人在目标服务器的角色权限必须高于要分配的角色,否则会触发权限不足报错
  • 要分配角色的用户必须已经加入目标服务器,否则无法获取到对应的成员对象
  • 所有ID均为整数类型,不要用字符串包裹

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:15:05