discord.js如何删除包含特定emoji的消息以解决关键词拦截被绕过问题?
解决方案
失效原因
你之前的匹配逻辑不生效,核心是对Discord API返回的消息内容格式认知偏差:
:regional_indicator_u:这类是客户端显示用的短代码,API返回的消息内容里,原生unicode emoji(包括区域指示符)会直接以unicode字符形式存在,不会传输短代码- 直接复制粘贴emoji容易引入不可见修饰字符,或者受不同系统编码渲染影响导致匹配失效
具体实现步骤
- 优先使用固定unicode码点定义需要匹配的区域指示符字符,避免编码问题:
- 区域指示符U:
\U0001f1fa - 区域指示符W:
\U0001f1fc - 区域指示符O:
\U0001f1f4 - 区域指示符V:
\U0001f1fb
- 区域指示符U:
- 匹配时允许emoji之间存在任意空白字符(包括空格、零宽空格等用户常用的绕过手段),可以用正则表达式的空白匹配规则处理
- 如果需要拦截单独的指定emoji,直接将对应unicode码点加入违禁匹配列表即可,无需判断组合
代码示例(基于discord.py)
import re # 预定义违禁的emoji组合正则,允许元素间存在任意空白 BANNED_PATTERNS = [ # 匹配emoji拼写的uwu re.compile(r'\U0001f1fa\s*\U0001f1fc\s*\U0001f1fa', re.UNICODE), # 匹配emoji拼写的owo re.compile(r'\U0001f1f4\s*\U0001f1fc\s*\U0001f1f4', re.UNICODE), # 匹配emoji拼写的uvu re.compile(r'\U0001f1fa\s*\U0001f1fb\s*\U0001f1fa', re.UNICODE) ] async def on_message(message): # 跳过bot自身发送的消息 if message.author == bot.user: return # 匹配违禁内容 for pattern in BANNED_PATTERNS: if pattern.search(message.content): # 删除命中的消息 await message.delete() # 可自行追加警告、禁言等后续逻辑 return await bot.process_commands(message)
内容的提问来源于stack exchange,提问作者user17534832
相关产品推荐
相关产品推荐

