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

