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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:25:24