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

Discord客户端与Discord.py的mention判定规则不一致问题咨询

格式差异产生原因

Discord用户提及字符串中的!是旧版昵称标记:

  • 早期Discord版本中,设置了服务器专属昵称的用户,提及格式会自动携带!,即<@![用户ID]>,未设置昵称的用户提及格式为<@[用户ID]>
  • 后续Discord做了格式兼容优化,两种字符串发送后都可以正常触发提及通知,但不同接口的返回格式没有统一:user.mention属性固定返回不带!的标准格式,而从客户端消息原始内容中获取的提及字符串可能保留!标记,因此直接对比字符串会匹配失败。
解决方法

方案1:提取ID匹配(推荐)

完全避开格式差异问题,直接从输入字符串中提取用户ID,再校验ID是否属于服务器有效用户,同时匹配效率远高于遍历全量用户:

import re

# 正则自动兼容带/不带!的mention格式,提取用户ID
MENTION_PATTERN = re.compile(r'^<@!?(\d+)>$')

def validUser(string):
    match_result = MENTION_PATTERN.fullmatch(string)
    if not match_result:
        return False
    target_id = int(match_result.group(1))
    for guild in bot.guilds:
        # get_member是O(1)查询,效率远高于遍历members列表
        if guild.get_member(target_id):
            return True
    return False

方案2:统一格式后匹配

如果需要保留原有匹配逻辑,可以先将输入字符串的格式统一后再对比:

def validUser(string):
    # 替换所有<@!为<@,消除格式差异
    formatted_input = string.replace("<@!", "<@")
    for guild in bot.guilds:
        for user in guild.members:
            if user.mention == formatted_input:
                return True
    return False

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:54:03