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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:17:39