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

