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

discord.js如何删除包含特定emoji的消息以解决关键词拦截被绕过问题?

解决方案

失效原因

你之前的匹配逻辑不生效,核心是对Discord API返回的消息内容格式认知偏差:

  • :regional_indicator_u: 这类是客户端显示用的短代码,API返回的消息内容里,原生unicode emoji(包括区域指示符)会直接以unicode字符形式存在,不会传输短代码
  • 直接复制粘贴emoji容易引入不可见修饰字符,或者受不同系统编码渲染影响导致匹配失效

具体实现步骤

  • 优先使用固定unicode码点定义需要匹配的区域指示符字符,避免编码问题:
    • 区域指示符U:\U0001f1fa
    • 区域指示符W:\U0001f1fc
    • 区域指示符O:\U0001f1f4
    • 区域指示符V:\U0001f1fb
  • 匹配时允许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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:57:00