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

如何用discord.py的commands.check()判断Discord消息是否为回复以触发指令

问题排查与修复方案

你代码存在三个核心问题,逐一修正后即可实现需求:

  • 未启用消息内容意图:discord.py v2.0及以上版本默认关闭普通消息内容读取权限,你需要同时完成两处配置:
    1. 在Discord开发者平台的对应机器人设置页面,开启「Message Content Intent」开关
    2. 在代码中显式声明启用该意图
  • 校验函数返回值不规范:你当前返回的是整数0/1,虽然Python会隐式转换为布尔值,但官方要求check类函数显式返回布尔值,避免隐式转换带来的不可预期问题
  • 缺少校验失败异常处理:当check校验不通过时会抛出commands.CheckFailure异常,若没有全局异常捕获逻辑,校验失败时程序会直接报错,不会返回任何响应,你也无法定位问题根源

修正后完整代码
import discord
from discord.ext import commands

# 启用必要的意图
intents = discord.Intents.default()
intents.message_content = True # 必须开启,否则机器人无法读取普通消息的文本内容

client = commands.Bot(command_prefix = '$', intents=intents)

# 校验函数修改为返回布尔值
def check_if_message_is_reply(ctx):
    return ctx.message.reference is not None

# 指令定义直接用@client.command更简洁,无需额外add_command
@client.command()
@commands.check(check_if_message_is_reply)
async def my_command(ctx):
    await ctx.send('Command worked, you used a reply')

# 全局捕获校验失败异常,可选添加友好提示
@client.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.CheckFailure):
        await ctx.send("该指令仅可在回复其他消息时使用")
    # 其他异常可以按需添加处理逻辑

# 填入你的机器人token运行即可
client.run("你的机器人Token")

测试方法
  1. 回复任意一条消息,发送$my_command,机器人会返回成功提示
  2. 直接发送$my_command不回复任何消息,机器人会返回指令使用限制提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:06:03