commands.Cog.listener()函数异常行为排查与修正求助
问题分析与解决方案
核心问题点
- 违禁词遍历逻辑错误:原代码将违禁词列表转成字符串后拆分单个字符遍历,而非直接遍历列表中的完整单词,导致检测逻辑完全偏离预期。
- 提前终止检查:遍历过程中只要遇到不匹配的词就直接
return,导致后续违禁词无法被检测,比如mouse会因为前面的cat不匹配而跳过检查。 - 误触发删除:由于遍历单个字符,任何包含违禁词中单个字符的消息都会被误删,比如
noob中的o存在于dog中,因此被误删。
修正后的代码实现
@commands.Cog.listener() async def on_message(self, message): if message.author.bot: return bwl = GetWF(message.guild.id) # 获取对应服务器的违禁词列表 if bwl is not None: try: # 直接遍历违禁词列表中的每个单词 for word in bwl: # 检查消息内容是否包含违禁词(可根据需求改为全词匹配) if word.lower() in message.content.lower(): await message.delete() await message.channel.send(f"`HEY {message.author.name}!\nThat word is banned!`") # 找到违禁词后跳出循环,避免重复发送提示 break except Exception as e: print(f"检测违禁词时出错: {e}") else: print("未找到该服务器的违禁词列表") await client.process_commands(message)
关键优化说明
- 直接遍历违禁词列表:无需对列表做多余的字符串转换,直接遍历
bwl中的每个完整单词,保证检测对象正确。 - 移除错误的
return:仅在找到违禁词并处理后break循环,而非遇到不匹配就终止,确保所有违禁词都能被检查。 - 大小写不敏感检测:使用
lower()统一转换为小写,避免因大小写差异导致漏检(如Mouse和mouse都会被检测)。 - 异常处理优化:添加错误打印,便于排查问题,而非静默返回。
内容的提问来源于stack exchange,提问作者Roy Eastman-Kodak
相关产品推荐
相关产品推荐

