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

Discord机器人开发报错:'str'对象无'id'属性,求封禁功能实现

嘿,我来帮你搞定这个Discord机器人的封禁问题!

首先,你遇到的AttributeError: 'str' object has no attribute 'id'报错原因很明确:你传给bot.kick()的是用户名字符串(message.mentions[0].name),但这个方法需要的是User或Member对象。当方法内部试图访问这个字符串的id属性时,自然就炸了。

另外你的代码还有几个小问题需要调整:

  • 你要的是「封禁」功能,但用了kick()(踢人,用户还能重新加入服务器),应该用ban()才对
  • 角色ID和用户ID你用了字符串,但role.id和message.author.id都是整数,类型不匹配会导致权限判断失效
  • 没处理“用户没@任何人”的情况,这时候message.mentions[0]会直接引发索引错误

下面是修复后的完整代码,我加了注释说明细节:

if message.content.upper().startswith('CHILL BAN'):
    # 把权限相关的ID改成整数,和Discord返回的ID类型保持一致
    allowed_role_ids = {447929519945416734, 448191759739256842}
    admin_user_id = 218156043799101452
    
    # 检查用户是否有指定角色,或者是管理员账号
    has_permission = any(role.id in allowed_role_ids for role in message.author.roles) or message.author.id == admin_user_id
    
    if has_permission:
        # 先确认用户确实@了某个人
        if message.mentions:
            target_member = message.mentions[0]
            # 执行封禁操作,delete_message_days=7会删除用户最近7天的消息,改成0就是不删
            await bot.ban(target_member, delete_message_days=0)
            await bot.send_message(message.channel, f"**{target_member.name}** 已经被封禁啦!")
        else:
            await bot.send_message(message.channel, "麻烦你@一下要封禁的用户哦~")
    else:
        await bot.send_message(message.channel, "抱歉,你没有足够的权限执行这个操作。")

几个关键的修复点再强调下:

  1. 传对参数:直接把message.mentions[0](用户对象)传给bot.ban(),别再传用户名字符串了
  2. 类型匹配:所有ID都用整数,这样权限判断才能正常生效
  3. 容错处理:加了if message.mentions的判断,避免用户没@人时程序崩溃
  4. 功能对齐:用bot.ban()替代kick(),真正实现封禁(用户无法再加入服务器)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:17:47