You need to enable JavaScript to run this app. Discord.py 如何配置消息检测规则仅捕获回复类型消息
优惠活动
大模型
产品
解决方案
定价
更多

Discord.py 如何配置消息检测规则仅捕获回复类型消息

仅捕获回复类消息的实现方案

discord.py原生API完全支持这类检测逻辑,不需要引入额外依赖。你当前代码的核心问题是自定义的check函数没有做任何过滤,直接返回消息对象,会无差别捕获频道内所有收到的消息,无法区分消息是否为回复类型。

核心判断依据

在discord.py的消息模型规则中,只要是用户通过Discord客户端的「回复」功能发出的消息,都会携带非空的reference属性;用户手动输入的无引用普通消息,该属性值为None。依靠这个原生属性做过滤,就能精准识别真正的回复类消息,不会把用户手动输入包含“回复”字样的普通消息误判为回复。

check函数需要补充的过滤条件

除了判断消息是否为回复类型,还需要加几个边界过滤,避免逻辑误触发:

  • 限定仅接收当前命令所在频道的消息,排除其他频道的消息干扰
  • 过滤掉机器人自身发送的消息,避免逻辑死循环
  • 可选开启精准匹配:仅接收针对当前bot发送的测试消息的回复内容

改造后的完整代码

@bot.command()
async def replyTest(ctx):
    # 保存bot发出的测试消息对象,用于后续精准匹配
    sent_bot_msg = await ctx.send('Reply to this message')
    def check(m):
        # 基础判断:消息属于回复类型
        is_reply = m.reference is not None
        # 频道匹配:仅接收当前频道的消息
        same_channel = m.channel == ctx.channel
        # 作者过滤:排除机器人自身发送的消息
        not_bot_author = not m.author.bot
        # 可选精准匹配:仅接收回复刚才bot发的测试消息的内容,增加判空避免原消息被删除时报错
        # target_matched = (m.reference.resolved is not None) and (m.reference.resolved.id == sent_bot_msg.id)
        
        # 组合判断条件,开启精准匹配时把target_matched加入返回逻辑即可
        return is_reply and same_channel and not_bot_author
        # 开启精准匹配后的返回逻辑:
        # return is_reply and same_channel and not_bot_author and target_matched
    msg = await bot.wait_for("message", check=check)
    print(msg)

实操注意点

  • 不要靠消息文本内容判断是否为回复,必须使用SDK提供的原生reference属性,识别准确率100%
  • 在多机器人共存的服务器场景,一定要加上作者过滤条件,避免其他机器人发送的消息被误捕获
  • 如果开启了精准匹配被回复消息ID的逻辑,必须加上reference.resolved的非空判断,防止被引用的原消息被删除后触发空值报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 23:27:03