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

Discord.py实现私聊触发服务器身份组分配时报User无guild属性问询

错误产生原因
  • 你是在用户发DM私信的场景下触发逻辑,此时message.author返回的是User类型的全局用户对象,该对象没有guild属性,只有服务器内的消息发送者才会返回携带服务器属性的Member对象,因此调用message.author.guild直接触发属性不存在报错。
  • 原代码逻辑顺序错误:你先尝试调用不存在的guild对象获取角色,再去获取目标服务器实例,逻辑倒置,角色必须从目标服务器实例中获取。
  • 原代码未定义member变量就直接调用member.add_roles(),即使解决了第一个报错,运行到此处也会抛出名称错误。
修复后可运行代码

请先确认机器人已经加入目标服务器,且拥有「管理角色」权限,同时你要分配的身份组排序低于机器人自身的身份组。

@bot.event
async def on_message(message):
    # 过滤机器人自身消息
    if message.author.bot:
        return
    # 匹配指定触发口令
    elif message.content.startswith("++neunundvierzig++"):
        # 第一步先获取目标服务器实例
        target_guild = bot.get_guild(816021180435529758)
        if not target_guild:
            await message.channel.send("无法找到目标服务器,请确认机器人已加入服务器")
            return
        # 第二步从目标服务器中获取对应用户的Member实例
        member = target_guild.get_member(message.author.id)
        # 未缓存的成员使用fetch接口拉取
        if not member:
            try:
                member = await target_guild.fetch_member(message.author.id)
            except:
                await message.channel.send("你不在目标服务器中,无法分配身份组")
                return
        # 第三步从目标服务器中获取指定身份组
        role = target_guild.get_role(861543456908640298)
        if not role:
            await message.channel.send("无法找到指定身份组")
            return
        # 分配身份组
        await member.add_roles(role)
        await message.channel.send("Erfolgreich Zerifiziert!")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:21:00