discord.py开发中如何删除用户发送的命令消息?
discord.py 触发命令后自动删除用户命令消息的实现方案
首先修正你现有代码的错误点:commands.command 装饰的命令函数第一个参数是 Context(上下文)对象,不是消息对象,用户发送的命令消息存储在该上下文的 message 属性中。
单命令单独配置删除逻辑
如果只需要部分命令触发后删除用户消息,直接在对应命令函数内添加删除逻辑即可,注意捕获权限异常:
import os import discord from discord.ext import commands intents = discord.Intents.default() intents.members = True # discord.py v2.0+ 必须开启消息内容意图才能识别前缀命令 intents.message_content = True client = commands.Bot(command_prefix = '.', intents = intents) @client.command(pass_context=True) async def myCmd(ctx): # 删除用户发送的命令消息 try: await ctx.message.delete() except discord.Forbidden: # 无删除消息权限时的兜底提示,delete_after参数表示提示消息3秒后自动删除 await ctx.send("我没有删除消息的权限,请先授予对应权限", delete_after=3) return # 你的业务回复逻辑 await ctx.send('Something') client.run("你的机器人Token")
全局命令统一配置删除逻辑
如果希望所有前缀命令触发后都自动删除用户的命令消息,可以通过on_command事件全局处理,不需要每个命令单独编写删除代码:
@client.event async def on_command(ctx): # 所有命令触发时先执行该逻辑 try: await ctx.message.delete() except discord.Forbidden: await ctx.send("缺少删除消息权限,无法清理命令消息", delete_after=2)
注意事项
- 你需要在Discord开发者后台的机器人设置页面开启
Message Content Intent权限,discord.py v2.0及以上版本必须开启该权限才能正常识别用户发送的前缀命令 - 机器人必须在对应服务器拥有「管理消息」权限,才能删除其他用户发送的消息
- 兜底提示添加
delete_after参数可以自动清理提示消息,避免刷屏
内容的提问来源于stack exchange,提问作者Ale
相关产品推荐
相关产品推荐

