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

Discord.py权限提升命令报错:'int'对象无'id'属性

解决!mod命令的'int' object has no attribute 'id'异常

我一眼就看出问题出在哪了——你调用add_roles的方式完全错误,这才触发了这个异常。让我一步步给你修正并解释:

错误原因分析

你的代码里这一行是核心问题:

await discord.Member.add_roles(392763334052544522, atomic=True)

有两个关键错误:

  1. 调用方式错误:add_roles是discord.Member类的实例方法,必须通过具体的成员对象(也就是你要提升权限的member变量)来调用,而不是直接用discord.Member这个类调用。
  2. 参数类型错误:add_roles需要传入的是discord.Role对象,不是角色ID的整数。当你直接传整数时,Discord.py内部会尝试读取这个对象的id属性,整数显然没有这个属性,所以抛出了'int' object has no attribute 'id'的异常。

修正后的完整代码

@commands.command(name='mod', hidden=True) #仅管理员、机器人角色和服务器创建者可使用
@commands.has_any_role("role1","role2", "role3")
async def mod(self, ctx, member: discord.Member = None):
    try:
        if member is None:
            await ctx.send('请指定要提升权限的用户!')
            return
        
        if member == ctx.author:
            await ctx.send('你已经是管理员了哦!')
            return
        
        # 先通过ID获取Moderator角色对象
        moderator_role_id = 392763334052544522
        moderator_role = ctx.guild.get_role(moderator_role_id)
        
        if not moderator_role:
            await ctx.send(f'找不到ID为{moderator_role_id}的角色,请检查角色ID是否正确!')
            return
        
        # 调用成员实例的add_roles方法,传入角色对象
        await member.add_roles(moderator_role, atomic=True)
        await ctx.send(f'成功将{member.mention}提升为Moderator!')
        
    except Exception as e:
        await ctx.send(f'提升{member}权限时出错:{str(e)}')
        print(f"\n{ctx.author}尝试提升{member}权限时出错。异常信息:{str(e)}")

额外优化说明

  1. 把ctx.message.author简化成了ctx.author,这是Discord.py提供的快捷方式,效果完全一样。
  2. 添加了角色不存在的判断逻辑,避免因为角色ID错误导致新的异常。
  3. 增加了权限提升成功的反馈消息,让用户知道操作完成。
  4. 把member == None改成了更Pythonic的member is None。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:19:58