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

discord.py违禁词automod功能禁言触发计数器逻辑异常问题求助

问题原因

你的逻辑错误来自两个核心问题:

  • counter变量的作用域和赋值逻辑完全错误:你每次检测到违禁词时都会先执行counter = 0将变量重置为0,紧接着执行counter +=1,这就导致counter的值永远只能是1,没有任何累计效果。同时counter是on_message事件内的局部变量,每次事件触发都会生成新的局部变量,根本无法跨消息累计同一个用户的违禁次数。
  • 判断逻辑匹配错误:你当前用if counter <3作为禁言触发条件,结合counter永远等于1的情况,自然第一次触发违禁词就会满足条件直接禁言;如果换成if counter>3,counter永远是1不可能大于3,自然永远不会触发。

修正方案

你需要先定义一个全局的字典结构存储每个用户的违禁次数,再调整计数、判断的逻辑顺序,修正后的参考代码如下:

import discord
import datetime

filtered_words = ["bad", "words", "here"]
# 全局存储用户违禁次数,key为用户id,value为累计次数
user_violation_count = {}
# 禁言阈值
MUTE_THRESHOLD = 3
# 日志频道ID,请替换为实际值
CHANNEL_ID_HERE = 123456789 

@client.event
async def on_message(message):
    # 跳过机器人自己发的消息,避免循环触发
    if message.author.bot:
        return
    for word in filtered_words:
        if word in message.content.lower():
            await message.delete()
            # 累计用户违禁次数
            user_id = message.author.id
            if user_id not in user_violation_count:
                user_violation_count[user_id] = 0
            user_violation_count[user_id] += 1
            
            # 发送违规日志
            embed = discord.Embed(color=0xff0000)
            embed.set_author(name="Banned Word")
            embed.add_field(name="Username:", value=f"{message.author.mention}", inline=False)
            embed.add_field(name="Banned Word:", value=f"{word}", inline=False)
            embed.add_field(name="Message:", value=f"{message.content}", inline=False)
            embed.add_field(name="累计违禁次数:", value=f"{user_violation_count[user_id]}", inline=False)
            embed.set_footer(text=f'User ID: {message.author.id}')
            embed.timestamp = datetime.datetime.utcnow()
            channel = client.get_channel(CHANNEL_ID_HERE)
            await channel.send(embed=embed)
            
            # 达到阈值触发禁言
            if user_violation_count[user_id] >= MUTE_THRESHOLD:
                role = discord.utils.get(message.guild.roles, name="Muted")
                await message.channel.send(f'{message.author.mention} 因多次发送违禁内容被禁言')
                await message.author.add_roles(role)
                # 可选:禁言后重置该用户的计数
                # user_violation_count[user_id] = 0
            # 匹配到违禁词后直接跳出循环,避免同一条消息多个违禁词重复计数
            break

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:36:03