discord.py 反应角色报错:'int'对象无'guild'属性
问题解决:AttributeError: 'int' object has no attribute 'guild'
你遇到的错误根源在于:payload.user_id返回的是整数类型的用户ID,并非Discord的Member或User对象,所以不存在guild属性。要实现反应角色功能,必须先获取服务器内的成员实例,再进行角色操作。
修正步骤:
- 通过
payload.guild_id获取对应的服务器(Guild)对象 - 借助服务器对象获取用户的
Member实例(只有Member对象支持添加角色的操作) - 增加判断逻辑:跳过机器人自身的反应,避免无效操作
修正后的代码片段:
@commands.Cog.listener() async def on_raw_reaction_add(self, payload): reaction_message_id = 1067231301452701748 # 跳过机器人自身的反应 if payload.user_id == self.bot.user.id: return if reaction_message_id != payload.message_id: return user_reaction = str(payload.emoji) if user_reaction == '<a:rose-1:1066240347769942066>': # 获取服务器对象 guild = self.bot.get_guild(payload.guild_id) if not guild: return # 服务器不存在则终止 # 获取成员对象 member = guild.get_member(payload.user_id) if not member: # 若缓存无成员数据,从API拉取(需处理速率限制) try: member = await guild.fetch_member(payload.user_id) except: return # 获取目标角色 role = discord.utils.get(guild.roles, name="Red") if role: await member.add_roles(role)
额外注意事项:
- 确保机器人拥有管理角色的权限,否则无法执行添加角色的操作
- 若
guild.get_member返回None,使用await guild.fetch_member(payload.user_id)可以从Discord API拉取最新成员数据,但要注意API调用的速率限制
内容的提问来源于stack exchange,提问作者ACE
相关产品推荐
相关产品推荐

