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
相关产品推荐
相关产品推荐

