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

开发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:15:09