如何让机器人仅响应直接@提及或回复,排除@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("收到你的指令啦!")
关键说明
message.mentions:仅存储被用户直接@的用户对象,完全避开@everyone/@here的干扰,是判断直接提及的可靠方式。- 回复判断的异常处理:加入
try-except是为了应对被回复的原消息已被删除、或权限不足无法获取的情况,避免机器人报错。 - 先排除自身消息:防止机器人响应自己发送的消息,造成不必要的循环。
内容的提问来源于stack exchange,提问作者Yozy Opto
相关产品推荐
相关产品推荐

