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

Discord.py中ctx.message.mentions在提及对象后跟随字符串时无法正常识别的问题咨询

关于Discord.py中ctx.message.mentions在提及后有额外文本时失效的问题

首先可以明确说:这不是ctx.message.mentions的预期行为——Discord.py的这个属性是直接从Discord API返回的解析结果,只要消息里包含有效的用户提及(比如标准的<@用户ID>格式,也就是你输入的@MEE6),不管提及前后有没有额外文本,它都应该能正确提取到对应的用户对象。

为什么你会遇到这个问题?

大概率是你的代码处理逻辑出了问题,常见的坑有这几个:

  • 你可能对消息文本做了不必要的截断或过滤,比如用split()只取了命令后的第一个元素,然后错误地认为只有当提及是命令后的唯一内容时才有效,但实际上ctx.message.mentions是独立于你对文本的分割操作的。
  • 有没有在代码里修改过ctx.message或者覆盖了mentions属性?比如某些自定义的消息预处理逻辑干扰了原始的解析结果。
  • 你是不是误把消息文本里的字符串和mentions混淆了?比如试图从文本里匹配@开头的字符串,而没有直接使用已经解析好的mentions列表。

正确的用法示例

举个简单的ban命令实现,不管你输入ban @MEE6还是ban @MEE6 please,都能正确获取提及用户:

@bot.command(name="ban")
async def ban_command(ctx):
    # 检查mentions列表是否非空
    if not ctx.message.mentions:
        await ctx.send("请在命令后提及要封禁的用户哦!")
        return
    # 取第一个提及的用户(如果有多个也可以循环处理)
    target_user = ctx.message.mentions[0]
    # 这里写你的封禁逻辑
    await ctx.send(f"已准备封禁用户:{target_user.display_name}(ID:{target_user.id})")

排查建议

  1. 先在命令里加一行调试代码,直接打印ctx.message.mentions:
    print(f"提及的用户列表:{ctx.message.mentions}")
    
    运行后输入ban @MEE6 please,看看控制台输出的列表里有没有MEE6的用户对象。如果有,那就是你后续的逻辑没用到这个列表;如果没有,再检查你的机器人权限或者Discord.py版本(确保是较新的稳定版,旧版本可能有bug)。
  2. 检查有没有其他代码(比如自定义的事件监听、装饰器)修改了消息的原始数据,导致mentions被清空。
  3. 确认你输入的@MEE6是真正的用户提及——在Discord里输入@后选择用户生成的提及,不是手动输入的@MEE6字符串(手动输入的纯文本不会被识别为有效提及)。

总结

ctx.message.mentions的设计就是为了帮你跳过文本解析的麻烦,直接获取消息里的所有有效用户提及,和提及前后的文本无关。你遇到的问题基本可以确定是代码处理逻辑的疏漏,按照上面的排查步骤应该能很快找到问题所在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:52:41