如何用discord.py的commands.check()判断Discord消息是否为回复以触发指令
问题排查与修复方案
你代码存在三个核心问题,逐一修正后即可实现需求:
- 未启用消息内容意图:discord.py v2.0及以上版本默认关闭普通消息内容读取权限,你需要同时完成两处配置:
- 在Discord开发者平台的对应机器人设置页面,开启「Message Content Intent」开关
- 在代码中显式声明启用该意图
- 校验函数返回值不规范:你当前返回的是整数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")
测试方法
- 回复任意一条消息,发送
$my_command,机器人会返回成功提示 - 直接发送
$my_command不回复任何消息,机器人会返回指令使用限制提示
内容的提问来源于stack exchange,提问作者CodeIsLaw
相关产品推荐
相关产品推荐

