开发Discord禁言机器人时遇AttributeError错误求助
问题原因
你报错的核心是user变量存的是用户名/用户ID的字符串,而非Discord API提供的Member对象——只有Member对象才具备add_roles方法,字符串类型自然没有这个属性。
修复方案
你需要把字符串转换为对应的Member对象,推荐两种常用实现方式:
方式1:通过消息提及获取用户
如果用户使用命令时是l!mute @用户名的提及格式,可直接从消息提及列表提取:
async def on_message(message): if message.content.startswith('l!mute '): role = message.guild.get_role(***role-id***) # 检查是否有提及目标用户 if not message.mentions: await message.channel.send("请提及要禁言的用户!", reference=message) return user = message.mentions[0] # 获取第一个被提及的用户 await message.channel.send(f"{user.display_name} ro behesh dadam rolee {role.name}", reference=message) await user.add_roles(role)
方式2:通过用户名/ID查找用户
如果用户输入的是纯用户名或用户ID字符串,可用服务器对象的查找方法获取用户:
async def on_message(message): if message.content.startswith('l!mute '): role = message.guild.get_role(***role-id***) user_identifier = message.content.replace("l!mute ", "").strip() guild = message.guild # 直接使用消息所在服务器,无需重复获取 try: # 优先按用户ID查找 user_id = int(user_identifier) user = await guild.fetch_member(user_id) except ValueError: # 按用户名查找(注:用户名可能重复,此处取第一个匹配项) user = next((member for member in guild.members if member.name == user_identifier), None) if not user: await message.channel.send("未找到该用户!", reference=message) return await message.channel.send(f"{user.display_name} ro behesh dadam rolee {role.name}", reference=message) await user.add_roles(role)
额外优化建议
- 无需重复获取频道和服务器:
message.channel和message.guild可直接调用,不用再执行client.get_channel和client.get_guild。 - 用f-string拼接字符串比
+运算符更简洁易读。
内容的提问来源于stack exchange,提问作者BargmyGames
相关产品推荐
相关产品推荐

