You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现discord.py执行命令后删除命令发起者消息?

解决discord.py机器人删除用户命令消息并保留自身消息的问题

没问题,我来帮你搞定这个需求!要实现这个功能,核心是在命令执行后删除用户发送的命令消息,同时保留机器人的回复。下面分两种常见的命令类型来讲解:

一、前缀命令(如!hello这类)

对于传统的前缀命令,实现起来很直接——你可以通过ctx.message.delete()来删除用户的命令消息,同时正常发送机器人的回复即可。需要注意的是,机器人必须拥有管理消息的服务器权限,否则无法删除用户消息,还要处理删除失败的异常情况(比如消息已被删除、无权限等)。

示例代码:

import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True  # 必须开启这个意图才能读取消息内容
bot = commands.Bot(command_prefix="!", intents=intents)

@bot.command()
async def greet(ctx):
    # 尝试删除用户的命令消息
    try:
        await ctx.message.delete()
    except discord.Forbidden:
        # 无权限删除时的提示
        await ctx.send("抱歉,我没有删除消息的权限,请给我开启「管理消息」权限哦!")
        return
    except discord.NotFound:
        # 消息已被删除时的提示
        await ctx.send("你的命令消息已经被删除啦!")
        return
    
    # 发送机器人的回复,这条消息会被保留
    await ctx.send(f"你好呀,{ctx.author.mention}!")

bot.run("你的机器人Token")

二、斜杠命令(如/greet这类)

这里要注意一个关键点:用户触发斜杠命令后,聊天窗口中显示的「[用户] 运行了 /命令」是Discord的系统消息,机器人没有权限删除这类消息。如果你的机器人用的是斜杠命令,目前无法删除这条系统记录,但可以正常保留机器人的回复内容。

如果用户是通过发送包含斜杠的普通消息(不是真正的斜杠交互命令)触发的,那可以参照前缀命令的方式去删除,但这种场景比较少见。

额外注意事项

  • 权限要求:确保机器人在目标服务器中拥有「管理消息」权限,否则删除操作会失败。
  • 消息时效:Discord API不允许删除超过14天的消息,所以如果用户的命令消息是14天前的,delete()方法会抛出异常。

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

火山引擎 最新活动