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, "抱歉,你没有足够的权限执行这个操作。")
几个关键的修复点再强调下:
- 传对参数:直接把
message.mentions[0](用户对象)传给bot.ban(),别再传用户名字符串了 - 类型匹配:所有ID都用整数,这样权限判断才能正常生效
- 容错处理:加了
if message.mentions的判断,避免用户没@人时程序崩溃 - 功能对齐:用
bot.ban()替代kick(),真正实现封禁(用户无法再加入服务器)
内容的提问来源于stack exchange,提问作者RaD Plays
相关产品推荐
相关产品推荐

