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

在discord.py中如何获取使用指令时所回复的消息的ID

问题修正与实现方案

你原有代码的核心问题是直接修改ctx.message.id属于无效操作,discord.py不允许修改消息实例的固有ID属性,ctx.message本身就是你触发指令的那条消息,无法通过改ID的方式指向其他消息。

仅支持回复消息触发的版本

这个版本无需手动输入消息ID,回复任意消息发送指令即可自动给被回复的消息加表情:

@bot.command()
async def heart(ctx):
    # 校验触发指令的消息是否为回复消息
    if not ctx.message.reference:
        await ctx.send("请回复一条消息后使用该指令", delete_after=5)
        return
    # 获取被回复的目标消息对象
    target_msg = await ctx.fetch_message(ctx.message.reference.message_id)
    # 添加表情反应
    await target_msg.add_reaction("💖")
    # 可选:自动删除触发指令的消息,保持聊天整洁
    await ctx.message.delete()

兼容手动输入ID的扩展版本

如果需要保留原有手动传ID的用法,可以用这个同时支持两种触发方式的版本:

@bot.command()
async def heart(ctx, msgid: int = None):
    target_msg = None
    # 优先使用回复关联的消息
    if ctx.message.reference:
        target_msg = await ctx.fetch_message(ctx.message.reference.message_id)
    # 没有回复时尝试读取传入的消息ID
    elif msgid:
        try:
            target_msg = await ctx.fetch_message(msgid)
        except:
            await ctx.send("输入的消息ID无效", delete_after=5)
            return
    else:
        await ctx.send("请回复一条消息或传入合法消息ID后使用指令", delete_after=5)
        return
    await target_msg.add_reaction("💖")
    await ctx.message.delete()

核心逻辑说明

  • ctx.message.reference存储了当前消息回复的关联信息,如果当前消息是回复消息,就可以通过reference.message_id拿到被回复消息的ID
  • 用ctx.fetch_message(消息ID)可以获取对应ID的消息实例,调用实例的add_reaction方法即可添加表情

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:54:04