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

如何让机器人仅响应直接@提及或回复,排除@everyone/@here?

解决Discord机器人仅响应直接@提及或回复的问题

你遇到的问题是因为mentioned_in()会将@everyone、@here这类全局提及也判定为机器人被提及——这类提及会覆盖所有成员(包括机器人)。要实现仅响应直接@机器人或回复机器人的消息,可以通过以下方式处理:

核心判断逻辑

我们需要分两种情况验证:

  • 消息中直接@了机器人:使用message.mentions列表判断,该列表仅包含被明确@的用户,不会包含@everyone/@here对应的特殊实体。
  • 消息是对机器人消息的回复:检查消息是否存在回复引用,再验证被回复的原消息作者是否为机器人。

完整代码示例

@client.event
async def on_message(message):
    # 忽略机器人自身发送的消息,避免循环触发
    if message.author == client.user:
        return

    # 判断是否为直接@机器人
    is_direct_mention = client.user in message.mentions

    # 判断是否为回复机器人的消息
    is_reply_to_bot = False
    if message.reference:
        try:
            # 获取被回复的原消息
            referenced_msg = await message.channel.fetch_message(message.reference.message_id)
            is_reply_to_bot = referenced_msg.author == client.user
        except:
            # 若原消息已被删除或无法获取,跳过该判断
            pass

    # 满足任一条件则触发响应
    if is_direct_mention or is_reply_to_bot:
        # 这里替换为你的机器人响应逻辑
        await message.channel.send("收到你的指令啦!")

关键说明

  1. message.mentions:仅存储被用户直接@的用户对象,完全避开@everyone/@here的干扰,是判断直接提及的可靠方式。
  2. 回复判断的异常处理:加入try-except是为了应对被回复的原消息已被删除、或权限不足无法获取的情况,避免机器人报错。
  3. 先排除自身消息:防止机器人响应自己发送的消息,造成不必要的循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:27:07