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

