Discord Python Bot 删除发送者消息功能失效问题求助
解决Discord Bot删除发送者所有消息的问题
嘿,我来帮你搞定这个问题!你的代码没法实现删除功能主要是几个关键问题,我一步步给你梳理和修正:
1. 方法已被废弃
你用的client.logs_from是旧版discord.py(v0.16.x)里的方法,现在新版本(v1.0及以上)早就把它移除了,官方推荐用channel.history()来替代,这是当前的标准写法。
2. 参数传递错误
就算是在旧版里,你的参数顺序也不对——logs_from的第二个参数是limit(获取消息的数量限制),要指定作者得用关键字参数author=message.author。不过既然新版本已经不用这个方法了,我们直接用新的写法就行。
3. 权限与异常处理不能少
别忘了给你的Bot开启管理消息的权限,不然就算代码对了也删不了消息。另外,加上异常处理能避免Bot因为一些意外情况(比如消息已经被删除、权限不足)直接崩溃。
修正后的完整代码
import discord from discord.ext import commands client = commands.Bot(command_prefix="!") # 这里可以自定义你的命令前缀 @client.event async def on_message(message): # 跳过Bot自己的消息,避免触发循环 if message.author == client.user: return if message.content.startswith('Delete me.'): # 遍历当前频道的历史消息,筛选出命令发送者的所有消息 async for msg in message.channel.history(limit=None, author=message.author): try: await msg.delete() except discord.Forbidden: print(f"权限不足,无法删除消息") except discord.NotFound: print(f"这条消息已经被删除了,跳过") except discord.HTTPException: print(f"删除消息时遇到网络错误") client.run("你的Bot令牌")
关键细节说明
message.channel.history(limit=None):limit=None会尝试获取频道的全部历史消息(受Discord API限制,最多能获取最近的100条左右,实际是分页获取,但一般娱乐场景下这个足够用了)- 异常处理:覆盖了最常见的几种错误情况,确保Bot能稳定运行
- 跳过Bot自身消息:防止Bot误删自己的消息,避免不必要的循环
如果你更习惯用命令式的写法(比如用户发!deleteme触发),也可以写成这样:
import discord from discord.ext import commands bot = commands.Bot(command_prefix="!") @bot.command(name="deleteme") async def delete_own_messages(ctx): async for msg in ctx.channel.history(limit=None, author=ctx.author): try: await msg.delete() except Exception as e: print(f"删除消息失败:{str(e)}") bot.run("你的Bot令牌")
这样用户发送!deleteme就能触发删除自己所有消息的功能,比用消息前缀触发更规范哦。
内容的提问来源于stack exchange,提问作者Narae Choi




