0

0

如何在 Discord Bot 中正确实现敏感词监听与匹配逻辑

霞舞

霞舞

发布时间:2026-01-24 09:01:42

|

153人浏览过

|

来源于php中文网

原创

如何在 Discord Bot 中正确实现敏感词监听与匹配逻辑

本文详解如何使用 `commands.cog.listener()` 正确监听消息并精准匹配敏感词列表,解决因字符串误解析、循环逻辑错误导致的误删/漏删问题,并提供性能优化与容错增强方案。

在 Discord 机器人开发中,使用 @commands.Cog.listener() 实现敏感词(如违禁词、黑名单词汇)检测是常见需求。但初学者常因对数据类型和字符串匹配逻辑理解偏差,写出看似合理实则行为异常的代码——例如你遇到的问题:['cat', 'dog', 'mouse'] 列表中,'dog' 能触发删除,而 'mouse' 失效;更严重的是,完全无关的词(如 'noob')也被误判删除。

根本原因在于原代码中的关键错误:

for word in ' '.join(x for x in xxx2):  # ❌ 错误:xxx2 是字符串,此循环遍历的是每个字符!

xxx2 经过 .replace('[', '').replace(']', '') 后仍是形如 "cat, dog, mouse" 的字符串,' '.join(x for x in xxx2) 实际生成的是将该字符串逐字符拆分再拼接的结果(如 'c a t , d o g , m o u s e'),后续 for word in ... 实际遍历的是单个字符('c', 'a', ',', ' ' 等)。因此只要消息中包含任意单个字母(如 'n' in 'noob'),就可能意外命中 —— 这正是 'noob' 被误删的根源。

✅ 正确做法是:直接对原始 bwl 列表(应为 list[str])与消息分词结果做集合级存在性判断,而非字符串暴力拆解:

@commands.Cog.listener()
async def on_message(self, message):
    if message.author.bot:
        return

    bwl = GetWF(message.guild.id)  # ✅ 假设此函数返回 list[str],如 ['cat', 'dog', 'mouse']
    if not bwl:  # 更简洁的空值检查
        print("No banned words found for this guild.")
        await self.bot.process_commands(message)  # 注意:应为 self.bot,非全局 client
        return

    # ? 精准匹配:检查消息中是否有任意一个单词完整出现在 bwl 列表中
    words_in_msg = message.content.lower().split()
    if any(word in bwl for word in words_in_msg):
        try:
            await message.delete()
            await message.channel.send(f"`HEY {message.author.name}!\nThat word is banned!`")
        except discord.Forbidden:
            print(f"Missing permissions to delete message in {message.channel}")
        except Exception as e:
            print(f"Unexpected error during message handling: {e}")

    await self.bot.process_commands(message)

关键改进说明:

  • 语义清晰:any(word in bwl for word in words_in_msg) 明确表达“是否存在某个词,它同时在消息分词结果中 在敏感词列表中”。
  • 大小写不敏感:统一转为 .lower(),避免 'Dog' 无法匹配 'dog'。
  • 健壮异常处理:仅捕获明确可预期的异常(如权限不足),避免静默吞掉关键错误。
  • 变量命名规范:words_in_msg 比 xxx/xxx2 更具可读性与可维护性。

⚠️ 进阶注意事项:

  1. 性能瓶颈:GetWF(guild.id) 若每次调用都发起网络请求或数据库查询,将严重拖慢响应。建议在 Cog 初始化时预加载所有服务器的敏感词到内存字典中(如 self.banned_words: dict[int, set[str]]),并在配置更新时热重载。

    koly.club
    koly.club

    一站式社群管理工具

    下载
  2. 匹配精度局限:当前逻辑仅支持完整单词精确匹配。若需支持:

    • 标点兼容(如 'mouse!' → 'mouse'):使用正则提取纯字母单词
      import re
      words_in_msg = re.findall(r'\b[a-zA-Z]+\b', message.content.lower())
    • 词根/模糊匹配(如 'dogs' → 'dog'):需集成 nltk 或 pymorphy2 等 NLP 库进行词形还原(lemmatization)。
    • 子串匹配(如 'tomcat' 包含 'cat'):谨慎使用 any(banned in message.content.lower() for banned in bwl),但极易误伤(如 'class' 包含 'ass'),务必配合上下文白名单或最小长度限制。
  3. 安全边界:永远在 on_message 结尾显式调用 await self.bot.process_commands(message),否则自定义命令将无法被识别。

遵循以上实践,你的敏感词系统将从“不可靠的字符级误判”升级为“稳定、高效、可维护的语义级过滤”,真正满足生产环境需求。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

114

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

168

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

97

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

162

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

151

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

232

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

159

2024.02.23

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

17

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Tomcat核心原理解析
Tomcat核心原理解析

共57课时 | 6.9万人学习

10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号