You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Discord机器人的logs_from生成器删除8月的所有消息?

解决Discord机器人删除8月所有消息的日期格式问题

嘿,我来帮你搞定这个问题!首先得纠正一个小误解:logs_from(或者新版本里的history)的around参数是用来获取某个时间点附近的指定数量消息的,如果你要删除整个8月的所有消息,只用它可不行,得结合after和before参数来限定整个8月的时间范围才行。不过先回答你最关心的日期格式问题:

这个参数需要的不是字符串,而是Python的datetime.datetime对象——也就是你得先构造一个具体的时间对象,而不是直接写"2024-08-01"这种字符串。

正确的实现步骤

  1. 首先导入Python的datetime模块,用来构造时间范围。
  2. 定义8月的起始和结束时间:比如2024年8月的话,起始是8月1日0点,结束是9月1日0点(这样就能覆盖整个8月的所有时间)。
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:51:13