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

