Discord.py on_message事件角色分配失败及命令无限重复执行问题求助
问题排查与解决
让我们一步步解决你遇到的两个问题:
1. AttributeError: 'NoneType' object has no attribute 'id'
这个错误的核心是discord.utils.get(msg.guild.roles, name="Muted")返回了None——机器人找不到你指定的"Muted"角色。以下是排查方向和修复方案:
- 检查角色名称准确性:确保服务器中确实存在名为
Muted的角色,注意大小写、空格和特殊字符必须完全匹配(比如"muted"和"Muted"会被视为不同角色)。 - 验证机器人权限:给机器人分配「管理角色」权限,并且确保机器人的角色位置高于
Muted角色(否则机器人没有权限给用户添加该角色)。 - 添加空值判断逻辑:在执行添加角色操作前先检查角色是否存在,避免报错:
role = discord.utils.get(msg.guild.roles, name="Muted") if role is not None: await msg.author.add_roles(role) else: await msg.channel.send("⚠️ 错误:未找到Muted角色,请先创建该角色!")
2. 命令无限重复执行
这个问题由两个潜在原因导致,我们逐一修复:
原因1:bot.process_commands的缩进错误
你贴出的代码中,await bot.process_commands(msg)没有缩进在on_message函数内部!这会导致命令处理逻辑混乱。正确的做法是将其放在函数末尾,确保无论是否触发坏词检测,都能正常处理命令。
原因2:机器人触发自循环
如果你的敏感词列表包含机器人提示消息中的内容(比如"bad"、"muted"),机器人发送的提示会再次触发on_message事件,导致无限循环。解决方法是在事件开头过滤掉机器人自身的消息。
修复后的完整on_message代码:
@bot.event async def on_message(msg): # 过滤机器人自身的消息,避免自循环 if msg.author.bot: return for badword in file: if badword in msg.content.lower(): role = discord.utils.get(msg.guild.roles, name="Muted") if role is not None: await msg.author.add_roles(role) await msg.delete() await msg.channel.send(f'{msg.author.mention}! That was a bad word! You have been muted!') # 处理完违规消息后提前返回,避免继续处理命令 return # 必须放在函数内部,处理正常的bot命令 await bot.process_commands(msg)
另外,你的wisdom命令可以简化一下——random.seed(a=None)是多余的,random.choice默认会使用系统时间生成随机种子,删掉这一行即可:
@bot.command(help="Wisdom function", brief="Get a random wise quote") async def wisdom(ctx): responses = open('quotes.txt').read().splitlines() response = random.choice(responses) await ctx.send(f'Hey {ctx.message.author.mention} here is your wisdom:') await ctx.send(response)
内容的提问来源于stack exchange,提问作者DominusOminium
相关产品推荐
相关产品推荐

