如何使用Discord机器人的logs_from生成器删除8月的所有消息?
解决Discord机器人删除8月所有消息的日期格式问题
嘿,我来帮你搞定这个问题!首先得纠正一个小误解:logs_from(或者新版本里的history)的around参数是用来获取某个时间点附近的指定数量消息的,如果你要删除整个8月的所有消息,只用它可不行,得结合after和before参数来限定整个8月的时间范围才行。不过先回答你最关心的日期格式问题:
这个参数需要的不是字符串,而是Python的datetime.datetime对象——也就是你得先构造一个具体的时间对象,而不是直接写"2024-08-01"这种字符串。
正确的实现步骤
- 首先导入Python的
datetime模块,用来构造时间范围。 - 定义8月的起始和结束时间:比如2024年8月的话,起始是8月1日0点,结束是9月1日0点(这样就能覆盖整个8月的所有时间)。
- 用
after和before参数过滤出这个时间段内的所有消息,再批量删除。
修改后的代码示例
旧版discord.py(使用logs_from)
import datetime from discord.ext import commands @Client.command(pass_context=True) async def clear_august(ctx): # 构造2024年8月的时间范围(UTC时间) august_start = datetime.datetime(2024, 8, 1, 0, 0, 0) september_start = datetime.datetime(2024, 9, 1, 0, 0, 0) messages_to_delete = [] # 遍历频道中8月的所有消息 async for msg in Client.logs_from(ctx.message.channel, after=august_start, before=september_start): messages_to_delete.append(msg) # 执行批量删除 if messages_to_delete: await Client.delete_messages(messages_to_delete) await ctx.send(f"搞定!已删除{len(messages_to_delete)}条8月的消息") else: await ctx.send("没找到8月的消息哦")
新版discord.py(推荐用history,因为logs_from已被弃用)
import datetime from discord.ext import commands @Client.command() async def clear_august(ctx): # 构造2024年8月的时间范围(UTC时间) august_start = datetime.datetime(2024, 8, 1, 0, 0, 0) september_start = datetime.datetime(2024, 9, 1, 0, 0, 0) messages_to_delete = [] # 遍历频道中8月的所有消息,limit=None表示获取所有符合条件的消息 async for msg in ctx.channel.history(after=august_start, before=september_start, limit=None): messages_to_delete.append(msg) # 执行批量删除 if messages_to_delete: await ctx.channel.delete_messages(messages_to_delete) await ctx.send(f"搞定!已删除{len(messages_to_delete)}条8月的消息") else: await ctx.send("没找到8月的消息哦")
关键注意点
- 时区问题:Discord API默认使用UTC时间,如果你的服务器是其他时区(比如东八区),需要调整时间。比如东八区的8月1日0点,对应的UTC时间是7月31日16点,这时候你要把
august_start改成datetime.datetime(2024, 7, 31, 16, 0, 0),才能准确获取本地时区的8月消息。 - 批量删除限制:Discord只允许批量删除14天以内的消息,如果8月的消息已经超过14天,批量删除会失败,只能逐条删除(但效率很低,还可能触发API限流)。
- 权限要求:确保你的机器人拥有
manage_messages权限,否则无法执行删除操作。
关于around参数的补充
如果你确实需要用around参数(比如只想获取8月中旬附近的消息),直接传入datetime对象就行,比如:
# 获取2024年8月15日中午12点附近的100条消息 async for x in Client.logs_from(ctx.message.channel, limit=100, around=datetime.datetime(2024,8,15,12,0,0)): # 处理消息
内容的提问来源于stack exchange,提问作者Myronaz
相关产品推荐
相关产品推荐

